From ed8e874246190da43960a17a8034e02823c8c0a2 Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Mon, 18 Dec 2017 16:48:23 -0800 Subject: [PATCH] test(populate): repro #5858 --- test/model.populate.test.js | 64 +++++++++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) diff --git a/test/model.populate.test.js b/test/model.populate.test.js index 2f861b79a2b..5e0ecce9248 100644 --- a/test/model.populate.test.js +++ b/test/model.populate.test.js @@ -5859,6 +5859,70 @@ describe('model: populate:', function() { catch(done); }); + it('subPopulate under discriminators race condition (gh-5858)', function() { + var options = { discriminatorKey: 'kind' }; + var activitySchema = new Schema({ title: { type: String } }, options); + + var dateActivitySchema = new Schema({ + postedBy: { + type: Schema.Types.ObjectId, + ref: 'gh5858', + required: true + } + }, options); + + var eventActivitySchema = new Schema({ test: String }, options); + + var logSchema = new Schema({ + seq: Number, + activity: { + type: Schema.Types.ObjectId, + refPath: 'kind', + required: true + }, + kind: String + }, options); + + var User = db.model('gh5858', { name: String }); + var Activity = db.model('gh5858_0', activitySchema); + var DateActivity = Activity.discriminator('gh5858_1', dateActivitySchema); + var EventActivity = Activity.discriminator('gh5858_2', eventActivitySchema); + var Log = db.model('gh5858_3', logSchema); + + var dateActivity; + var eventActivity; + return User.create({ name: 'val' }). + then(function(user) { + return DateActivity.create({ title: 'test', postedBy: user._id }); + }). + then(function(_dateActivity) { + dateActivity = _dateActivity; + return EventActivity.create({ title: 'test' }); + }). + then(function(_eventActivity) { + eventActivity = _eventActivity; + return Log.create([ + { seq: 1, activity: eventActivity._id, kind: 'gh5858_2' }, + { seq: 2, activity: dateActivity._id, kind: 'gh5858_1' } + ]); + }). + then(function() { + return Log.find({}). + populate({ + path: 'activity', + populate: { path: 'postedBy' } + }). + sort({ seq:-1 }); + }). + then(function(results) { + assert.equal(results.length, 2); + assert.equal(results[0].activity.kind, 'gh5858_1' ); + assert.equal(results[0].activity.postedBy.name, 'val'); + assert.equal(results[1].activity.kind, 'gh5858_2' ); + assert.equal(results[1].activity.postedBy, null); + }); + }); + it('specify model in populate (gh-4264)', function(done) { var PersonSchema = new Schema({ name: String,