@@ -2555,6 +2555,88 @@ describe('document', function() {
25552555 // Does not throw
25562556 await Model . create ( { name : 'test' } ) ;
25572557 } ) ;
2558+
2559+ it ( 'fully validates modified subdocs (gh-14677)' , async function ( ) {
2560+ const embedSchema = new mongoose . Schema ( {
2561+ field1 : {
2562+ type : String ,
2563+ required : true
2564+ } ,
2565+ field2 : String
2566+ } ) ;
2567+ const testSchema = new mongoose . Schema ( {
2568+ testField : {
2569+ type : String ,
2570+ required : true
2571+ } ,
2572+ testArray : [ embedSchema ]
2573+ } ) ;
2574+ const TestModel = db . model ( 'Test' , testSchema ) ;
2575+
2576+ let doc = new TestModel ( { testArray : [ { field2 : 'test' } ] } ) ;
2577+ let err = await doc . validate ( { validateModifiedOnly : true } ) . then ( ( ) => null , err => err ) ;
2578+ assert . ok ( err ) ;
2579+ assert . ok ( err . errors [ 'testArray.0.field1' ] ) ;
2580+ assert . equal ( err . errors [ 'testArray.0.field1' ] . kind , 'required' ) ;
2581+
2582+ await TestModel . collection . insertOne ( doc . toObject ( ) ) ;
2583+ doc = await TestModel . findById ( doc . _id ) . orFail ( ) ;
2584+ doc . testArray [ 0 ] . field2 = 'test modified' ;
2585+ err = await doc . validate ( { validateModifiedOnly : true } ) . then ( ( ) => null , err => err ) ;
2586+ assert . ifError ( err ) ;
2587+
2588+ err = await doc . validate ( ) . then ( ( ) => null , err => err ) ;
2589+ assert . ok ( err ) ;
2590+ assert . ok ( err . errors [ 'testArray.0.field1' ] ) ;
2591+ assert . equal ( err . errors [ 'testArray.0.field1' ] . kind , 'required' ) ;
2592+
2593+ doc . testArray [ 0 ] = { field2 : 'test modified 3' } ;
2594+ err = await doc . validate ( { validateModifiedOnly : true } ) . then ( ( ) => null , err => err ) ;
2595+ assert . ok ( err ) ;
2596+ assert . ok ( err . errors [ 'testArray.0.field1' ] ) ;
2597+ assert . equal ( err . errors [ 'testArray.0.field1' ] . kind , 'required' ) ;
2598+ } ) ;
2599+
2600+ it ( 'fully validates modified single nested subdocs (gh-14677)' , async function ( ) {
2601+ const embedSchema = new mongoose . Schema ( {
2602+ field1 : {
2603+ type : String ,
2604+ required : true
2605+ } ,
2606+ field2 : String
2607+ } ) ;
2608+ const testSchema = new mongoose . Schema ( {
2609+ testField : {
2610+ type : String ,
2611+ required : true
2612+ } ,
2613+ subdoc : embedSchema
2614+ } ) ;
2615+ const TestModel = db . model ( 'Test' , testSchema ) ;
2616+
2617+ let doc = new TestModel ( { subdoc : { field2 : 'test' } } ) ;
2618+ let err = await doc . validate ( { validateModifiedOnly : true } ) . then ( ( ) => null , err => err ) ;
2619+ assert . ok ( err ) ;
2620+ assert . ok ( err . errors [ 'subdoc.field1' ] ) ;
2621+ assert . equal ( err . errors [ 'subdoc.field1' ] . kind , 'required' ) ;
2622+
2623+ await TestModel . collection . insertOne ( doc . toObject ( ) ) ;
2624+ doc = await TestModel . findById ( doc . _id ) . orFail ( ) ;
2625+ doc . subdoc . field2 = 'test modified' ;
2626+ err = await doc . validate ( { validateModifiedOnly : true } ) . then ( ( ) => null , err => err ) ;
2627+ assert . ifError ( err ) ;
2628+
2629+ err = await doc . validate ( ) . then ( ( ) => null , err => err ) ;
2630+ assert . ok ( err ) ;
2631+ assert . ok ( err . errors [ 'subdoc.field1' ] ) ;
2632+ assert . equal ( err . errors [ 'subdoc.field1' ] . kind , 'required' ) ;
2633+
2634+ doc . subdoc = { field2 : 'test modified 3' } ;
2635+ err = await doc . validate ( { validateModifiedOnly : true } ) . then ( ( ) => null , err => err ) ;
2636+ assert . ok ( err ) ;
2637+ assert . ok ( err . errors [ 'subdoc.field1' ] ) ;
2638+ assert . equal ( err . errors [ 'subdoc.field1' ] . kind , 'required' ) ;
2639+ } ) ;
25582640 } ) ;
25592641
25602642 describe ( 'bug fixes' , function ( ) {
0 commit comments