@@ -138,4 +138,138 @@ describe("nested validation", function () {
138138
139139 } ) ;
140140
141+ it ( "should validate nested set" , ( ) => {
142+
143+ class MySubClass {
144+ @MinLength ( 5 )
145+ name : string ;
146+ }
147+
148+ class MyClass {
149+ @Contains ( "hello" )
150+ title : string ;
151+
152+ @ValidateNested ( )
153+ mySubClass : MySubClass ;
154+
155+ @ValidateNested ( )
156+ mySubClasses : Set < MySubClass > ;
157+ }
158+
159+ const model = new MyClass ( ) ;
160+ model . title = "helo world" ;
161+ model . mySubClass = new MySubClass ( ) ;
162+ model . mySubClass . name = "my" ;
163+ model . mySubClasses = new Set ( ) ;
164+
165+ const submodel1 = new MySubClass ( ) ;
166+ submodel1 . name = "my" ;
167+ model . mySubClasses . add ( submodel1 ) ;
168+
169+ const submodel2 = new MySubClass ( ) ;
170+ submodel2 . name = "not-short" ;
171+ model . mySubClasses . add ( submodel2 ) ;
172+
173+ return validator . validate ( model ) . then ( errors => {
174+ errors . length . should . be . equal ( 3 ) ;
175+
176+ errors [ 0 ] . target . should . be . equal ( model ) ;
177+ errors [ 0 ] . property . should . be . equal ( "title" ) ;
178+ errors [ 0 ] . constraints . should . be . eql ( { contains : "title must contain a hello string" } ) ;
179+ errors [ 0 ] . value . should . be . equal ( "helo world" ) ;
180+
181+ errors [ 1 ] . target . should . be . equal ( model ) ;
182+ errors [ 1 ] . property . should . be . equal ( "mySubClass" ) ;
183+ errors [ 1 ] . value . should . be . equal ( model . mySubClass ) ;
184+ expect ( errors [ 1 ] . constraints ) . to . be . undefined ;
185+ const subError1 = errors [ 1 ] . children [ 0 ] ;
186+ subError1 . target . should . be . equal ( model . mySubClass ) ;
187+ subError1 . property . should . be . equal ( "name" ) ;
188+ subError1 . constraints . should . be . eql ( { minLength : "name must be longer than or equal to 5 characters" } ) ;
189+ subError1 . value . should . be . equal ( "my" ) ;
190+
191+ errors [ 2 ] . target . should . be . equal ( model ) ;
192+ errors [ 2 ] . property . should . be . equal ( "mySubClasses" ) ;
193+ errors [ 2 ] . value . should . be . equal ( model . mySubClasses ) ;
194+ expect ( errors [ 2 ] . constraints ) . to . be . undefined ;
195+ const subError2 = errors [ 2 ] . children [ 0 ] ;
196+ subError2 . target . should . be . equal ( model . mySubClasses ) ;
197+ subError2 . value . should . be . equal ( submodel1 ) ;
198+ subError2 . property . should . be . equal ( "0" ) ;
199+ const subSubError = subError2 . children [ 0 ] ;
200+ subSubError . target . should . be . equal ( submodel1 ) ;
201+ subSubError . property . should . be . equal ( "name" ) ;
202+ subSubError . constraints . should . be . eql ( { minLength : "name must be longer than or equal to 5 characters" } ) ;
203+ subSubError . value . should . be . equal ( "my" ) ;
204+ } ) ;
205+
206+ } ) ;
207+
208+ it ( "should validate nested map" , ( ) => {
209+
210+ class MySubClass {
211+ @MinLength ( 5 )
212+ name : string ;
213+ }
214+
215+ class MyClass {
216+ @Contains ( "hello" )
217+ title : string ;
218+
219+ @ValidateNested ( )
220+ mySubClass : MySubClass ;
221+
222+ @ValidateNested ( )
223+ mySubClasses : Map < string , MySubClass > ;
224+ }
225+
226+ const model = new MyClass ( ) ;
227+ model . title = "helo world" ;
228+ model . mySubClass = new MySubClass ( ) ;
229+ model . mySubClass . name = "my" ;
230+ model . mySubClasses = new Map ( ) ;
231+
232+ const submodel1 = new MySubClass ( ) ;
233+ submodel1 . name = "my" ;
234+ model . mySubClasses . set ( "key1" , submodel1 ) ;
235+
236+ const submodel2 = new MySubClass ( ) ;
237+ submodel2 . name = "not-short" ;
238+ model . mySubClasses . set ( "key2" , submodel2 ) ;
239+
240+ return validator . validate ( model ) . then ( errors => {
241+ errors . length . should . be . equal ( 3 ) ;
242+
243+ errors [ 0 ] . target . should . be . equal ( model ) ;
244+ errors [ 0 ] . property . should . be . equal ( "title" ) ;
245+ errors [ 0 ] . constraints . should . be . eql ( { contains : "title must contain a hello string" } ) ;
246+ errors [ 0 ] . value . should . be . equal ( "helo world" ) ;
247+
248+ errors [ 1 ] . target . should . be . equal ( model ) ;
249+ errors [ 1 ] . property . should . be . equal ( "mySubClass" ) ;
250+ errors [ 1 ] . value . should . be . equal ( model . mySubClass ) ;
251+ expect ( errors [ 1 ] . constraints ) . to . be . undefined ;
252+ const subError1 = errors [ 1 ] . children [ 0 ] ;
253+ subError1 . target . should . be . equal ( model . mySubClass ) ;
254+ subError1 . property . should . be . equal ( "name" ) ;
255+ subError1 . constraints . should . be . eql ( { minLength : "name must be longer than or equal to 5 characters" } ) ;
256+ subError1 . value . should . be . equal ( "my" ) ;
257+
258+ errors [ 2 ] . target . should . be . equal ( model ) ;
259+ errors [ 2 ] . property . should . be . equal ( "mySubClasses" ) ;
260+ errors [ 2 ] . value . should . be . equal ( model . mySubClasses ) ;
261+ expect ( errors [ 2 ] . constraints ) . to . be . undefined ;
262+ const subError2 = errors [ 2 ] . children [ 0 ] ;
263+ subError2 . target . should . be . equal ( model . mySubClasses ) ;
264+ subError2 . value . should . be . equal ( submodel1 ) ;
265+ subError2 . property . should . be . equal ( "key1" ) ;
266+ const subSubError = subError2 . children [ 0 ] ;
267+ subSubError . target . should . be . equal ( submodel1 ) ;
268+ subSubError . property . should . be . equal ( "name" ) ;
269+ subSubError . constraints . should . be . eql ( { minLength : "name must be longer than or equal to 5 characters" } ) ;
270+ subSubError . value . should . be . equal ( "my" ) ;
271+ } ) ;
272+
273+ } ) ;
274+
141275} ) ;
0 commit comments