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

1"""Unit tests for write_output_file function - Markdown format. 

2 

3Tests verify Markdown output structure with proper headings, tables, and escaping. 

4""" 

5 

6from __future__ import annotations 

7 

8from pathlib import Path 

9from typing import TYPE_CHECKING 

10 

11from assertpy import assert_that 

12 

13from lintro.enums.action import Action 

14from lintro.enums.output_format import OutputFormat 

15from lintro.utils.output.file_writer import write_output_file 

16 

17if TYPE_CHECKING: 

18 from collections.abc import Callable 

19 

20 from .conftest import MockIssue, MockToolResult 

21 

22 

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. 

28 

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" 

34 

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 ) 

43 

44 assert_that(output_path.exists()).is_true() 

45 content = output_path.read_text() 

46 

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 |") 

51 

52 

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. 

58 

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" 

64 

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 ) 

73 

74 content = output_path.read_text() 

75 

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") 

81 

82 

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. 

89 

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 ] 

103 

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 ) 

112 

113 content = output_path.read_text() 

114 assert_that(content).contains(r"A \| B") 

115 assert_that(content).does_not_contain("| A | B |")