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

1"""Additional unit tests for Ruff parser variants and format check output.""" 

2 

3from __future__ import annotations 

4 

5from assertpy import assert_that 

6 

7from lintro.parsers.ruff.ruff_parser import ( 

8 parse_ruff_format_check_output, 

9 parse_ruff_output, 

10) 

11 

12 

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

30 

31 

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

45 

46 

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

57 

58 

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