@@ -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