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
« prev ^ index » next coverage.py v7.13.0, created at 2026-04-03 18:53 +0000
1"""Unit tests for vue-tsc parser."""
3from __future__ import annotations
5from assertpy import assert_that
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)
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()
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)
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")
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)
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")
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)
54 assert_that(issues).is_length(1)
55 assert_that(issues[0].file).is_equal_to("src/components/Button.vue")
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)
63 assert_that(issues).is_length(1)
64 assert_that(issues[0].file).is_equal_to("src/App.vue")
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)
74 assert_that(issues).is_length(1)
75 assert_that(issues[0].file).is_equal_to("src/App.vue")
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)
83 assert_that(issues).is_length(1)
84 assert_that(issues[0]).is_instance_of(VueTscIssue)
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 ]
100 type_errors, dependency_errors = categorize_vue_tsc_issues(issues)
102 assert_that(type_errors).is_length(1)
103 assert_that(dependency_errors).is_empty()
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 ]
127 type_errors, dependency_errors = categorize_vue_tsc_issues(issues)
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")
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 ]
155 modules = extract_missing_modules(dependency_errors)
157 assert_that(modules).is_length(2)
158 assert_that(modules).contains("@vueuse/core")
159 assert_that(modules).contains("vue")
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()
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")
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()
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("")