@bryan-thompson/inspector-assessment-cli 1.43.1 → 1.43.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,282 +0,0 @@
1
- /**
2
- * Tests for Zod Error Formatting Utilities
3
- *
4
- * Validates the error formatting functions for CLI-friendly output.
5
- *
6
- * @module cli/lib/__tests__/zodErrorFormatter
7
- */
8
- // Uses Jest globals (describe, test, expect)
9
- import { jest } from "@jest/globals";
10
- import { z } from "zod";
11
- import { formatZodIssue, formatZodError, formatZodErrorIndented, printZodErrorForCli, zodErrorToArray, formatZodErrorForJson, formatUserFriendlyError, } from "../zodErrorFormatter.js";
12
- // Helper to create a ZodError with specific issues
13
- function createZodError(issues) {
14
- // Create a schema that will fail and then manipulate the error
15
- const schema = z.object({ dummy: z.string() });
16
- const result = schema.safeParse({ dummy: 123 });
17
- if (!result.success) {
18
- // Replace the errors with our custom issues
19
- result.error.issues = issues.map((issue) => ({
20
- code: issue.code || "custom",
21
- path: issue.path,
22
- message: issue.message,
23
- }));
24
- return result.error;
25
- }
26
- throw new Error("Failed to create ZodError");
27
- }
28
- describe("zodErrorFormatter", () => {
29
- describe("formatZodIssue", () => {
30
- test("formats issue with empty path (message only)", () => {
31
- const issue = { code: "custom", path: [], message: "Required" };
32
- const result = formatZodIssue(issue);
33
- expect(result).toBe("Required");
34
- });
35
- test("formats issue with single-level path", () => {
36
- const issue = {
37
- code: "custom",
38
- path: ["field"],
39
- message: "Invalid value",
40
- };
41
- const result = formatZodIssue(issue);
42
- expect(result).toBe("field: Invalid value");
43
- });
44
- test("formats issue with nested path", () => {
45
- const issue = {
46
- code: "custom",
47
- path: ["config", "nested", "field"],
48
- message: "Must be a string",
49
- };
50
- const result = formatZodIssue(issue);
51
- expect(result).toBe("config.nested.field: Must be a string");
52
- });
53
- test("formats issue with array index in path", () => {
54
- const issue = {
55
- code: "custom",
56
- path: ["items", 0, "name"],
57
- message: "Required",
58
- };
59
- const result = formatZodIssue(issue);
60
- expect(result).toBe("items.0.name: Required");
61
- });
62
- });
63
- describe("formatZodError", () => {
64
- test("formats single error", () => {
65
- const error = createZodError([
66
- { path: ["field"], message: "Invalid value" },
67
- ]);
68
- const result = formatZodError(error);
69
- expect(result).toBe("field: Invalid value");
70
- });
71
- test("formats multiple errors with newlines", () => {
72
- const error = createZodError([
73
- { path: ["field1"], message: "Error 1" },
74
- { path: ["field2"], message: "Error 2" },
75
- { path: ["field3"], message: "Error 3" },
76
- ]);
77
- const result = formatZodError(error);
78
- expect(result).toBe("field1: Error 1\nfield2: Error 2\nfield3: Error 3");
79
- });
80
- test("handles error with empty path", () => {
81
- const error = createZodError([{ path: [], message: "Global error" }]);
82
- const result = formatZodError(error);
83
- expect(result).toBe("Global error");
84
- });
85
- });
86
- describe("formatZodErrorIndented", () => {
87
- test("uses default indentation (two spaces)", () => {
88
- const error = createZodError([
89
- { path: ["field"], message: "Invalid value" },
90
- ]);
91
- const result = formatZodErrorIndented(error);
92
- expect(result).toBe(" field: Invalid value");
93
- });
94
- test("uses custom indentation", () => {
95
- const error = createZodError([
96
- { path: ["field"], message: "Invalid value" },
97
- ]);
98
- const result = formatZodErrorIndented(error, "\t");
99
- expect(result).toBe("\tfield: Invalid value");
100
- });
101
- test("uses four spaces indentation", () => {
102
- const error = createZodError([
103
- { path: ["field"], message: "Invalid value" },
104
- ]);
105
- const result = formatZodErrorIndented(error, " ");
106
- expect(result).toBe(" field: Invalid value");
107
- });
108
- test("applies indent to each line for multiple errors", () => {
109
- const error = createZodError([
110
- { path: ["field1"], message: "Error 1" },
111
- { path: ["field2"], message: "Error 2" },
112
- ]);
113
- const result = formatZodErrorIndented(error, ">> ");
114
- expect(result).toBe(">> field1: Error 1\n>> field2: Error 2");
115
- });
116
- test("uses empty indentation", () => {
117
- const error = createZodError([
118
- { path: ["field"], message: "Invalid value" },
119
- ]);
120
- const result = formatZodErrorIndented(error, "");
121
- expect(result).toBe("field: Invalid value");
122
- });
123
- });
124
- describe("printZodErrorForCli", () => {
125
- let consoleSpy;
126
- beforeEach(() => {
127
- consoleSpy = jest.spyOn(console, "error").mockImplementation(() => { });
128
- });
129
- afterEach(() => {
130
- consoleSpy.mockRestore();
131
- });
132
- test("prints with context prefix", () => {
133
- const error = createZodError([
134
- { path: ["field"], message: "Invalid value" },
135
- ]);
136
- printZodErrorForCli(error, "config file");
137
- expect(consoleSpy).toHaveBeenCalledWith("Error in config file:\n field: Invalid value");
138
- });
139
- test("prints without context (default prefix)", () => {
140
- const error = createZodError([
141
- { path: ["field"], message: "Invalid value" },
142
- ]);
143
- printZodErrorForCli(error);
144
- expect(consoleSpy).toHaveBeenCalledWith("Validation error:\n field: Invalid value");
145
- });
146
- test("outputs multiple errors with indentation", () => {
147
- const error = createZodError([
148
- { path: ["field1"], message: "Error 1" },
149
- { path: ["field2"], message: "Error 2" },
150
- ]);
151
- printZodErrorForCli(error, "CLI arguments");
152
- expect(consoleSpy).toHaveBeenCalledWith("Error in CLI arguments:\n field1: Error 1\n field2: Error 2");
153
- });
154
- });
155
- describe("zodErrorToArray", () => {
156
- test("converts single error to array", () => {
157
- const error = createZodError([
158
- { path: ["field"], message: "Invalid value" },
159
- ]);
160
- const result = zodErrorToArray(error);
161
- expect(result).toEqual(["field: Invalid value"]);
162
- });
163
- test("converts multiple errors to array", () => {
164
- const error = createZodError([
165
- { path: ["field1"], message: "Error 1" },
166
- { path: ["field2"], message: "Error 2" },
167
- { path: ["field3"], message: "Error 3" },
168
- ]);
169
- const result = zodErrorToArray(error);
170
- expect(result).toEqual([
171
- "field1: Error 1",
172
- "field2: Error 2",
173
- "field3: Error 3",
174
- ]);
175
- });
176
- test("returns array preserving order", () => {
177
- const error = createZodError([
178
- { path: ["z"], message: "Z error" },
179
- { path: ["a"], message: "A error" },
180
- { path: ["m"], message: "M error" },
181
- ]);
182
- const result = zodErrorToArray(error);
183
- expect(result).toEqual(["z: Z error", "a: A error", "m: M error"]);
184
- });
185
- });
186
- describe("formatZodErrorForJson", () => {
187
- test("includes message field", () => {
188
- const error = createZodError([
189
- { path: ["field"], message: "Invalid value" },
190
- ]);
191
- const result = formatZodErrorForJson(error);
192
- expect(result.message).toBe("Validation failed");
193
- });
194
- test("includes errors array with path, message, code", () => {
195
- const error = createZodError([
196
- { path: ["field"], message: "Invalid value", code: "invalid_type" },
197
- ]);
198
- const result = formatZodErrorForJson(error);
199
- expect(result.errors).toHaveLength(1);
200
- expect(result.errors[0]).toEqual({
201
- path: ["field"],
202
- message: "Invalid value",
203
- code: "invalid_type",
204
- });
205
- });
206
- test("preserves path as array with numbers and strings", () => {
207
- const error = createZodError([
208
- { path: ["items", 0, "nested", 1, "field"], message: "Error" },
209
- ]);
210
- const result = formatZodErrorForJson(error);
211
- expect(result.errors[0].path).toEqual(["items", 0, "nested", 1, "field"]);
212
- });
213
- test("handles multiple errors", () => {
214
- const error = createZodError([
215
- { path: ["field1"], message: "Error 1", code: "too_small" },
216
- { path: ["field2"], message: "Error 2", code: "invalid_type" },
217
- ]);
218
- const result = formatZodErrorForJson(error);
219
- expect(result.errors).toHaveLength(2);
220
- expect(result.errors[0].code).toBe("too_small");
221
- expect(result.errors[1].code).toBe("invalid_type");
222
- });
223
- });
224
- describe("formatUserFriendlyError", () => {
225
- test("single error returns plain message", () => {
226
- const error = createZodError([
227
- { path: ["username"], message: "Required" },
228
- ]);
229
- const result = formatUserFriendlyError(error);
230
- expect(result).toBe("username: Required");
231
- });
232
- test("single error with empty path returns message only", () => {
233
- const error = createZodError([{ path: [], message: "Invalid input" }]);
234
- const result = formatUserFriendlyError(error);
235
- expect(result).toBe("Invalid input");
236
- });
237
- test("multiple errors returns bulleted list", () => {
238
- const error = createZodError([
239
- { path: ["field1"], message: "Error 1" },
240
- { path: ["field2"], message: "Error 2" },
241
- ]);
242
- const result = formatUserFriendlyError(error);
243
- expect(result).toBe("Multiple validation errors:\n - field1: Error 1\n - field2: Error 2");
244
- });
245
- test("applies field label mapping", () => {
246
- const error = createZodError([
247
- { path: ["serverName"], message: "Required" },
248
- ]);
249
- const labels = { serverName: "Server Name" };
250
- const result = formatUserFriendlyError(error, labels);
251
- expect(result).toBe("Server Name: Required");
252
- });
253
- test("applies labels for multiple errors", () => {
254
- const error = createZodError([
255
- { path: ["serverName"], message: "Required" },
256
- { path: ["configPath"], message: "Invalid path" },
257
- ]);
258
- const labels = {
259
- serverName: "Server Name",
260
- configPath: "Configuration Path",
261
- };
262
- const result = formatUserFriendlyError(error, labels);
263
- expect(result).toBe("Multiple validation errors:\n - Server Name: Required\n - Configuration Path: Invalid path");
264
- });
265
- test("falls back to path when no matching label", () => {
266
- const error = createZodError([
267
- { path: ["unknownField"], message: "Error" },
268
- ]);
269
- const labels = { otherField: "Other Field" };
270
- const result = formatUserFriendlyError(error, labels);
271
- expect(result).toBe("unknownField: Error");
272
- });
273
- test("handles nested path with labels", () => {
274
- const error = createZodError([
275
- { path: ["config", "nested"], message: "Invalid" },
276
- ]);
277
- const labels = { "config.nested": "Nested Config" };
278
- const result = formatUserFriendlyError(error, labels);
279
- expect(result).toBe("Nested Config: Invalid");
280
- });
281
- });
282
- });