Skip to content

Commit 6a1eea4

Browse files
author
A.P.A. Slaa
committed
fix: cover FormData validator release paths
1 parent 0dafbf1 commit 6a1eea4

1 file changed

Lines changed: 38 additions & 12 deletions

File tree

tests/validator.test.ts

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,7 @@ describe("validator", () => {
358358
formData.set("name", " Ada ");
359359
formData.append("roles", "admin");
360360
formData.append("roles", "user");
361+
formData.append("roles", "admin");
361362

362363
const validator = Validator.object({
363364
name: Validator.string({trim: true, non_empty: true}),
@@ -368,12 +369,12 @@ describe("validator", () => {
368369
success: true,
369370
data: {
370371
name: "Ada",
371-
roles: ["admin", "user"],
372+
roles: ["admin", "user", "admin"],
372373
},
373374
});
374375
expect(Validator.parseFormData(validator, formData)).toEqual({
375376
name: "Ada",
376-
roles: ["admin", "user"],
377+
roles: ["admin", "user", "admin"],
377378
});
378379
});
379380

@@ -405,6 +406,29 @@ describe("validator", () => {
405406
});
406407
});
407408

409+
it("throws SchemaValidationError when parseFormData validation fails", () => {
410+
const formData = new FormData();
411+
formData.set("name", "Ada");
412+
formData.append("roles", "guest");
413+
414+
const validator = Validator.object({
415+
name: Validator.string(),
416+
roles: Validator.array(Validator.enum(["admin", "user"] as const), {min: 1}),
417+
});
418+
419+
expect(() => Validator.parseFormData(validator, formData)).toThrowError(SchemaValidationError);
420+
421+
try {
422+
Validator.parseFormData(validator, formData);
423+
throw new Error("Expected validation error");
424+
} catch (error) {
425+
expect(error).toBeInstanceOf(SchemaValidationError);
426+
expect((error as SchemaValidationError).errors).toEqual([
427+
expect.objectContaining({path: "$.roles", code: "invalid_type"}),
428+
]);
429+
}
430+
});
431+
408432
it("exposes stable TypeScript inference for core validators", () => {
409433
const objectValidator = Validator.object({
410434
id: Validator.number({integer: true}),
@@ -426,19 +450,21 @@ describe("validator", () => {
426450
const tupleCheck: [string, number] = parsedTuple;
427451
const unionCheck: string | number = parsedUnion;
428452
const transformedCheck: number = parsedTransformed;
429-
void tupleCheck;
430-
void unionCheck;
431-
void transformedCheck;
432-
433-
expectTypeOf(parsedObject).toMatchTypeOf<{
453+
const objectCheck: {
434454
id: number;
435455
name: string;
436456
nickname?: string | undefined;
437-
}>();
438-
expectTypeOf(parsedAllowedObject).toMatchTypeOf<{
457+
} = parsedObject;
458+
const allowedObjectCheck: {
439459
id: number;
440-
} & Record<string, unknown>>();
441-
expectTypeOf(parsedUnion).toMatchTypeOf<string | number>();
442-
expectTypeOf(parsedTransformed).toMatchTypeOf<number>();
460+
} & Record<string, unknown> = parsedAllowedObject;
461+
void objectCheck;
462+
void allowedObjectCheck;
463+
void tupleCheck;
464+
void unionCheck;
465+
void transformedCheck;
466+
467+
expectTypeOf(parsedUnion).toEqualTypeOf<string | number>();
468+
expectTypeOf(parsedTransformed).toEqualTypeOf<number>();
443469
});
444470
});

0 commit comments

Comments
 (0)