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