Skip to content

Commit 8b37aae

Browse files
authored
Merge pull request #16093 from mahmoodhamdi/fix/issue-16051-setters-on-setDefaultsOnInsert
fix(setDefaultsOnInsert): run setters on default values during upsert
2 parents 7044e58 + aa5c488 commit 8b37aae

File tree

3 files changed

+24
-11
lines changed

3 files changed

+24
-11
lines changed

lib/helpers/setDefaultsOnInsert.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ module.exports = function(filter, schema, castedDoc, options, queryMongooseOptio
8484
if (schemaType.path === '_id' && schemaType.options.auto) {
8585
return;
8686
}
87-
const def = schemaType.getDefault(null, true, { context });
87+
const def = schemaType.getDefault(null, false, { context });
8888
if (typeof def === 'undefined') {
8989
return;
9090
}

test/helpers/setDefaultsOnInsert.test.js

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,25 @@ describe('setDefaultsOnInsert', function() {
107107
assert.equal(update.$setOnInsert['referralConversion'], 'bar');
108108
});
109109

110+
it('runs setters on default values (gh-16051)', function() {
111+
const schema = new Schema({
112+
name: String,
113+
slug: {
114+
type: String,
115+
default: 'Hello World!',
116+
set: function(v) {
117+
return v.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
118+
}
119+
}
120+
});
121+
122+
const opts = { upsert: true, setDefaultsOnInsert: true };
123+
let update = { $set: { name: 'test' } };
124+
update = setDefaultsOnInsert({}, schema, update, opts);
125+
126+
assert.equal(update.$setOnInsert['slug'], 'hello-world');
127+
});
128+
110129
it('skips default if parent is $set (gh-12279)', function() {
111130
const SubscriptionsConfigSchema = Schema({
112131
hasPaidSubscription: { type: Boolean, required: true },

test/model.updateOne.test.js

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -624,18 +624,14 @@ describe('model: updateOne:', function() {
624624

625625
});
626626

627-
it('setDefaultsOnInsert does not run setters on default values (gh-16025)', async function() {
628-
const setterContexts = [];
627+
it('setDefaultsOnInsert runs setters on default values (gh-16051)', async function() {
629628
const schema = new Schema({
630629
name: String,
631630
slug: {
632631
type: String,
633-
default: function() {
634-
return this.get('name');
635-
},
632+
default: 'Hello World!',
636633
set: function(v) {
637-
setterContexts.push(this);
638-
return v;
634+
return v.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/(^-|-$)/g, '');
639635
}
640636
}
641637
});
@@ -647,10 +643,8 @@ describe('model: updateOne:', function() {
647643
{ upsert: true, setDefaultsOnInsert: true }
648644
);
649645

650-
assert.equal(setterContexts.length, 0);
651-
652646
const doc = await Test.findOne({ name: 'foo' });
653-
assert.equal(doc.slug, 'foo');
647+
assert.equal(doc.slug, 'hello-world');
654648
});
655649

656650
it('avoids nested paths if setting parent path (gh-4911)', function(done) {

0 commit comments

Comments
 (0)