@@ -352,4 +352,56 @@ describe('discriminator docs', function () {
352
352
} ) .
353
353
catch ( done ) ;
354
354
} ) ;
355
+
356
+ /**
357
+ * Recursive embedded discriminators
358
+ */
359
+ it ( 'Recursive embedded discriminators in arrays' , function ( done ) {
360
+ var singleEventSchema = new Schema ( { message : String } ,
361
+ { discriminatorKey : 'kind' , _id : false } ) ;
362
+
363
+ var eventListSchema = new Schema ( { events : [ singleEventSchema ] } ) ;
364
+
365
+ var subEventSchema = new Schema ( {
366
+ sub_events : [ singleEventSchema ]
367
+ } , { _id : false } ) ;
368
+
369
+ var SubEvent = subEventSchema . path ( 'sub_events' ) . discriminator ( 'SubEvent' , subEventSchema )
370
+ eventListSchema . path ( 'events' ) . discriminator ( 'SubEvent' , subEventSchema ) ;
371
+
372
+ var Eventlist = db . model ( 'EventList' , eventListSchema ) ;
373
+
374
+ // Create a new batch of events with different kinds
375
+ var list = {
376
+ events : [
377
+ { kind : 'SubEvent' , sub_events : [ { kind :'SubEvent' , sub_events :[ ] , message :'test1' } ] , message : 'hello' } ,
378
+ { kind : 'SubEvent' , sub_events : [ { kind :'SubEvent' , sub_events :[ { kind :'SubEvent' , sub_events :[ ] , message :'test3' } ] , message :'test2' } ] , message : 'world' }
379
+ ]
380
+ } ;
381
+
382
+ Eventlist . create ( list ) .
383
+ then ( function ( doc ) {
384
+ assert . equal ( doc . events . length , 2 ) ;
385
+
386
+ assert . equal ( doc . events [ 0 ] . sub_events [ 0 ] . message , 'test1' ) ;
387
+ assert . equal ( doc . events [ 0 ] . message , 'hello' ) ;
388
+ assert . ok ( doc . events [ 0 ] . sub_events [ 0 ] instanceof SubEvent ) ;
389
+
390
+ assert . equal ( doc . events [ 1 ] . sub_events [ 0 ] . sub_events [ 0 ] . message , 'test3' ) ;
391
+ assert . equal ( doc . events [ 1 ] . message , 'world' ) ;
392
+ assert . ok ( doc . events [ 1 ] . sub_events [ 0 ] . sub_events [ 0 ] instanceof SubEvent ) ;
393
+
394
+ doc . events . push ( { kind :'SubEvent' , sub_events :[ { kind :'SubEvent' , sub_events :[ ] , message :'test4' } ] , message :'pushed' } ) ;
395
+ return doc . save ( ) ;
396
+ } ) .
397
+ then ( function ( doc ) {
398
+ assert . equal ( doc . events . length , 3 ) ;
399
+
400
+ assert . equal ( doc . events [ 2 ] . message , 'pushed' ) ;
401
+ assert . ok ( doc . events [ 2 ] . sub_events [ 0 ] instanceof SubEvent ) ;
402
+
403
+ done ( ) ;
404
+ } ) .
405
+ catch ( done ) ;
406
+ } ) ;
355
407
} ) ;
0 commit comments