Skip to content

Commit 5b78dba

Browse files
committed
fix(populate): make getSchemaTypes() handle embedded discriminators without a ref
Re: #5970
1 parent 51511af commit 5b78dba

File tree

2 files changed

+66
-3
lines changed

2 files changed

+66
-3
lines changed

lib/services/populate/getSchemaTypes.js

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ var Mixed = require('../../schema/mixed');
88
var mpath = require('mpath');
99

1010
/*!
11-
* ignore
11+
* @param {Schema} schema
12+
* @param {Object} doc POJO
13+
* @param {string} path
1214
*/
1315

1416
module.exports = function getSchemaTypes(schema, doc, path) {
@@ -73,14 +75,14 @@ module.exports = function getSchemaTypes(schema, doc, path) {
7375
ret = [];
7476
for (var i = 0; i < schemas.length; ++i) {
7577
var _ret = search(parts.slice(p), schemas[i]);
76-
if (_ret) {
78+
if (_ret != null) {
7779
_ret.$isUnderneathDocArray = _ret.$isUnderneathDocArray ||
7880
!foundschema.schema.$isSingleNested;
7981
if (_ret.$isUnderneathDocArray) {
8082
ret.$isUnderneathDocArray = true;
8183
}
84+
ret.push(_ret);
8285
}
83-
ret.push(_ret);
8486
}
8587
return ret;
8688
} else {
Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
'use strict';
2+
3+
var Schema = require('../../lib/schema');
4+
var assert = require('assert');
5+
var getSchemaTypes = require('../../lib/services/populate/getSchemaTypes');
6+
7+
describe('getSchemaTypes', function() {
8+
it('handles embedded discriminators (gh-5970)', function(done) {
9+
var ItemSchema = new Schema({
10+
title: {
11+
type: String,
12+
required: true
13+
}
14+
}, {discriminatorKey: 'type'});
15+
16+
var ItemBookSchema = new Schema({
17+
author: {
18+
type: String,
19+
ref: 'Ref1'
20+
}
21+
});
22+
23+
var ItemEBookSchema = new Schema({
24+
author: {
25+
type: String,
26+
ref: 'Ref2'
27+
}
28+
});
29+
30+
var OtherItem = new Schema({ name: String });
31+
32+
var BundleSchema = new Schema({
33+
items: [{
34+
type: ItemSchema,
35+
required: false
36+
}]
37+
});
38+
39+
BundleSchema.path('items').discriminator('Book', ItemBookSchema);
40+
BundleSchema.path('items').discriminator('EBook', ItemEBookSchema);
41+
BundleSchema.path('items').discriminator('Other', OtherItem);
42+
43+
var doc = {
44+
items: [
45+
{ type: 'Book', author: 'test 1' },
46+
{ type: 'EBook', author: 'test 2' },
47+
{ type: 'Other' },
48+
]
49+
}
50+
var schemaTypes = getSchemaTypes(BundleSchema, doc, 'items.author');
51+
52+
assert.ok(Array.isArray(schemaTypes));
53+
// Make sure we only got the schema paths for Book and EBook, and none
54+
// for the 'Other'
55+
assert.equal(schemaTypes.length, 2);
56+
assert.equal(schemaTypes[0].options.ref, 'Ref1');
57+
assert.equal(schemaTypes[1].options.ref, 'Ref2');
58+
59+
done();
60+
});
61+
});

0 commit comments

Comments
 (0)