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
« 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.
3Tests verify JSON output structure, metadata, and issue serialization.
4"""
6from __future__ import annotations
8import json
9from pathlib import Path
10from typing import TYPE_CHECKING
12from assertpy import assert_that
14from lintro.enums.action import Action
15from lintro.enums.output_format import OutputFormat
16from lintro.utils.output.file_writer import write_output_file
18if TYPE_CHECKING:
19 from collections.abc import Callable
21 from .conftest import MockToolResult
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.
30 The output should contain action, summary with totals, and results array.
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 ]
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 )
50 assert_that(output_path.exists()).is_true()
51 content = json.loads(output_path.read_text())
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()
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.
68 Each issue should contain file, line, code, and message attributes.
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"
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 )
85 content = json.loads(output_path.read_text())
86 issues = content["results"][0]["issues"]
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")