Coverage for tests / unit / tools / pytest_tool / test_output_parsing.py: 100%

41 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-04-03 18:53 +0000

1"""Tests for pytest output parsing functions.""" 

2 

3from __future__ import annotations 

4 

5from assertpy import assert_that 

6 

7from lintro.parsers.pytest.pytest_parser import ( 

8 extract_pytest_summary, 

9 parse_pytest_output, 

10) 

11 

12# ============================================================================= 

13# Tests for extract_pytest_summary function 

14# ============================================================================= 

15 

16 

17def test_extract_summary_all_passed( 

18 mock_test_success_output: str, 

19) -> None: 

20 """Extract summary from all-passed output. 

21 

22 Args: 

23 mock_test_success_output: Mock pytest output string for successful tests. 

24 """ 

25 summary = extract_pytest_summary(mock_test_success_output) 

26 assert_that(summary.passed).is_equal_to(10) 

27 assert_that(summary.failed).is_equal_to(0) 

28 assert_that(summary.skipped).is_equal_to(0) 

29 assert_that(summary.duration).is_close_to(0.12, tolerance=0.01) 

30 

31 

32def test_extract_summary_with_failures( 

33 mock_test_failure_output: str, 

34) -> None: 

35 """Extract summary from output with failures. 

36 

37 Args: 

38 mock_test_failure_output: Mock pytest output string with test failures. 

39 """ 

40 summary = extract_pytest_summary(mock_test_failure_output) 

41 assert_that(summary.passed).is_equal_to(9) 

42 assert_that(summary.failed).is_equal_to(1) 

43 assert_that(summary.duration).is_close_to(0.15, tolerance=0.01) 

44 

45 

46def test_extract_summary_mixed_results( 

47 mock_test_mixed_output: str, 

48) -> None: 

49 """Extract summary from mixed results output. 

50 

51 Args: 

52 mock_test_mixed_output: Mock pytest output string with mixed test results. 

53 """ 

54 summary = extract_pytest_summary(mock_test_mixed_output) 

55 assert_that(summary.passed).is_equal_to(15) 

56 assert_that(summary.failed).is_equal_to(2) 

57 assert_that(summary.skipped).is_equal_to(2) 

58 assert_that(summary.error).is_equal_to(1) 

59 assert_that(summary.duration).is_close_to(1.50, tolerance=0.01) 

60 

61 

62def test_extract_summary_empty_output() -> None: 

63 """Extract summary from empty output returns defaults.""" 

64 summary = extract_pytest_summary("") 

65 assert_that(summary.passed).is_equal_to(0) 

66 assert_that(summary.failed).is_equal_to(0) 

67 assert_that(summary.skipped).is_equal_to(0) 

68 assert_that(summary.duration).is_equal_to(0.0) 

69 

70 

71# ============================================================================= 

72# Tests for parse_pytest_output format dispatch 

73# ============================================================================= 

74 

75 

76def test_dispatch_json_format(mock_test_json_failure: str) -> None: 

77 """Dispatch to JSON parser when format is json. 

78 

79 Args: 

80 mock_test_json_failure: Mock pytest JSON output string with test failures. 

81 """ 

82 issues = parse_pytest_output(mock_test_json_failure, format="json") 

83 assert_that(issues).is_length(1) 

84 

85 

86def test_dispatch_junit_format(mock_test_junit_xml_failure: str) -> None: 

87 """Dispatch to JUnit parser when format is junit. 

88 

89 Args: 

90 mock_test_junit_xml_failure: Mock pytest JUnit XML output string with test failures. 

91 """ 

92 issues = parse_pytest_output(mock_test_junit_xml_failure, format="junit") 

93 assert_that(issues).is_length(1) 

94 

95 

96def test_dispatch_text_format() -> None: 

97 """Dispatch to text parser when format is text.""" 

98 output = "FAILED tests/test_example.py::test_failure - AssertionError" 

99 issues = parse_pytest_output(output, format="text") 

100 assert_that(issues).is_length(1) 

101 

102 

103def test_default_format_is_text() -> None: 

104 """Default format is text.""" 

105 output = "FAILED tests/test_example.py::test_failure - AssertionError" 

106 issues = parse_pytest_output(output) 

107 assert_that(issues).is_length(1)