@@ -138,4 +138,138 @@ describe("nested validation", function () {
138
138
139
139
} ) ;
140
140
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
+
141
275
} ) ;
0 commit comments