Coverage for tests / unit / utils / result_formatters / test_pytest_output.py: 100%
40 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 handling in print_tool_result."""
3from __future__ import annotations
5from typing import TYPE_CHECKING, Any
7import pytest
8from assertpy import assert_that
10from lintro.utils.result_formatters import print_tool_result
12if TYPE_CHECKING:
13 from collections.abc import Callable
16def test_pytest_with_output_displays_header(
17 console_capture_with_kwargs: tuple[
18 Callable[..., None],
19 list[tuple[str, dict[str, Any]]],
20 ],
21 success_capture: tuple[Callable[[str], None], list[str]],
22) -> None:
23 """Verify pytest output includes test results header and separator.
25 Args:
26 console_capture_with_kwargs: Mock console output capture with kwargs.
27 success_capture: Mock success message capture.
28 """
29 mock_console, console_output = console_capture_with_kwargs
30 mock_success, _ = success_capture
32 print_tool_result(
33 console_output_func=mock_console,
34 success_func=mock_success,
35 tool_name="pytest",
36 output="test_example.py::test_one PASSED",
37 issues_count=0,
38 )
40 texts = [t for t, _ in console_output]
41 assert_that(texts).contains("🧪 Test Results")
42 assert_that(texts).contains("-" * 20)
45def test_pytest_no_issues_no_output_shows_success(
46 console_capture_with_kwargs: tuple[
47 Callable[..., None],
48 list[tuple[str, dict[str, Any]]],
49 ],
50 success_capture: tuple[Callable[[str], None], list[str]],
51) -> None:
52 """Verify success message displayed for pytest with no issues and empty output.
54 Args:
55 console_capture_with_kwargs: Mock console output capture with kwargs.
56 success_capture: Mock success message capture.
57 """
58 mock_console, _ = console_capture_with_kwargs
59 mock_success, success_calls = success_capture
61 print_tool_result(
62 console_output_func=mock_console,
63 success_func=mock_success,
64 tool_name="pytest",
65 output="",
66 issues_count=0,
67 )
69 assert_that(success_calls).contains("✓ No issues found.")
72def test_pytest_filters_json_output_at_line_start(
73 console_capture_with_kwargs: tuple[
74 Callable[..., None],
75 list[tuple[str, dict[str, Any]]],
76 ],
77 success_capture: tuple[Callable[[str], None], list[str]],
78) -> None:
79 """Verify standalone JSON lines at start are filtered from pytest output.
81 Args:
82 console_capture_with_kwargs: Mock console output capture with kwargs.
83 success_capture: Mock success message capture.
84 """
85 mock_console, console_output = console_capture_with_kwargs
86 mock_success, _ = success_capture
88 output = '{"key": "value"}\nMore text'
90 print_tool_result(
91 console_output_func=mock_console,
92 success_func=mock_success,
93 tool_name="pytest",
94 output=output,
95 issues_count=0,
96 )
98 texts = [
99 t for t, _ in console_output if t and t not in ("🧪 Test Results", "-" * 20, "")
100 ]
101 combined = "\n".join(texts)
102 assert_that(combined).contains("More text")
105def test_pytest_preserves_progress_markers(
106 console_capture_with_kwargs: tuple[
107 Callable[..., None],
108 list[tuple[str, dict[str, Any]]],
109 ],
110 success_capture: tuple[Callable[[str], None], list[str]],
111) -> None:
112 """Verify progress indicators are preserved in pytest output.
114 Args:
115 console_capture_with_kwargs: Mock console output capture with kwargs.
116 success_capture: Mock success message capture.
117 """
118 mock_console, console_output = console_capture_with_kwargs
119 mock_success, _ = success_capture
121 output = "test_file.py [100%]\nAll tests passed"
123 print_tool_result(
124 console_output_func=mock_console,
125 success_func=mock_success,
126 tool_name="pytest",
127 output=output,
128 issues_count=0,
129 )
131 texts = [
132 t for t, _ in console_output if t and t not in ("🧪 Test Results", "-" * 20, "")
133 ]
134 combined = "\n".join(texts)
135 assert_that(combined).contains("[100%]")
138@pytest.mark.parametrize(
139 ("tool_name", "expected_header"),
140 [
141 ("pytest", "🧪 Test Results"),
142 ("PYTEST", "🧪 Test Results"),
143 ("PyTest", "🧪 Test Results"),
144 ],
145 ids=["lowercase_pytest", "uppercase_pytest", "mixed_case_pytest"],
146)
147def test_pytest_tool_name_case_insensitive(
148 console_capture_with_kwargs: tuple[
149 Callable[..., None],
150 list[tuple[str, dict[str, Any]]],
151 ],
152 success_capture: tuple[Callable[[str], None], list[str]],
153 tool_name: str,
154 expected_header: str,
155) -> None:
156 """Verify pytest tool name handling is case-insensitive.
158 Args:
159 console_capture_with_kwargs: Mock console output capture with kwargs.
160 success_capture: Mock success message capture.
161 tool_name: Name of the tool.
162 expected_header: Expected header text.
163 """
164 mock_console, console_output = console_capture_with_kwargs
165 mock_success, _ = success_capture
167 print_tool_result(
168 console_output_func=mock_console,
169 success_func=mock_success,
170 tool_name=tool_name,
171 output="test output",
172 issues_count=0,
173 )
175 texts = [t for t, _ in console_output]
176 assert_that(texts).contains(expected_header)