Coverage for tests / unit / utils / output / test_file_writer_markdown.py: 100%
32 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"""Unit tests for write_output_file function - Markdown format.
3Tests verify Markdown output structure with proper headings, tables, and escaping.
4"""
6from __future__ import annotations
8from pathlib import Path
9from typing import TYPE_CHECKING
11from assertpy import assert_that
13from lintro.enums.action import Action
14from lintro.enums.output_format import OutputFormat
15from lintro.utils.output.file_writer import write_output_file
17if TYPE_CHECKING:
18 from collections.abc import Callable
20 from .conftest import MockIssue, MockToolResult
23def test_write_markdown_file_creates_valid_structure(
24 tmp_path: Path,
25 sample_results_empty: list[MockToolResult],
26) -> None:
27 """Verify Markdown file contains proper heading structure and summary table.
29 Args:
30 tmp_path: Temporary directory path for test output.
31 sample_results_empty: Mock tool results with no issues.
32 """
33 output_path = tmp_path / "report.md"
35 write_output_file(
36 output_path=str(output_path),
37 output_format=OutputFormat.MARKDOWN,
38 all_results=sample_results_empty, # type: ignore[arg-type]
39 action=Action.CHECK,
40 total_issues=0,
41 total_fixed=0,
42 )
44 assert_that(output_path.exists()).is_true()
45 content = output_path.read_text()
47 assert_that(content).contains("# Lintro Report")
48 assert_that(content).contains("## Summary")
49 assert_that(content).contains("| Tool | Issues |")
50 assert_that(content).contains("| ruff | 0 |")
53def test_write_markdown_file_includes_issue_table(
54 tmp_path: Path,
55 sample_results_with_issues: list[MockToolResult],
56) -> None:
57 """Verify Markdown output includes issues in table format with proper headers.
59 Args:
60 tmp_path: Temporary directory path for test output.
61 sample_results_with_issues: Mock tool results containing issues.
62 """
63 output_path = tmp_path / "report.md"
65 write_output_file(
66 output_path=str(output_path),
67 output_format=OutputFormat.MARKDOWN,
68 all_results=sample_results_with_issues, # type: ignore[arg-type]
69 action=Action.CHECK,
70 total_issues=1,
71 total_fixed=0,
72 )
74 content = output_path.read_text()
76 assert_that(content).contains("### ruff")
77 assert_that(content).contains("| File | Line | Code | Message |")
78 assert_that(content).contains("src/main.py")
79 assert_that(content).contains("10")
80 assert_that(content).contains("E001")
83def test_write_markdown_file_escapes_pipe_characters(
84 tmp_path: Path,
85 mock_tool_result_factory: Callable[..., MockToolResult],
86 mock_issue_factory: Callable[..., MockIssue],
87) -> None:
88 """Verify pipe characters in messages are escaped to preserve table formatting.
90 Args:
91 tmp_path: Temporary directory path for test output.
92 mock_tool_result_factory: Factory for creating mock tool results.
93 mock_issue_factory: Factory for creating mock issues.
94 """
95 output_path = tmp_path / "report.md"
96 results = [
97 mock_tool_result_factory(
98 name="ruff",
99 issues_count=1,
100 issues=[mock_issue_factory(message="A | B")],
101 ),
102 ]
104 write_output_file(
105 output_path=str(output_path),
106 output_format=OutputFormat.MARKDOWN,
107 all_results=results, # type: ignore[arg-type]
108 action=Action.CHECK,
109 total_issues=1,
110 total_fixed=0,
111 )
113 content = output_path.read_text()
114 assert_that(content).contains(r"A \| B")
115 assert_that(content).does_not_contain("| A | B |")