Coverage for tests / unit / parsers / shellcheck_parser / test_field_extraction.py: 100%

36 statements  

« prev     ^ index     » next       coverage.py v7.13.0, created at 2026-04-03 18:53 +0000

1"""Tests for shellcheck parser field extraction.""" 

2 

3from __future__ import annotations 

4 

5import pytest 

6from assertpy import assert_that 

7 

8from lintro.parsers.shellcheck.shellcheck_parser import parse_shellcheck_output 

9 

10from .conftest import make_issue, make_shellcheck_output 

11 

12 

13@pytest.mark.parametrize( 

14 ("level", "code"), 

15 [ 

16 ("error", 1072), 

17 ("warning", 2086), 

18 ("info", 2034), 

19 ("style", 2129), 

20 ], 

21) 

22def test_parse_severity_levels(level: str, code: int) -> None: 

23 """Parse issues with different severity levels. 

24 

25 Args: 

26 level: The expected severity level. 

27 code: The expected error code. 

28 """ 

29 output = make_shellcheck_output([make_issue(level=level, code=code)]) 

30 result = parse_shellcheck_output(output=output) 

31 

32 assert_that(result).is_length(1) 

33 assert_that(result[0].level).is_equal_to(level) 

34 assert_that(result[0].code).is_equal_to(f"SC{code}") 

35 

36 

37def test_parse_extracts_all_fields() -> None: 

38 """Parse issue extracts all fields correctly.""" 

39 output = make_shellcheck_output( 

40 [ 

41 make_issue( 

42 file="script.sh", 

43 line=10, 

44 column=5, 

45 level="warning", 

46 code=2086, 

47 message="Double quote to prevent globbing and word splitting.", 

48 end_line=12, 

49 end_column=15, 

50 ), 

51 ], 

52 ) 

53 result = parse_shellcheck_output(output=output) 

54 

55 assert_that(result).is_length(1) 

56 issue = result[0] 

57 assert_that(issue.file).is_equal_to("script.sh") 

58 assert_that(issue.line).is_equal_to(10) 

59 assert_that(issue.end_line).is_equal_to(12) 

60 assert_that(issue.column).is_equal_to(5) 

61 assert_that(issue.end_column).is_equal_to(15) 

62 assert_that(issue.level).is_equal_to("warning") 

63 assert_that(issue.code).is_equal_to("SC2086") 

64 assert_that(issue.message).is_equal_to( 

65 "Double quote to prevent globbing and word splitting.", 

66 ) 

67 

68 

69def test_parse_handles_missing_optional_fields() -> None: 

70 """Parse issue with missing optional fields uses defaults.""" 

71 output = make_shellcheck_output([make_issue()]) 

72 result = parse_shellcheck_output(output=output) 

73 

74 assert_that(result).is_length(1) 

75 assert_that(result[0].end_line).is_equal_to(0) 

76 assert_that(result[0].end_column).is_equal_to(0) 

77 

78 

79def test_parse_code_as_string() -> None: 

80 """Parse handles code as string (edge case).""" 

81 output = make_shellcheck_output([make_issue(code="SC2086")]) 

82 result = parse_shellcheck_output(output=output) 

83 

84 assert_that(result).is_length(1) 

85 assert_that(result[0].code).is_equal_to("SC2086")