Coverage for tests / unit / tools / sqlfluff / test_output_parsing.py: 100%

39 statements  

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

1"""Unit tests for sqlfluff output parsing.""" 

2 

3from __future__ import annotations 

4 

5from assertpy import assert_that 

6 

7from lintro.parsers.sqlfluff.sqlfluff_parser import parse_sqlfluff_output 

8 

9 

10def test_parse_sqlfluff_output_single_issue() -> None: 

11 """Parse single issue from sqlfluff output.""" 

12 output = """[ 

13 { 

14 "filepath": "test.sql", 

15 "violations": [ 

16 { 

17 "start_line_no": 1, 

18 "start_line_pos": 1, 

19 "code": "L010", 

20 "description": "Keywords must be upper case.", 

21 "name": "capitalisation.keywords" 

22 } 

23 ] 

24 } 

25 ]""" 

26 issues = parse_sqlfluff_output(output) 

27 

28 assert_that(issues).is_length(1) 

29 assert_that(issues[0].file).is_equal_to("test.sql") 

30 assert_that(issues[0].line).is_equal_to(1) 

31 assert_that(issues[0].code).is_equal_to("L010") 

32 assert_that(issues[0].message).contains("Keywords must be upper case") 

33 

34 

35def test_parse_sqlfluff_output_multiple_issues() -> None: 

36 """Parse multiple issues from sqlfluff output.""" 

37 output = """[ 

38 { 

39 "filepath": "test.sql", 

40 "violations": [ 

41 { 

42 "start_line_no": 1, 

43 "start_line_pos": 1, 

44 "code": "L010", 

45 "description": "Keywords must be upper case." 

46 }, 

47 { 

48 "start_line_no": 2, 

49 "start_line_pos": 5, 

50 "code": "L011", 

51 "description": "Implicit aliasing of columns." 

52 } 

53 ] 

54 } 

55 ]""" 

56 issues = parse_sqlfluff_output(output) 

57 

58 assert_that(issues).is_length(2) 

59 assert_that(issues[0].code).is_equal_to("L010") 

60 assert_that(issues[1].code).is_equal_to("L011") 

61 

62 

63def test_parse_sqlfluff_output_multiple_files() -> None: 

64 """Parse issues from multiple files.""" 

65 output = """[ 

66 { 

67 "filepath": "test1.sql", 

68 "violations": [ 

69 { 

70 "start_line_no": 1, 

71 "start_line_pos": 1, 

72 "code": "L010", 

73 "description": "Keywords must be upper case." 

74 } 

75 ] 

76 }, 

77 { 

78 "filepath": "test2.sql", 

79 "violations": [ 

80 { 

81 "start_line_no": 3, 

82 "start_line_pos": 10, 

83 "code": "L014", 

84 "description": "Inconsistent capitalisation." 

85 } 

86 ] 

87 } 

88 ]""" 

89 issues = parse_sqlfluff_output(output) 

90 

91 assert_that(issues).is_length(2) 

92 assert_that(issues[0].file).is_equal_to("test1.sql") 

93 assert_that(issues[1].file).is_equal_to("test2.sql") 

94 

95 

96def test_parse_sqlfluff_output_empty() -> None: 

97 """Parse empty output returns empty list.""" 

98 issues = parse_sqlfluff_output("") 

99 

100 assert_that(issues).is_empty() 

101 

102 

103def test_parse_sqlfluff_output_empty_array() -> None: 

104 """Parse empty array returns empty list.""" 

105 issues = parse_sqlfluff_output("[]") 

106 

107 assert_that(issues).is_empty() 

108 

109 

110def test_parse_sqlfluff_output_no_violations() -> None: 

111 """Parse output with no violations returns empty list.""" 

112 output = """[ 

113 { 

114 "filepath": "test.sql", 

115 "violations": [] 

116 } 

117 ]""" 

118 issues = parse_sqlfluff_output(output) 

119 

120 assert_that(issues).is_empty() 

121 

122 

123def test_parse_sqlfluff_output_invalid_json() -> None: 

124 """Parse invalid JSON returns empty list.""" 

125 issues = parse_sqlfluff_output("not valid json") 

126 

127 assert_that(issues).is_empty() 

128 

129 

130def test_parse_sqlfluff_output_none() -> None: 

131 """Parse None input returns empty list.""" 

132 issues = parse_sqlfluff_output(None) 

133 

134 assert_that(issues).is_empty()