From 16936e0146f8dbc057e75c49bb462edc76be782f Mon Sep 17 00:00:00 2001 From: Bill Matson Date: Fri, 31 May 2019 15:06:58 -0400 Subject: [PATCH] Fix for #1724 - Added options to attribute updates (#1725) (#1748) * Fix for #1724 - Added options to attribute updates * Fix for #1724 - Added unit tests for options --- lib/relation-definition.js | 6 ++-- test/relations.test.js | 66 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 3 deletions(-) diff --git a/lib/relation-definition.js b/lib/relation-definition.js index 6d31e025..e0496f3c 100644 --- a/lib/relation-definition.js +++ b/lib/relation-definition.js @@ -2834,7 +2834,7 @@ EmbedsMany.prototype.destroyById = function(fkId, options, cb) { if (index > -1) embeddedList.splice(index, 1); if (typeof cb !== 'function') return; modelInstance.updateAttribute(propertyName, - embeddedList, function(err) { + embeddedList, context.options, function(err) { if (err) return cb(err); modelTo.notifyObserversOf('after delete', context, function(err) { cb(err); @@ -2873,11 +2873,11 @@ EmbedsMany.prototype.destroyAll = function(where, options, cb) { if (typeof cb === 'function') { modelInstance.updateAttribute(propertyName, - embeddedList, function(err) { + embeddedList, options || {}, function(err) { cb(err); }); } else { - modelInstance.setAttribute(propertyName, embeddedList); + modelInstance.setAttribute(propertyName, embeddedList, options || {}); } }; diff --git a/test/relations.test.js b/test/relations.test.js index 1d5b0970..f5e188a0 100644 --- a/test/relations.test.js +++ b/test/relations.test.js @@ -4980,6 +4980,72 @@ describe('relations', function() { }); }); + it('should pass options when removed by id', function(done) { + const verifyOptions = function(ctx, next) { + if (!ctx.options || !ctx.options.verify) { + return next(new Error('options or options.verify is missing')); + } + return next(); + }; + Person.observe('before save', verifyOptions); + Person.findOne(function(err, p) { + p.addressList.create({street: 'options 1'}, {verify: true}, function(err, address) { + if (err) { + Person.clearObservers('before save'); + return done(err); + } + p.addressList.destroy(address.id, {verify: true}, function(err) { + if (err) { + Person.clearObservers('before save'); + return done(err); + } + Person.findById(p.id, function(err, verify) { + if (err) { + Person.clearObservers('before save'); + return done(err); + } + verify.addresses.should.have.length(1); + Person.clearObservers('before save'); + done(); + }); + }); + }); + }); + }); + + it('should pass options when removed by where', function(done) { + const verifyOptions = function(ctx, next) { + if (!ctx.options || !ctx.options.verify) { + return next(new Error('options or options.verify is missing')); + } + return next(); + }; + Person.observe('before save', verifyOptions); + Person.findOne(function(err, p) { + p.addressList.create({street: 'options 2'}, {verify: true}, function(err, address) { + if (err) { + Person.clearObservers('before save'); + return done(err); + } + p.addressList.destroyAll({street: 'options 2'}, {verify: true}, function(err) { + if (err) { + Person.clearObservers('before save'); + return done(err); + } + Person.findById(p.id, function(err, verify) { + if (err) { + Person.clearObservers('before save'); + return done(err); + } + verify.addresses.should.have.length(1); + Person.clearObservers('before save'); + done(); + }); + }); + }); + }); + }); + // eslint-disable-next-line mocha/no-identical-title it('should create embedded items on scope', function(done) { Person.findOne(function(err, p) {