@@ -56,6 +56,69 @@ describe('New discriminatedUnion features', () => {
5656 assert ( form . data . message === 'FAIL' ) ;
5757 assert ( form . data . code === 401 ) ;
5858 } ) ;
59+
60+ test ( 'A complicated union' , async ( ) => {
61+ const ZodSchema2 = z . discriminatedUnion ( 'type' , [
62+ z . object ( {
63+ type : z . literal ( 'empty' )
64+ } ) ,
65+ z . object ( {
66+ type : z . literal ( 'additional' ) ,
67+ additional : z . discriminatedUnion ( 'type' , [
68+ z . object ( {
69+ type : z . literal ( 'poBox' ) ,
70+ name : z
71+ . string ( )
72+ . min ( 1 , 'min len' )
73+ . max ( 10 , 'max len' )
74+ . default ( null as unknown as string )
75+ } ) ,
76+ z . object ( {
77+ type : z . literal ( 'none' )
78+ } )
79+ ] )
80+ } )
81+ ] ) ;
82+
83+ const FormSchema = zod ( ZodSchema2 ) ;
84+ type FormSchema = ( typeof FormSchema ) [ 'defaults' ] ;
85+
86+ {
87+ const data = {
88+ type : 'additional' ,
89+ additional : {
90+ // @ts -expect-error Testing with invalid data
91+ type : 123 ,
92+ name : ''
93+ }
94+ } satisfies FormSchema ;
95+
96+ // @ts -expect-error Testing with invalid data
97+ const form = await validate ( data , FormSchema ) ;
98+ expect ( form . valid ) . toBe ( false ) ;
99+ expect ( form . data ) . toEqual ( {
100+ type : 'additional' ,
101+ additional : {
102+ type : 'none' ,
103+ name : ''
104+ }
105+ } ) ;
106+ }
107+
108+ {
109+ const data = {
110+ type : 'additional' ,
111+ additional : {
112+ type : 'poBox' ,
113+ name : ''
114+ }
115+ } satisfies FormSchema ;
116+
117+ const form = await validate ( data , FormSchema ) ;
118+ expect ( form . valid ) . toBe ( false ) ;
119+ expect ( form . data ) . toEqual ( data ) ;
120+ }
121+ } ) ;
59122} ) ;
60123
61124describe ( 'Default discriminated union values 1' , ( ) => {
0 commit comments