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

Commit 5f4a5637 by Mick Hansen

Merge pull request #2605 from mbroadst/restrict-support

only enable RESTRICT fk constraint tests for supporting dialects
2 parents d5cef99f 8a12e05d
......@@ -11,6 +11,9 @@ AbstractDialect.prototype.supports = {
'VALUES ()': false,
'LIMIT ON UPDATE': false,
schemas: false,
constraints: {
restrict: true
},
index: {
collate: true,
length: false,
......
......@@ -6,6 +6,7 @@ var chai = require('chai')
, Sequelize = require('../../index')
, Promise = Sequelize.Promise
, assert = require('assert')
, current = Support.sequelize;
chai.config.includeStack = true
......@@ -428,6 +429,7 @@ describe(Support.getTestDialectTeaser("BelongsTo"), function() {
})
})
if (current.dialect.supports.constraints.restrict) {
it("can restrict deletes", function(done) {
var self = this
var Task = this.sequelize.define('Task', { title: DataTypes.STRING })
......@@ -453,11 +455,12 @@ describe(Support.getTestDialectTeaser("BelongsTo"), function() {
})
})
it("can cascade updates", function(done) {
it("can restrict updates", function(done) {
var self = this
var Task = this.sequelize.define('Task', { title: DataTypes.STRING })
, User = this.sequelize.define('User', { username: DataTypes.STRING })
Task.belongsTo(User, {onUpdate: 'cascade'})
Task.belongsTo(User, {onUpdate: 'restrict'})
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
......@@ -470,10 +473,10 @@ describe(Support.getTestDialectTeaser("BelongsTo"), function() {
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.Model)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() {
.catch(self.sequelize.ForeignKeyConstraintError, function() {
// Should fail due to FK restriction
Task.findAll().success(function(tasks) {
expect(tasks).to.have.length(1)
expect(tasks[0].UserId).to.equal(999)
done()
})
})
......@@ -483,12 +486,13 @@ describe(Support.getTestDialectTeaser("BelongsTo"), function() {
})
})
it("can restrict updates", function(done) {
var self = this
}
it("can cascade updates", function(done) {
var Task = this.sequelize.define('Task', { title: DataTypes.STRING })
, User = this.sequelize.define('User', { username: DataTypes.STRING })
Task.belongsTo(User, {onUpdate: 'restrict'})
Task.belongsTo(User, {onUpdate: 'cascade'})
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
......@@ -501,10 +505,10 @@ describe(Support.getTestDialectTeaser("BelongsTo"), function() {
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.Model)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.catch(self.sequelize.ForeignKeyConstraintError, function() {
// Should fail due to FK restriction
.success(function() {
Task.findAll().success(function(tasks) {
expect(tasks).to.have.length(1)
expect(tasks[0].UserId).to.equal(999)
done()
})
})
......@@ -513,6 +517,7 @@ describe(Support.getTestDialectTeaser("BelongsTo"), function() {
})
})
})
})
describe("Association column", function() {
......
......@@ -9,7 +9,8 @@ var chai = require('chai')
, _ = require('lodash')
, moment = require('moment')
, sinon = require('sinon')
, Promise = Sequelize.Promise;
, Promise = Sequelize.Promise
, current = Support.sequelize;
chai.config.includeStack = true;
......@@ -2252,57 +2253,58 @@ describe(Support.getTestDialectTeaser("HasMany"), function() {
});
});
it("can restrict deletes", function() {
var self = this;
it("can cascade updates", function() {
var Task = this.sequelize.define('Task', { title: DataTypes.STRING })
, User = this.sequelize.define('User', { username: DataTypes.STRING });
User.hasMany(Task, {onDelete: 'restrict'});
User.hasMany(Task, {onUpdate: 'cascade'});
return this.sequelize.sync({ force: true }).bind({}).then(function() {
return this.sequelize.sync({ force: true }).then(function () {
return Promise.all([
User.create({ username: 'foo' }),
Task.create({ title: 'task' }),
]);
}).spread(function (user, task) {
this.user = user;
this.task = task;
return user.setTasks([task]);
return user.setTasks([task]).return(user);
}).then(function(user) {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.Model);
return user.QueryInterface.update(user, tableName, {id: 999}, user.id);
}).then(function() {
return this.user.destroy().catch(self.sequelize.ForeignKeyConstraintError, function () {
// Should fail due to FK violation
return Task.findAll();
});
}).then(function(tasks) {
expect(tasks).to.have.length(1);
expect(tasks[0].UserId).to.equal(999);
});
});
it("can cascade updates", function() {
if (current.dialect.supports.constraints.restrict) {
it("can restrict deletes", function() {
var self = this;
var Task = this.sequelize.define('Task', { title: DataTypes.STRING })
, User = this.sequelize.define('User', { username: DataTypes.STRING });
User.hasMany(Task, {onUpdate: 'cascade'});
User.hasMany(Task, {onDelete: 'restrict'});
return this.sequelize.sync({ force: true }).then(function () {
return this.sequelize.sync({ force: true }).bind({}).then(function() {
return Promise.all([
User.create({ username: 'foo' }),
Task.create({ title: 'task' }),
]);
}).spread(function (user, task) {
return user.setTasks([task]).return(user);
}).then(function(user) {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.Model);
return user.QueryInterface.update(user, tableName, {id: 999}, user.id);
this.user = user;
this.task = task;
return user.setTasks([task]);
}).then(function() {
return this.user.destroy().catch(self.sequelize.ForeignKeyConstraintError, function () {
// Should fail due to FK violation
return Task.findAll();
});
}).then(function(tasks) {
expect(tasks).to.have.length(1);
expect(tasks[0].UserId).to.equal(999);
});
});
......@@ -2335,6 +2337,9 @@ describe(Support.getTestDialectTeaser("HasMany"), function() {
expect(tasks).to.have.length(1);
});
});
}
});
describe('n:m', function () {
......@@ -2382,6 +2387,8 @@ describe(Support.getTestDialectTeaser("HasMany"), function() {
});
});
if (current.dialect.supports.constraints.restrict) {
it("can restrict deletes both ways", function () {
var self = this
, spy = sinon.spy();
......@@ -2452,6 +2459,8 @@ describe(Support.getTestDialectTeaser("HasMany"), function() {
});
});
}
it("should be possible to remove all constraints", function () {
var self = this;
......
......@@ -4,6 +4,7 @@ var chai = require('chai')
, Support = require(__dirname + '/../support')
, Sequelize = require('../../index')
, Promise = Sequelize.Promise
, current = Support.sequelize;
chai.config.includeStack = true
......@@ -386,22 +387,28 @@ describe(Support.getTestDialectTeaser("HasOne"), function() {
})
})
it("can restrict deletes", function(done) {
var self = this
it("can cascade updates", function(done) {
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasOne(Task, {onDelete: 'restrict'})
User.hasOne(Task, {onUpdate: 'cascade'})
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask(task).success(function() {
user.destroy().catch(self.sequelize.ForeignKeyConstraintError, function() {
// Should fail due to FK restriction
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.Model)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() {
Task.findAll().success(function(tasks) {
expect(tasks).to.have.length(1)
expect(tasks[0].UserId).to.equal(999)
done()
})
})
......@@ -412,28 +419,24 @@ describe(Support.getTestDialectTeaser("HasOne"), function() {
})
})
it("can cascade updates", function(done) {
if (current.dialect.supports.constraints.restrict) {
it("can restrict deletes", function(done) {
var self = this
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasOne(Task, {onUpdate: 'cascade'})
User.hasOne(Task, {onDelete: 'restrict'})
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask(task).success(function() {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.Model)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() {
user.destroy().catch(self.sequelize.ForeignKeyConstraintError, function() {
// Should fail due to FK restriction
Task.findAll().success(function(tasks) {
expect(tasks).to.have.length(1)
expect(tasks[0].UserId).to.equal(999)
done()
})
})
......@@ -477,6 +480,8 @@ describe(Support.getTestDialectTeaser("HasOne"), function() {
})
})
}
})
describe("Association column", function() {
......
......@@ -244,7 +244,7 @@ describe(Support.getTestDialectTeaser("QueryInterface"), function () {
references: 'level',
referenceKey: 'id',
onUpdate: 'cascade',
onDelete: 'restrict'
onDelete: 'set null'
});
});
});
......@@ -292,7 +292,7 @@ describe(Support.getTestDialectTeaser("QueryInterface"), function () {
references: 'users',
referenceKey: 'id',
onUpdate: 'cascade',
onDelete: 'restrict'
onDelete: 'set null'
},
})
})
......@@ -308,7 +308,7 @@ describe(Support.getTestDialectTeaser("QueryInterface"), function () {
if (dialect === "postgres" || dialect === "postgres-native") {
expect(keys).to.have.length(6)
expect(keys2).to.have.length(7)
expect(keys3).to.have.length(8)
expect(keys3).to.have.length(7)
} else if (dialect === "sqlite") {
expect(keys).to.have.length(8)
} else if (dialect === "mysql") {
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!