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

Commit 4262ed5d by Mick Hansen

rewrite transaction locking tests to promises

1 parent bb3a6245
Showing with 61 additions and 58 deletions
...@@ -121,8 +121,7 @@ describe(Support.getTestDialectTeaser('Transaction'), function() { ...@@ -121,8 +121,7 @@ describe(Support.getTestDialectTeaser('Transaction'), function() {
if (current.dialect.supports.lock) { if (current.dialect.supports.lock) {
describe('row locking', function () { describe('row locking', function () {
this.timeout(10000); it('supports for update', function() {
it('supports for update', function(done) {
var User = this.sequelize.define('user', { var User = this.sequelize.define('user', {
username: Support.Sequelize.STRING, username: Support.Sequelize.STRING,
awesome: Support.Sequelize.BOOLEAN awesome: Support.Sequelize.BOOLEAN
...@@ -131,10 +130,10 @@ describe(Support.getTestDialectTeaser('Transaction'), function() { ...@@ -131,10 +130,10 @@ describe(Support.getTestDialectTeaser('Transaction'), function() {
, t1Spy = sinon.spy() , t1Spy = sinon.spy()
, t2Spy = sinon.spy(); , t2Spy = sinon.spy();
this.sequelize.sync({ force: true }).then(function() { return this.sequelize.sync({ force: true }).then(function() {
return User.create({ username: 'jan'}); return User.create({ username: 'jan'});
}).then(function() { }).then(function() {
self.sequelize.transaction().then(function(t1) { return self.sequelize.transaction().then(function(t1) {
return User.find({ return User.find({
where: { where: {
username: 'jan' username: 'jan'
...@@ -143,37 +142,40 @@ describe(Support.getTestDialectTeaser('Transaction'), function() { ...@@ -143,37 +142,40 @@ describe(Support.getTestDialectTeaser('Transaction'), function() {
lock: t1.LOCK.UPDATE, lock: t1.LOCK.UPDATE,
transaction: t1 transaction: t1
}).then(function(t1Jan) { }).then(function(t1Jan) {
self.sequelize.transaction({ return self.sequelize.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED
}).then(function(t2) { }).then(function(t2) {
User.find({ return Promise.join(
where: { User.find({
username: 'jan' where: {
} username: 'jan'
}, { }
lock: t2.LOCK.UPDATE, }, {
transaction: t2 lock: t2.LOCK.UPDATE,
}).then(function() { transaction: t2
t2Spy(); }).then(function() {
t2.commit().then(function() { t2Spy();
expect(t2Spy).to.have.been.calledAfter(t1Spy); // Find should not succeed before t1 has comitted return t2.commit().then(function() {
done(); expect(t2Spy).to.have.been.calledAfter(t1Spy); // Find should not succeed before t1 has comitted
}); });
}); }),
t1Jan.updateAttributes({ t1Jan.updateAttributes({
awesome: true awesome: true
}, { transaction: t1}).then(function() { }, { transaction: t1}).then(function() {
t1Spy(); t1Spy();
setTimeout(t1.commit.bind(t1), 2000); Promise.delay(2000).then(function () {
}); return t1.commit();
});
})
);
}); });
}); });
}); });
}); });
}); });
it('supports for share', function(done) { it('supports for share', function() {
var User = this.sequelize.define('user', { var User = this.sequelize.define('user', {
username: Support.Sequelize.STRING, username: Support.Sequelize.STRING,
awesome: Support.Sequelize.BOOLEAN awesome: Support.Sequelize.BOOLEAN
...@@ -183,10 +185,10 @@ describe(Support.getTestDialectTeaser('Transaction'), function() { ...@@ -183,10 +185,10 @@ describe(Support.getTestDialectTeaser('Transaction'), function() {
, t2FindSpy = sinon.spy() , t2FindSpy = sinon.spy()
, t2UpdateSpy = sinon.spy(); , t2UpdateSpy = sinon.spy();
this.sequelize.sync({ force: true }).then(function() { return this.sequelize.sync({ force: true }).then(function() {
return User.create({ username: 'jan'}); return User.create({ username: 'jan'});
}).then(function() { }).then(function() {
self.sequelize.transaction().then(function(t1) { return self.sequelize.transaction().then(function(t1) {
return User.find({ return User.find({
where: { where: {
username: 'jan' username: 'jan'
...@@ -195,40 +197,41 @@ describe(Support.getTestDialectTeaser('Transaction'), function() { ...@@ -195,40 +197,41 @@ describe(Support.getTestDialectTeaser('Transaction'), function() {
lock: t1.LOCK.SHARE, lock: t1.LOCK.SHARE,
transaction: t1 transaction: t1
}).then(function(t1Jan) { }).then(function(t1Jan) {
self.sequelize.transaction({ return self.sequelize.transaction({
isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED isolationLevel: Transaction.ISOLATION_LEVELS.READ_COMMITTED
}).then(function(t2) { }).then(function(t2) {
User.find({ return Promise.join(
where: { User.find({
username: 'jan' where: {
} username: 'jan'
}, { transaction: t2}).then(function(t2Jan) { }
t2FindSpy(); }, { transaction: t2}).then(function(t2Jan) {
t2FindSpy();
t2Jan.updateAttributes({
awesome: false return t2Jan.updateAttributes({
awesome: false
}, {
transaction: t2
}).then(function() {
t2UpdateSpy();
return t2.commit().then(function() {
expect(t2FindSpy).to.have.been.calledBefore(t1Spy); // The find call should have returned
expect(t2UpdateSpy).to.have.been.calledAfter(t1Spy); // But the update call should not happen before the first transaction has committed
});
});
}),
t1Jan.updateAttributes({
awesome: true
}, { }, {
transaction: t2 transaction: t1
}).then(function() { }).then(function() {
t2UpdateSpy(); return Promise.delay(2000).then(function () {
t2.commit().then(function() { t1Spy();
expect(t2FindSpy).to.have.been.calledBefore(t1Spy); // The find call should have returned return t1.commit();
expect(t2UpdateSpy).to.have.been.calledAfter(t1Spy); // But the update call should not happen before the first transaction has committed
done();
}); });
}); })
}); );
t1Jan.updateAttributes({
awesome: true
}, {
transaction: t1
}).then(function() {
setTimeout(function() {
t1Spy();
t1.commit();
}, 2000);
});
}); });
}); });
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!