From 0e2d638f892ee75bc6431b2ede9ef3ac878591eb Mon Sep 17 00:00:00 2001 From: Valeri Karpov Date: Thu, 27 Sep 2018 10:11:41 -0400 Subject: [PATCH] test(populate): repro #5704 --- test/model.populate.test.js | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) diff --git a/test/model.populate.test.js b/test/model.populate.test.js index b5877779b3a..b34a9d9f521 100644 --- a/test/model.populate.test.js +++ b/test/model.populate.test.js @@ -7797,4 +7797,49 @@ describe('model: populate:', function() { assert.equal(res.data.articles.title, 'An Overview of BigInt in Node.js'); }); }); + + it('multiple localFields and foreignFields (gh-5704)', function() { + const OrderSchema = new Schema({ + _id: Number, + sourceId: Number + }); + const RefundSchema = new Schema({ + _id: Number, + internalOrderId: Number, + sourceOrderId: Number + }); + RefundSchema.virtual('orders', { + ref: 'gh5704_Order', + localField: function() { + return this.internalOrderId ? 'internalOrderId' : 'sourceOrderId'; + }, + foreignField: function() { + return this.internalOrderId ? '_id' : 'sourceId'; + } + }); + + const Order = db.model('gh5704_Order', OrderSchema); + const Refund = db.model('gh5704_Refund', RefundSchema); + + return co(function*() { + yield Order.create([ + { _id: 1 }, + { _id: 99, sourceId: 2 } + ]); + + yield Refund.create([ + { _id: 10, internalOrderId: 1 }, + { _id: 11, sourceOrderId: 2 } + ]); + + let res = yield Refund.find().sort({ _id: 1 }).populate('orders'); + + res = res.map(doc => doc.toObject({ virtuals: true })); + assert.equal(res[0].orders.length, 1); + assert.strictEqual(res[0].orders[0]._id, 1); + + assert.equal(res[1].orders.length, 1); + assert.strictEqual(res[1].orders[0]._id, 99); + }); + }); });