Coverage for tests / unit / utils / output / test_file_writer_json.py: 100%

31 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 - JSON format. 

2 

3Tests verify JSON output structure, metadata, and issue serialization. 

4""" 

5 

6from __future__ import annotations 

7 

8import json 

9from pathlib import Path 

10from typing import TYPE_CHECKING 

11 

12from assertpy import assert_that 

13 

14from lintro.enums.action import Action 

15from lintro.enums.output_format import OutputFormat 

16from lintro.utils.output.file_writer import write_output_file 

17 

18if TYPE_CHECKING: 

19 from collections.abc import Callable 

20 

21 from .conftest import MockToolResult 

22 

23 

24def test_write_json_file_creates_valid_file( 

25 tmp_path: Path, 

26 mock_tool_result_factory: Callable[..., MockToolResult], 

27) -> None: 

28 """Verify JSON file is created with correct structure and metadata. 

29 

30 The output should contain action, summary with totals, and results array. 

31 

32 Args: 

33 tmp_path: Temporary directory path for test output. 

34 mock_tool_result_factory: Factory for creating mock tool results. 

35 """ 

36 output_path = tmp_path / "report.json" 

37 results = [ 

38 mock_tool_result_factory(name="ruff", issues_count=2, output="found issues"), 

39 ] 

40 

41 write_output_file( 

42 output_path=str(output_path), 

43 output_format=OutputFormat.JSON, 

44 all_results=results, # type: ignore[arg-type] 

45 action=Action.CHECK, 

46 total_issues=2, 

47 total_fixed=0, 

48 ) 

49 

50 assert_that(output_path.exists()).is_true() 

51 content = json.loads(output_path.read_text()) 

52 

53 assert_that(content).is_instance_of(dict) 

54 assert_that(content["action"]).is_equal_to("check") 

55 assert_that(content["summary"]["total_issues"]).is_equal_to(2) 

56 assert_that(content["summary"]["tools_run"]).is_equal_to(1) 

57 assert_that(content["results"]).is_length(1) 

58 assert_that(content["results"][0]["tool"]).is_equal_to("ruff") 

59 assert_that(content["timestamp"]).is_not_none() 

60 

61 

62def test_write_json_file_includes_parsed_issues( 

63 tmp_path: Path, 

64 sample_results_with_issues: list[MockToolResult], 

65) -> None: 

66 """Verify parsed issues are properly serialized in JSON output with all fields. 

67 

68 Each issue should contain file, line, code, and message attributes. 

69 

70 Args: 

71 tmp_path: Temporary directory path for test output. 

72 sample_results_with_issues: Mock tool results containing issues. 

73 """ 

74 output_path = tmp_path / "report.json" 

75 

76 write_output_file( 

77 output_path=str(output_path), 

78 output_format=OutputFormat.JSON, 

79 all_results=sample_results_with_issues, # type: ignore[arg-type] 

80 action=Action.CHECK, 

81 total_issues=1, 

82 total_fixed=0, 

83 ) 

84 

85 content = json.loads(output_path.read_text()) 

86 issues = content["results"][0]["issues"] 

87 

88 assert_that(issues).is_length(1) 

89 assert_that(issues[0]["file"]).is_equal_to("src/main.py") 

90 assert_that(issues[0]["line"]).is_equal_to(10) 

91 assert_that(issues[0]["code"]).is_equal_to("E001") 

92 assert_that(issues[0]["message"]).is_equal_to("Test error")