Coverage for tests / unit / parsers / test_vue_tsc_parser.py: 100%

78 statements  

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

1"""Unit tests for vue-tsc parser.""" 

2 

3from __future__ import annotations 

4 

5from assertpy import assert_that 

6 

7from lintro.parsers.vue_tsc.vue_tsc_issue import VueTscIssue 

8from lintro.parsers.vue_tsc.vue_tsc_parser import ( 

9 categorize_vue_tsc_issues, 

10 extract_missing_modules, 

11 parse_vue_tsc_output, 

12) 

13 

14 

15def test_parse_vue_tsc_output_empty() -> None: 

16 """Handle empty output.""" 

17 assert_that(parse_vue_tsc_output("")).is_empty() 

18 assert_that(parse_vue_tsc_output(" \n\n ")).is_empty() 

19 

20 

21def test_parse_vue_tsc_output_single_error() -> None: 

22 """Parse a single vue-tsc error from text output.""" 

23 output = "src/App.vue(10,5): error TS2322: Type 'string' is not assignable to type 'number'." 

24 issues = parse_vue_tsc_output(output) 

25 

26 assert_that(issues).is_length(1) 

27 assert_that(issues[0].file).is_equal_to("src/App.vue") 

28 assert_that(issues[0].line).is_equal_to(10) 

29 assert_that(issues[0].column).is_equal_to(5) 

30 assert_that(issues[0].code).is_equal_to("TS2322") 

31 assert_that(issues[0].severity).is_equal_to("error") 

32 assert_that(issues[0].message).contains("not assignable") 

33 

34 

35def test_parse_vue_tsc_output_multiple_errors() -> None: 

36 """Parse multiple errors from vue-tsc output.""" 

37 output = """src/App.vue(10,5): error TS2322: Type 'string' is not assignable to type 'number'. 

38src/components/Card.vue(15,10): error TS2339: Property 'foo' does not exist on type 'Props'. 

39src/views/Home.vue(3,1): warning TS6133: 'x' is declared but its value is never read.""" 

40 issues = parse_vue_tsc_output(output) 

41 

42 assert_that(issues).is_length(3) 

43 assert_that(issues[0].code).is_equal_to("TS2322") 

44 assert_that(issues[1].code).is_equal_to("TS2339") 

45 assert_that(issues[2].code).is_equal_to("TS6133") 

46 assert_that(issues[2].severity).is_equal_to("warning") 

47 

48 

49def test_parse_vue_tsc_output_windows_paths() -> None: 

50 """Normalize Windows backslashes to forward slashes.""" 

51 output = r"src\components\Button.vue(10,5): error TS2322: Type mismatch." 

52 issues = parse_vue_tsc_output(output) 

53 

54 assert_that(issues).is_length(1) 

55 assert_that(issues[0].file).is_equal_to("src/components/Button.vue") 

56 

57 

58def test_parse_vue_tsc_output_ansi_codes() -> None: 

59 """Strip ANSI escape codes from output.""" 

60 output = "\x1b[31msrc/App.vue(10,5): error TS2322: Type mismatch.\x1b[0m" 

61 issues = parse_vue_tsc_output(output) 

62 

63 assert_that(issues).is_length(1) 

64 assert_that(issues[0].file).is_equal_to("src/App.vue") 

65 

66 

67def test_parse_vue_tsc_output_skips_noise_lines() -> None: 

68 """Skip non-error lines like summary and progress.""" 

69 output = """Checking types... 

70src/App.vue(10,5): error TS2322: Type mismatch. 

71Found 1 error in 1 file.""" 

72 issues = parse_vue_tsc_output(output) 

73 

74 assert_that(issues).is_length(1) 

75 assert_that(issues[0].file).is_equal_to("src/App.vue") 

76 

77 

78def test_vue_tsc_issue_type() -> None: 

79 """Verify parsed issues are VueTscIssue instances.""" 

80 output = "src/App.vue(10,5): error TS2322: Type error." 

81 issues = parse_vue_tsc_output(output) 

82 

83 assert_that(issues).is_length(1) 

84 assert_that(issues[0]).is_instance_of(VueTscIssue) 

85 

86 

87def test_categorize_vue_tsc_issues_all_type_errors() -> None: 

88 """Categorize issues with only type errors.""" 

89 issues = [ 

90 VueTscIssue( 

91 file="src/App.vue", 

92 line=10, 

93 column=5, 

94 code="TS2322", 

95 severity="error", 

96 message="Type mismatch.", 

97 ), 

98 ] 

99 

100 type_errors, dependency_errors = categorize_vue_tsc_issues(issues) 

101 

102 assert_that(type_errors).is_length(1) 

103 assert_that(dependency_errors).is_empty() 

104 

105 

106def test_categorize_vue_tsc_issues_dependency_errors() -> None: 

107 """Categorize issues with dependency errors.""" 

108 issues = [ 

109 VueTscIssue( 

110 file="src/App.vue", 

111 line=1, 

112 column=1, 

113 code="TS2307", 

114 severity="error", 

115 message="Cannot find module 'vue' or its corresponding type declarations.", 

116 ), 

117 VueTscIssue( 

118 file="src/App.vue", 

119 line=10, 

120 column=5, 

121 code="TS2322", 

122 severity="error", 

123 message="Type mismatch.", 

124 ), 

125 ] 

126 

127 type_errors, dependency_errors = categorize_vue_tsc_issues(issues) 

128 

129 assert_that(type_errors).is_length(1) 

130 assert_that(dependency_errors).is_length(1) 

131 assert_that(dependency_errors[0].code).is_equal_to("TS2307") 

132 

133 

134def test_extract_missing_modules() -> None: 

135 """Extract module names from dependency errors.""" 

136 dependency_errors = [ 

137 VueTscIssue( 

138 file="src/App.vue", 

139 line=1, 

140 column=1, 

141 code="TS2307", 

142 severity="error", 

143 message="Cannot find module 'vue' or its corresponding type declarations.", 

144 ), 

145 VueTscIssue( 

146 file="src/App.vue", 

147 line=2, 

148 column=1, 

149 code="TS2307", 

150 severity="error", 

151 message="Cannot find module '@vueuse/core' or its corresponding type declarations.", 

152 ), 

153 ] 

154 

155 modules = extract_missing_modules(dependency_errors) 

156 

157 assert_that(modules).is_length(2) 

158 assert_that(modules).contains("@vueuse/core") 

159 assert_that(modules).contains("vue") 

160 

161 

162def test_vue_tsc_issue_to_display_row() -> None: 

163 """Convert VueTscIssue to display row format.""" 

164 issue = VueTscIssue( 

165 file="src/App.vue", 

166 line=10, 

167 column=5, 

168 code="TS2322", 

169 message="Type error", 

170 severity="error", 

171 ) 

172 row = issue.to_display_row() 

173 

174 assert_that(row["file"]).is_equal_to("src/App.vue") 

175 assert_that(row["line"]).is_equal_to("10") 

176 assert_that(row["column"]).is_equal_to("5") 

177 assert_that(row["code"]).is_equal_to("TS2322") 

178 assert_that(row["message"]).is_equal_to("Type error") 

179 assert_that(row["severity"]).is_equal_to("ERROR") 

180 

181 

182def test_vue_tsc_issue_to_display_row_minimal() -> None: 

183 """Convert minimal VueTscIssue to display row format.""" 

184 issue = VueTscIssue(file="main.vue", line=1, column=1, message="Error") 

185 row = issue.to_display_row() 

186 

187 assert_that(row["file"]).is_equal_to("main.vue") 

188 assert_that(row["code"]).is_equal_to("") 

189 assert_that(row["severity"]).is_equal_to("WARNING") 

190 assert_that(row["fixable"]).is_equal_to("")