不要怂,就是干,撸起袖子干!

Commit eb9c2026 by Mick Hansen

Merge pull request #1233 from saschagehlich/bugfix/inverted-validation-skip-logic

Validation skipping logic was inverted. Fixed #1169
2 parents 3ab445f3 f5066366
...@@ -870,9 +870,14 @@ module.exports = (function() { ...@@ -870,9 +870,14 @@ module.exports = (function() {
options.fields = newFields || options.fields options.fields = newFields || options.fields
if (options.validate === true) { if (options.validate === true) {
if (options.fields.length) {
var skippedFields = Utils._.difference(Object.keys(self.attributes), options.fields);
}
if (options.hooks === true) { if (options.hooks === true) {
var iterate = function(i) { var iterate = function(i) {
daos[i].hookValidate({skip: options.fields}).error(function(err) {
daos[i].hookValidate({skip: skippedFields}).error(function(err) {
errors[errors.length] = {record: v, errors: err} errors[errors.length] = {record: v, errors: err}
i++ i++
if (i > daos.length) { if (i > daos.length) {
...@@ -887,7 +892,7 @@ module.exports = (function() { ...@@ -887,7 +892,7 @@ module.exports = (function() {
} }
} else { } else {
daos.forEach(function(v) { daos.forEach(function(v) {
var valid = v.validate({skip: options.fields}) var valid = v.validate({skip: skippedFields})
if (valid !== null) { if (valid !== null) {
errors[errors.length] = {record: v, errors: valid} errors[errors.length] = {record: v, errors: valid}
} }
...@@ -1145,7 +1150,12 @@ module.exports = (function() { ...@@ -1145,7 +1150,12 @@ module.exports = (function() {
if (options.validate === true) { if (options.validate === true) {
var build = self.build(attrValueHash) var build = self.build(attrValueHash)
build.hookValidate({skip: Object.keys(attrValueHash)}).error(function(err) {
// We want to skip validations for all other fields
var updatedFields = Object.keys(attrValueHash)
var skippedFields = Utils._.difference(Object.keys(self.attributes), updatedFields)
build.hookValidate({skip: skippedFields}).error(function(err) {
emitter.emit('error', err) emitter.emit('error', err)
}).success(function(attributes) { }).success(function(attributes) {
if (!!attributes && !!attributes.dataValues) { if (!!attributes && !!attributes.dataValues) {
......
...@@ -71,7 +71,7 @@ var validateAttributes = function() { ...@@ -71,7 +71,7 @@ var validateAttributes = function() {
Utils._.each(this.model.rawAttributes, function(rawAttribute, field) { Utils._.each(this.model.rawAttributes, function(rawAttribute, field) {
var value = self.model.dataValues[field] || undefined var value = self.model.dataValues[field] || undefined
, hasAllowedNull = ((rawAttribute === undefined || rawAttribute.allowNull === true) && ((value === null) || (value === undefined))) , hasAllowedNull = ((rawAttribute === undefined || rawAttribute.allowNull === true) && ((value === null) || (value === undefined)))
, isSkipped = self.options.skip.length > 0 && self.options.skip.indexOf(field) === -1 , isSkipped = self.options.skip.length > 0 && self.options.skip.indexOf(field) !== -1
if (self.model.validators.hasOwnProperty(field) && !hasAllowedNull && !isSkipped) { if (self.model.validators.hasOwnProperty(field) && !hasAllowedNull && !isSkipped) {
errors = Utils._.merge(errors, validateAttribute.call(self, value, field)) errors = Utils._.merge(errors, validateAttribute.call(self, value, field))
......
...@@ -597,7 +597,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () { ...@@ -597,7 +597,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it('should allow blank creates (with timestamps: false)', function (done) { it('should allow blank creates (with timestamps: false)', function (done) {
var Worker = this.sequelize.define('Worker', {}, {timestamps: false}) var Worker = this.sequelize.define('Worker', {}, {timestamps: false})
Worker.sync().done(function(err) { Worker.sync().done(function(err) {
Worker.create({}, {fields: []}).done(function (err, worker) { Worker.create({}, {fields: []}).done(function (err, worker) {
expect(err).not.to.be.ok expect(err).not.to.be.ok
expect(worker).to.be.ok expect(worker).to.be.ok
...@@ -608,7 +608,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () { ...@@ -608,7 +608,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it('should allow truly blank creates', function (done) { it('should allow truly blank creates', function (done) {
var Worker = this.sequelize.define('Worker', {}, {timestamps: false}) var Worker = this.sequelize.define('Worker', {}, {timestamps: false})
Worker.sync().done(function(err) { Worker.sync().done(function(err) {
Worker.create({}, {fields: []}).done(function (err, worker) { Worker.create({}, {fields: []}).done(function (err, worker) {
expect(err).not.to.be.ok expect(err).not.to.be.ok
expect(worker).to.be.ok expect(worker).to.be.ok
...@@ -896,7 +896,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () { ...@@ -896,7 +896,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it('should allow blank arrays (return immediatly)', function (done) { it('should allow blank arrays (return immediatly)', function (done) {
var Worker = this.sequelize.define('Worker', {}) var Worker = this.sequelize.define('Worker', {})
Worker.sync().done(function(err) { Worker.sync().done(function(err) {
Worker.bulkCreate([]).done(function (err, workers) { Worker.bulkCreate([]).done(function (err, workers) {
expect(err).not.to.be.ok expect(err).not.to.be.ok
expect(workers).to.be.ok expect(workers).to.be.ok
...@@ -908,7 +908,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () { ...@@ -908,7 +908,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it('should allow blank creates (with timestamps: false)', function (done) { it('should allow blank creates (with timestamps: false)', function (done) {
var Worker = this.sequelize.define('Worker', {}, {timestamps: false}) var Worker = this.sequelize.define('Worker', {}, {timestamps: false})
Worker.sync().done(function(err) { Worker.sync().done(function(err) {
Worker.bulkCreate([{}, {}]).done(function (err, workers) { Worker.bulkCreate([{}, {}]).done(function (err, workers) {
expect(err).not.to.be.ok expect(err).not.to.be.ok
expect(workers).to.be.ok expect(workers).to.be.ok
...@@ -919,7 +919,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () { ...@@ -919,7 +919,7 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
it('should allow autoincremented attributes to be set', function (done) { it('should allow autoincremented attributes to be set', function (done) {
var Worker = this.sequelize.define('Worker', {}, {timestamps: false}) var Worker = this.sequelize.define('Worker', {}, {timestamps: false})
Worker.sync().done(function(err) { Worker.sync().done(function(err) {
Worker.bulkCreate([ Worker.bulkCreate([
{id: 5}, {id: 5},
{id: 10} {id: 10}
...@@ -953,4 +953,4 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () { ...@@ -953,4 +953,4 @@ describe(Support.getTestDialectTeaser("DAOFactory"), function () {
}) })
}) })
}) })
}) })
\ No newline at end of file
...@@ -562,5 +562,24 @@ describe(Support.getTestDialectTeaser("DaoValidator"), function() { ...@@ -562,5 +562,24 @@ describe(Support.getTestDialectTeaser("DaoValidator"), function() {
expect(errors.field).to.have.length(1) expect(errors.field).to.have.length(1)
expect(errors.field[0]).to.equal("Unexpected value or invalid argument: field") expect(errors.field[0]).to.equal("Unexpected value or invalid argument: field")
}) })
it('skips validations for the given fields', function() {
var values = ['value1', 'value2']
var Bar = this.sequelize.define('Bar' + config.rand(), {
field: {
type: Sequelize.ENUM,
values: values,
validate: {
isIn: [values]
}
}
})
var failingBar = Bar.build({ field: 'value3' })
, errors = failingBar.validate({ skip: ['field'] })
expect(errors).to.be.null
})
}) })
}) })
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!