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
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
1"""Tests for pytest output parsing functions."""
3from __future__ import annotations
5from assertpy import assert_that
7from lintro.parsers.pytest.pytest_parser import (
8 extract_pytest_summary,
9 parse_pytest_output,
10)
12# =============================================================================
13# Tests for extract_pytest_summary function
14# =============================================================================
17def test_extract_summary_all_passed(
18 mock_test_success_output: str,
19) -> None:
20 """Extract summary from all-passed output.
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)
32def test_extract_summary_with_failures(
33 mock_test_failure_output: str,
34) -> None:
35 """Extract summary from output with failures.
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)
46def test_extract_summary_mixed_results(
47 mock_test_mixed_output: str,
48) -> None:
49 """Extract summary from mixed results output.
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)
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)
71# =============================================================================
72# Tests for parse_pytest_output format dispatch
73# =============================================================================
76def test_dispatch_json_format(mock_test_json_failure: str) -> None:
77 """Dispatch to JSON parser when format is json.
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)
86def test_dispatch_junit_format(mock_test_junit_xml_failure: str) -> None:
87 """Dispatch to JUnit parser when format is junit.
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)
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)
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)