Coverage for tests / unit / parsers / test_ruff_parser_more.py: 100%
23 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"""Additional unit tests for Ruff parser variants and format check output."""
3from __future__ import annotations
5from assertpy import assert_that
7from lintro.parsers.ruff.ruff_parser import (
8 parse_ruff_format_check_output,
9 parse_ruff_output,
10)
13def test_parse_ruff_output_json_lines_and_variants() -> None:
14 """Parse JSON lines with variant keys and fix metadata."""
15 # Mixed JSON lines with different location key variants and fix metadata
16 jl = (
17 '{"filename":"a.py","location":{"row":1,"column":2},'
18 '"end_location":{"row":1,"column":10},"code":"E501",'
19 '"message":"long line"}\n'
20 '{"file":"b.py","start":{"line":3,"col":1},'
21 '"end":{"line":3,"col":5},"rule":"F401","message":"unused"}\n'
22 '{"filename":"c.py","location":{"row":5,"column":4},'
23 '"code":"E702","message":"semicolon"}'
24 )
25 issues = parse_ruff_output(jl)
26 files = [i.file for i in issues]
27 codes = [i.code for i in issues]
28 assert_that(files).contains("a.py", "b.py", "c.py")
29 assert_that(codes).contains("E501", "F401", "E702")
32def test_parse_ruff_output_trailing_non_json() -> None:
33 """Ignore trailing non-JSON content after a JSON array."""
34 # Parser should ignore trailing non-JSON after array
35 output = (
36 "[\n"
37 ' {"filename": "x.py", "location": {"row": 1, "column": 1}, '
38 '"code": "F401", "message": "unused"}\n'
39 "]\n"
40 "Ruff 0.4.0 summary...\n"
41 )
42 issues = parse_ruff_output(output)
43 assert_that(issues).is_length(1)
44 assert_that(issues[0].file).ends_with("x.py")
47def test_parse_ruff_format_check_output_various_lines() -> None:
48 """Extract files from various format-check output lines."""
49 out = (
50 "Would reformat: src/app.py\n"
51 "Some other text\n"
52 "Would reformat tests/test_app.py\n"
53 "Summary: 2 files would be reformatted\n"
54 )
55 files = parse_ruff_format_check_output(out)
56 assert_that(files).contains("src/app.py", "tests/test_app.py")
59def test_parse_ruff_format_check_output_variants_more() -> None:
60 """Support alternate wording for 'Would reformat' lines."""
61 out = "Would reformat: a.py\nWould reformat b.py\n"
62 files = parse_ruff_format_check_output(out)
63 assert_that(sorted(files)).is_equal_to(["a.py", "b.py"])