@@ -7419,6 +7419,50 @@ describe('Model', function() {
7419
7419
assert . equal ( doc . myVirtual , 'Hello from myVirtual' ) ;
7420
7420
} ) ;
7421
7421
7422
+ it ( 'supports recompiling model with new discriminators (gh-14444) (gh-14296)' , function ( ) {
7423
+ // Define discriminated schema
7424
+ const decoratorSchema = new Schema ( {
7425
+ type : { type : String , required : true }
7426
+ } , { discriminatorKey : 'type' } ) ;
7427
+
7428
+ class Decorator {
7429
+ whoAmI ( ) { return 'I am BaseDeco' ; }
7430
+ }
7431
+ decoratorSchema . loadClass ( Decorator ) ;
7432
+
7433
+ // Define discriminated class before model is compiled
7434
+ class Deco1 extends Decorator { whoAmI ( ) { return 'I am Test1' ; } }
7435
+ const deco1Schema = new Schema ( { } ) ;
7436
+ deco1Schema . loadClass ( Deco1 ) ;
7437
+ decoratorSchema . discriminator ( 'Test1' , deco1Schema ) ;
7438
+
7439
+ // Define model that uses discriminated schema
7440
+ const shopSchema = new Schema ( {
7441
+ item : { type : decoratorSchema , required : true }
7442
+ } ) ;
7443
+ const shopModel = db . model ( 'Test' , shopSchema ) ;
7444
+
7445
+ // Define another discriminated class after the model is compiled
7446
+ class Deco2 extends Decorator { whoAmI ( ) { return 'I am Test2' ; } }
7447
+ const deco2Schema = new Schema ( { } ) ;
7448
+ deco2Schema . loadClass ( Deco2 ) ;
7449
+ decoratorSchema . discriminator ( 'Test2' , deco2Schema ) ;
7450
+
7451
+ let instance = new shopModel ( { item : { type : 'Test1' } } ) ;
7452
+ assert . equal ( instance . item . whoAmI ( ) , 'I am Test1' ) ;
7453
+
7454
+ instance = new shopModel ( { item : { type : 'Test2' } } ) ;
7455
+ assert . equal ( instance . item . whoAmI ( ) , 'I am BaseDeco' ) ;
7456
+
7457
+ shopModel . recompileSchema ( ) ;
7458
+
7459
+ instance = new shopModel ( { item : { type : 'Test1' } } ) ;
7460
+ assert . equal ( instance . item . whoAmI ( ) , 'I am Test1' ) ;
7461
+
7462
+ instance = new shopModel ( { item : { type : 'Test2' } } ) ;
7463
+ assert . equal ( instance . item . whoAmI ( ) , 'I am Test2' ) ;
7464
+ } ) ;
7465
+
7422
7466
it ( 'inserts versionKey even if schema has `toObject.versionKey` set to false (gh-14344)' , async function ( ) {
7423
7467
const schema = new mongoose . Schema (
7424
7468
{ name : String } ,
0 commit comments