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

Commit 49efe137 by Ruben Bridgewater

Refactor all instance tests and fix a couple of weird tests

1 parent 02a0e8e5
Showing with 406 additions and 564 deletions
...@@ -18,7 +18,7 @@ chai.use(datetime); ...@@ -18,7 +18,7 @@ chai.use(datetime);
chai.config.includeStack = true; chai.config.includeStack = true;
describe(Support.getTestDialectTeaser('Instance'), function() { describe(Support.getTestDialectTeaser('Instance'), function() {
beforeEach(function(done) { beforeEach(function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { type: DataTypes.STRING }, username: { type: DataTypes.STRING },
uuidv1: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV1 }, uuidv1: { type: DataTypes.UUID, defaultValue: DataTypes.UUIDV1 },
...@@ -49,64 +49,55 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -49,64 +49,55 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
defaultValue: false defaultValue: false
} }
}); });
this.User.sync({ force: true }).success(function() { return this.User.sync({ force: true });
done();
});
}); });
describe('Escaping', function() { describe('Escaping', function() {
it('is done properly for special characters', function(done) { it('is done properly for special characters', function() {
// Ideally we should test more: "\0\n\r\b\t\\\'\"\x1a" // Ideally we should test more: "\0\n\r\b\t\\\'\"\x1a"
// But this causes sqlite to fail and exits the entire test suite immediately // But this causes sqlite to fail and exits the entire test suite immediately
var bio = dialect + "'\"\n" // Need to add the dialect here so in case of failure I know what DB it failed for var bio = dialect + "'\"\n" // Need to add the dialect here so in case of failure I know what DB it failed for
, self = this; , self = this;
this.User.create({ username: bio }).success(function(u1) { return this.User.create({ username: bio }).then(function(u1) {
self.User.find(u1.id).success(function(u2) { return self.User.find(u1.id).then(function(u2) {
expect(u2.username).to.equal(bio); expect(u2.username).to.equal(bio);
done();
}); });
}).error(function(err) {
done(err);
}); });
}); });
}); });
describe('isNewRecord', function() { describe('isNewRecord', function() {
it('returns true for non-saved objects', function(done) { it('returns true for non-saved objects', function() {
var user = this.User.build({ username: 'user' }); var user = this.User.build({ username: 'user' });
expect(user.id).to.be.null; expect(user.id).to.be.null;
expect(user.isNewRecord).to.be.ok; expect(user.isNewRecord).to.be.ok;
done();
}); });
it('returns false for saved objects', function(done) { it('returns false for saved objects', function() {
this.User.build({ username: 'user' }).save().success(function(user) { return this.User.build({ username: 'user' }).save().then(function(user) {
expect(user.isNewRecord).to.not.be.ok; expect(user.isNewRecord).to.not.be.ok;
done();
}); });
}); });
it('returns false for created objects', function(done) { it('returns false for created objects', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
expect(user.isNewRecord).to.not.be.ok; expect(user.isNewRecord).to.not.be.ok;
done();
}); });
}); });
it('returns false for objects found by find method', function(done) { it('returns false for objects found by find method', function() {
var self = this; var self = this;
this.User.create({ username: 'user' }).success(function() { return this.User.create({ username: 'user' }).then(function() {
self.User.create({ username: 'user' }).success(function(user) { return self.User.create({ username: 'user' }).then(function(user) {
self.User.find(user.id).success(function(user) { return self.User.find(user.id).then(function(user) {
expect(user.isNewRecord).to.not.be.ok; expect(user.isNewRecord).to.not.be.ok;
done();
}); });
}); });
}); });
}); });
it('returns false for objects found by findAll method', function(done) { it('returns false for objects found by findAll method', function() {
var self = this var self = this
, users = []; , users = [];
...@@ -114,148 +105,131 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -114,148 +105,131 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
users[users.length] = {username: 'user'}; users[users.length] = {username: 'user'};
} }
this.User.bulkCreate(users).success(function() { return this.User.bulkCreate(users).then(function() {
self.User.findAll().success(function(users) { return self.User.findAll().then(function(users) {
users.forEach(function(u) { users.forEach(function(u) {
expect(u.isNewRecord).to.not.be.ok; expect(u.isNewRecord).to.not.be.ok;
}); });
done();
}); });
}); });
}); });
}); });
describe('isDirty', function() { describe('isDirty', function() {
it('returns true for non-saved objects', function(done) { it('returns true for non-saved objects', function() {
var user = this.User.build({ username: 'user' }); var user = this.User.build({ username: 'user' });
expect(user.id).to.be.null; expect(user.id).to.be.null;
expect(user.isDirty).to.be.true; expect(user.isDirty).to.be.true;
done();
}); });
it('returns false for saved objects', function(done) { it('returns false for saved objects', function() {
this.User.build({ username: 'user' }).save().success(function(user) { return this.User.build({ username: 'user' }).save().then(function(user) {
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
it('returns true for changed attribute', function(done) { it('returns true for changed attribute', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
user.username = 'new'; user.username = 'new';
expect(user.isDirty).to.be.true; expect(user.isDirty).to.be.true;
done();
}); });
}); });
it('returns false for non-changed attribute', function(done) { it('returns false for non-changed attribute', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
user.username = 'user'; user.username = 'user';
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
it('returns false for non-changed date attribute', function(done) { it('returns false for non-changed date attribute', function() {
this.User.create({ aDate: new Date(2013, 6, 31, 14, 25, 21) }).success(function(user) { return this.User.create({ aDate: new Date(2013, 6, 31, 14, 25, 21) }).then(function(user) {
user.aDate = '2013-07-31 14:25:21'; user.aDate = '2013-07-31 14:25:21';
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
// In my opinion this is bad logic, null is different from an empty string // In my opinion this is bad logic, null is different from an empty string
it.skip('returns false for two empty attributes', function(done) { it.skip('returns false for two empty attributes', function() {
this.User.create({ username: null }).success(function(user) { return this.User.create({ username: null }).then(function(user) {
user.username = ''; user.username = '';
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
it('returns true for bulk changed attribute', function(done) { it('returns true for bulk changed attribute', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
user.setAttributes({ user.setAttributes({
username: 'new', username: 'new',
aNumber: 1 aNumber: 1
}); });
expect(user.isDirty).to.be.true; expect(user.isDirty).to.be.true;
done();
}); });
}); });
it('returns true for bulk non-changed attribute + model with timestamps', function(done) { it('returns true for bulk non-changed attribute + model with timestamps', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
user.setAttributes({ user.setAttributes({
username: 'user' username: 'user'
}); });
expect(user.isDirty).to.be.true;
expect(user.isDirty).to.be.rue;
done();
}); });
}); });
it('returns false for bulk non-changed attribute + model without timestamps', function(done) { it('returns false for bulk non-changed attribute + model without timestamps', function() {
var User = this.sequelize.define('User' + parseInt(Math.random() * 10000000), { var User = this.sequelize.define('User' + parseInt(Math.random() * 10000000), {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
timestamps: false timestamps: false
}); });
User return User
.sync({ force: true }) .sync({ force: true })
.then(function() { .then(function() {
return User.create({ username: 'user' }); return User.create({ username: 'user' });
}) })
.then(function(user) { .then(function(user) {
user.setAttributes({ username: 'user' });
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
return user.setAttributes({ username: 'user' });
})
.then(function() {
done();
}); });
}); });
it('returns true for changed and bulk non-changed attribute', function(done) { it('returns true for changed and bulk non-changed attribute', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
user.aNumber = 23; user.aNumber = 23;
user.setAttributes({ user.setAttributes({
username: 'user' username: 'user'
}); });
expect(user.isDirty).to.be.true; expect(user.isDirty).to.be.true;
done();
}); });
}); });
it('returns true for changed attribute and false for saved object', function(done) { it('returns true for changed attribute and false for saved object', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
user.username = 'new'; user.username = 'new';
expect(user.isDirty).to.be.true; expect(user.isDirty).to.be.true;
user.save().success(function() { return user.save().then(function() {
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
}); });
it('returns false for created objects', function(done) { it('returns false for created objects', function() {
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
it('returns false for objects found by find method', function(done) { it('returns false for objects found by find method', function() {
var self = this; var self = this;
this.User.create({ username: 'user' }).success(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
self.User.find(user.id).success(function(user) { return self.User.find(user.id).then(function(user) {
expect(user.isDirty).to.be.false; expect(user.isDirty).to.be.false;
done();
}); });
}); });
}); });
it('returns false for objects found by findAll method', function(done) { it('returns false for objects found by findAll method', function() {
var self = this var self = this
, users = []; , users = [];
...@@ -263,38 +237,35 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -263,38 +237,35 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
users[users.length] = {username: 'user'}; users[users.length] = {username: 'user'};
} }
this.User.bulkCreate(users).success(function() { return this.User.bulkCreate(users).then(function() {
self.User.findAll().success(function(users) { return self.User.findAll().then(function(users) {
users.forEach(function(u) { users.forEach(function(u) {
expect(u.isDirty).to.be.false; expect(u.isDirty).to.be.false;
}); });
done();
}); });
}); });
}); });
}); });
describe('increment', function() { describe('increment', function() {
beforeEach(function(done) { beforeEach(function() {
this.User.create({ id: 1, aNumber: 0, bNumber: 0 }).complete(function() { return this.User.create({ id: 1, aNumber: 0, bNumber: 0 });
done();
});
}); });
if (current.dialect.supports.transactions) { if (current.dialect.supports.transactions) {
it('supports transactions', function(done) { it('supports transactions', function() {
Support.prepareTransactionTest(this.sequelize, function(sequelize) { return Support.prepareTransactionTest(this.sequelize).bind({}).then(function(sequelize) {
var User = sequelize.define('User', { number: Support.Sequelize.INTEGER }); var User = sequelize.define('User', { number: Support.Sequelize.INTEGER });
User.sync({ force: true }).success(function() { return User.sync({ force: true }).then(function() {
User.create({ number: 1 }).success(function(user) { return User.create({ number: 1 }).then(function(user) {
sequelize.transaction().then(function(t) { return sequelize.transaction().then(function(t) {
user.increment('number', { by: 2, transaction: t }).success(function() { return user.increment('number', { by: 2, transaction: t }).then(function() {
User.all().success(function(users1) { return User.findAll().then(function(users1) {
User.all({ transaction: t }).success(function(users2) { return User.findAll({ transaction: t }).then(function(users2) {
expect(users1[0].number).to.equal(1); expect(users1[0].number).to.equal(1);
expect(users2[0].number).to.equal(3); expect(users2[0].number).to.equal(3);
t.rollback().success(function() { done(); }); return t.rollback();
}); });
}); });
}); });
...@@ -305,66 +276,61 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -305,66 +276,61 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
} }
it('supports where conditions', function(done) { it('supports where conditions', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.increment(['aNumber'], { by: 2, where: { bNumber: 1 } }).complete(function() { return user1.increment(['aNumber'], { by: 2, where: { bNumber: 1 } }).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(0); expect(user3.aNumber).to.be.equal(0);
done();
}); });
}); });
}); });
}); });
it('with array', function(done) { it('with array', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(err, user1) {
user1.increment(['aNumber'], { by: 2 }).complete(function() { return user1.increment(['aNumber'], { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(2); expect(user3.aNumber).to.be.equal(2);
done();
}); });
}); });
}); });
}); });
it('with single field', function(done) { it('with single field', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.increment('aNumber', { by: 2 }).complete(function() { return user1.increment('aNumber', { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(2); expect(user3.aNumber).to.be.equal(2);
done();
}); });
}); });
}); });
}); });
it('with single field and no value', function(done) { it('with single field and no value', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.increment('aNumber').complete(function() { return user1.increment('aNumber').then(function() {
self.User.find(1).complete(function(err, user2) { return self.User.find(1).then(function(user2) {
expect(user2.aNumber).to.be.equal(1); expect(user2.aNumber).to.be.equal(1);
done();
}); });
}); });
}); });
}); });
it('should still work right with other concurrent updates', function(done) { it('should still work right with other concurrent updates', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
// Select the user again (simulating a concurrent query) // Select the user again (simulating a concurrent query)
self.User.find(1).complete(function(err, user2) { return self.User.find(1).then(function(user2) {
user2.updateAttributes({ return user2.updateAttributes({
aNumber: user2.aNumber + 1 aNumber: user2.aNumber + 1
}).complete(function() { }).then(function() {
user1.increment(['aNumber'], { by: 2 }).complete(function() { return user1.increment(['aNumber'], { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user5) { return self.User.find(1).then(function(user5) {
expect(user5.aNumber).to.be.equal(3); expect(user5.aNumber).to.be.equal(3);
done();
}); });
}); });
}); });
...@@ -372,75 +338,72 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -372,75 +338,72 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('should still work right with other concurrent increments', function(done) { it('should still work right with other concurrent increments', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
var _done = _.after(3, function() { return user1.increment(['aNumber'], { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user2) { return user1.increment(['aNumber'], { by: 2 });
}).then(function() {
return user1.increment(['aNumber'], { by: 2 });
}).then(function() {
return self.User.find(1).then(function(user2) {
expect(user2.aNumber).to.equal(6); expect(user2.aNumber).to.equal(6);
done();
}); });
}); });
user1.increment(['aNumber'], { by: 2 }).complete(_done);
user1.increment(['aNumber'], { by: 2 }).complete(_done);
user1.increment(['aNumber'], { by: 2 }).complete(_done);
}); });
}); });
it('with key value pair', function(done) { it('with key value pair', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.increment({ 'aNumber': 1, 'bNumber': 2 }).success(function() { return user1.increment({ 'aNumber': 1, 'bNumber': 2 }).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(1); expect(user3.aNumber).to.be.equal(1);
expect(user3.bNumber).to.be.equal(2); expect(user3.bNumber).to.be.equal(2);
done();
}); });
}); });
}); });
}); });
it('with timestamps set to true', function(done) { it('with timestamps set to true', function() {
var User = this.sequelize.define('IncrementUser', { var User = this.sequelize.define('IncrementUser', {
aNumber: DataTypes.INTEGER aNumber: DataTypes.INTEGER
}, { timestamps: true }); }, { timestamps: true });
User.sync({ force: true }).success(function() { return User.sync({ force: true }).then(function() {
User.create({aNumber: 1}).success(function(user) { return User.create({aNumber: 1}).then(function(user) {
var oldDate = user.updatedAt; var oldDate = user.updatedAt;
setTimeout(function() { return this.sequelize.Promise.delay(1000).then(function() {
user.increment('aNumber', { by: 1 }).success(function() { return user.increment('aNumber', { by: 1 }).then(function() {
User.find(1).success(function(user) { return User.find(1).then(function(user) {
expect(user.updatedAt).to.be.afterTime(oldDate); expect(user.updatedAt).to.be.afterTime(oldDate);
done();
}); });
}); });
}, 1000); });
}); });
}); });
}); });
}); });
describe('decrement', function() { describe('decrement', function() {
beforeEach(function(done) { beforeEach(function() {
this.User.create({ id: 1, aNumber: 0, bNumber: 0 }).complete(done); return this.User.create({ id: 1, aNumber: 0, bNumber: 0 });
}); });
if (current.dialect.supports.transactions) { if (current.dialect.supports.transactions) {
it('supports transactions', function(done) { it('supports transactions', function() {
Support.prepareTransactionTest(this.sequelize, function(sequelize) { return Support.prepareTransactionTest(this.sequelize).bind({}).then(function(sequelize) {
var User = sequelize.define('User', { number: Support.Sequelize.INTEGER }); var User = sequelize.define('User', { number: Support.Sequelize.INTEGER });
User.sync({ force: true }).success(function() { return User.sync({ force: true }).then(function() {
User.create({ number: 3 }).success(function(user) { return User.create({ number: 3 }).then(function(user) {
sequelize.transaction().then(function(t) { return sequelize.transaction().then(function(t) {
user.decrement('number', { by: 2, transaction: t }).success(function() { return user.decrement('number', { by: 2, transaction: t }).then(function() {
User.all().success(function(users1) { return User.findAll().then(function(users1) {
User.all({ transaction: t }).success(function(users2) { return User.findAll({ transaction: t }).then(function(users2) {
expect(users1[0].number).to.equal(3); expect(users1[0].number).to.equal(3);
expect(users2[0].number).to.equal(1); expect(users2[0].number).to.equal(1);
t.rollback().success(function() { done(); }); return t.rollback();
}); });
}); });
}); });
...@@ -451,54 +414,50 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -451,54 +414,50 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
} }
it('with array', function(done) { it('with array', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.decrement(['aNumber'], { by: 2 }).complete(function() { return user1.decrement(['aNumber'], { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(-2); expect(user3.aNumber).to.be.equal(-2);
done();
}); });
}); });
}); });
}); });
it('with single field', function(done) { it('with single field', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.decrement('aNumber', { by: 2 }).complete(function() { return user1.decrement('aNumber', { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(-2); expect(user3.aNumber).to.be.equal(-2);
done();
}); });
}); });
}); });
}); });
it('with single field and no value', function(done) { it('with single field and no value', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.decrement('aNumber').complete(function() { return user1.decrement('aNumber').then(function() {
self.User.find(1).complete(function(err, user2) { return self.User.find(1).then(function(user2) {
expect(user2.aNumber).to.be.equal(-1); expect(user2.aNumber).to.be.equal(-1);
done();
}); });
}); });
}); });
}); });
it('should still work right with other concurrent updates', function(done) { it('should still work right with other concurrent updates', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
// Select the user again (simulating a concurrent query) // Select the user again (simulating a concurrent query)
self.User.find(1).complete(function(err, user2) { return self.User.find(1).then(function(user2) {
user2.updateAttributes({ return user2.updateAttributes({
aNumber: user2.aNumber + 1 aNumber: user2.aNumber + 1
}).complete(function() { }).then(function() {
user1.decrement(['aNumber'], { by: 2 }).complete(function() { return user1.decrement(['aNumber'], { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user5) { return self.User.find(1).then(function(user5) {
expect(user5.aNumber).to.be.equal(-1); expect(user5.aNumber).to.be.equal(-1);
done();
}); });
}); });
}); });
...@@ -506,51 +465,48 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -506,51 +465,48 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('should still work right with other concurrent increments', function(done) { it('should still work right with other concurrent increments', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
var _done = _.after(3, function() { return user1.decrement(['aNumber'], { by: 2 }).then(function() {
self.User.find(1).complete(function(err, user2) { return user1.decrement(['aNumber'], { by: 2 });
}).then(function() {
return user1.decrement(['aNumber'], { by: 2 });
}).then(function() {
return self.User.find(1).then(function(user2) {
expect(user2.aNumber).to.equal(-6); expect(user2.aNumber).to.equal(-6);
done();
}); });
}); });
user1.decrement(['aNumber'], { by: 2 }).complete(_done);
user1.decrement(['aNumber'], { by: 2 }).complete(_done);
user1.decrement(['aNumber'], { by: 2 }).complete(_done);
}); });
}); });
it('with key value pair', function(done) { it('with key value pair', function() {
var self = this; var self = this;
this.User.find(1).complete(function(err, user1) { return this.User.find(1).then(function(user1) {
user1.decrement({ 'aNumber': 1, 'bNumber': 2}).complete(function() { return user1.decrement({ 'aNumber': 1, 'bNumber': 2}).then(function() {
self.User.find(1).complete(function(err, user3) { return self.User.find(1).then(function(user3) {
expect(user3.aNumber).to.be.equal(-1); expect(user3.aNumber).to.be.equal(-1);
expect(user3.bNumber).to.be.equal(-2); expect(user3.bNumber).to.be.equal(-2);
done();
}); });
}); });
}); });
}); });
it('with timestamps set to true', function(done) { it('with timestamps set to true', function() {
var User = this.sequelize.define('IncrementUser', { var User = this.sequelize.define('IncrementUser', {
aNumber: DataTypes.INTEGER aNumber: DataTypes.INTEGER
}, { timestamps: true }); }, { timestamps: true });
User.sync({ force: true }).success(function() { return User.sync({ force: true }).then(function() {
User.create({aNumber: 1}).success(function(user) { return User.create({aNumber: 1}).then(function(user) {
var oldDate = user.updatedAt; var oldDate = user.updatedAt;
setTimeout(function() { return this.sequelize.Promise.deplay(1000).then(function() {
user.decrement('aNumber', { by: 1 }).success(function() { return user.decrement('aNumber', { by: 1 }).then(function() {
User.find(1).success(function(user) { return User.find(1).then(function(user) {
expect(user.updatedAt).to.be.afterTime(oldDate); expect(user.updatedAt).to.be.afterTime(oldDate);
done();
}); });
}); });
}, 1000); });
}); });
}); });
}); });
...@@ -558,19 +514,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -558,19 +514,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
describe('reload', function() { describe('reload', function() {
if (current.dialect.supports.transactions) { if (current.dialect.supports.transactions) {
it('supports transactions', function(done) { it('supports transactions', function() {
Support.prepareTransactionTest(this.sequelize, function(sequelize) { return Support.prepareTransactionTest(this.sequelize).bind({}).then(function(sequelize) {
var User = sequelize.define('User', { username: Support.Sequelize.STRING }); var User = sequelize.define('User', { username: Support.Sequelize.STRING });
User.sync({ force: true }).success(function() { return User.sync({ force: true }).then(function() {
User.create({ username: 'foo' }).success(function(user) { return User.create({ username: 'foo' }).then(function(user) {
sequelize.transaction().then(function(t) { return sequelize.transaction().then(function(t) {
User.update({ username: 'bar' }, {where: {username: 'foo'}, transaction: t }).success(function() { return User.update({ username: 'bar' }, {where: {username: 'foo'}, transaction: t }).then(function() {
user.reload().success(function(user) { return user.reload().then(function(user) {
expect(user.username).to.equal('foo'); expect(user.username).to.equal('foo');
user.reload({ transaction: t }).success(function(user) { return user.reload({ transaction: t }).then(function(user) {
expect(user.username).to.equal('bar'); expect(user.username).to.equal('bar');
t.rollback().success(function() { done(); }); return t.rollback();
}); });
}); });
}); });
...@@ -581,82 +537,76 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -581,82 +537,76 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
} }
it('should return a reference to the same DAO instead of creating a new one', function(done) { it('should return a reference to the same DAO instead of creating a new one', function() {
this.User.create({ username: 'John Doe' }).complete(function(err, originalUser) { return this.User.create({ username: 'John Doe' }).then(function(originalUser) {
originalUser.updateAttributes({ username: 'Doe John' }).complete(function() { return originalUser.updateAttributes({ username: 'Doe John' }).then(function() {
originalUser.reload().complete(function(err, updatedUser) { return originalUser.reload().then(function(updatedUser) {
expect(originalUser === updatedUser).to.be.true; expect(originalUser === updatedUser).to.be.true;
done();
}); });
}); });
}); });
}); });
it('should update the values on all references to the DAO', function(done) { it('should update the values on all references to the DAO', function() {
var self = this; var self = this;
this.User.create({ username: 'John Doe' }).complete(function(err, originalUser) { return this.User.create({ username: 'John Doe' }).then(function(originalUser) {
self.User.find(originalUser.id).complete(function(err, updater) { return self.User.find(originalUser.id).then(function(updater) {
updater.updateAttributes({ username: 'Doe John' }).complete(function() { return updater.updateAttributes({ username: 'Doe John' }).then(function() {
// We used a different reference when calling updateAttributes, so originalUser is now out of sync // We used a different reference when calling updateAttributes, so originalUser is now out of sync
expect(originalUser.username).to.equal('John Doe'); expect(originalUser.username).to.equal('John Doe');
return originalUser.reload().then(function(updatedUser) {
originalUser.reload().complete(function(err, updatedUser) {
expect(originalUser.username).to.equal('Doe John'); expect(originalUser.username).to.equal('Doe John');
expect(updatedUser.username).to.equal('Doe John'); expect(updatedUser.username).to.equal('Doe John');
done();
}); });
}); });
}); });
}); });
}); });
it('should update read only attributes as well (updatedAt)', function(done) { it('should update read only attributes as well (updatedAt)', function() {
var self = this; var self = this;
this.User.create({ username: 'John Doe' }).complete(function(err, originalUser) { return this.User.create({ username: 'John Doe' }).then(function(originalUser) {
var originallyUpdatedAt = originalUser.updatedAt; var originallyUpdatedAt = originalUser.updatedAt;
// Wait for a second, so updatedAt will actually be different // Wait for a second, so updatedAt will actually be different
setTimeout(function() { return this.sequelize.Promise.delay(1000).then(function() {
self.User.find(originalUser.id).complete(function(err, updater) { return self.User.find(originalUser.id).then(function(updater) {
updater.updateAttributes({ username: 'Doe John' }).complete(function() { return updater.updateAttributes({ username: 'Doe John' }).then(function() {
originalUser.reload().complete(function(err, updatedUser) { return originalUser.reload().then(function(updatedUser) {
expect(originalUser.updatedAt).to.be.above(originallyUpdatedAt); expect(originalUser.updatedAt).to.be.above(originallyUpdatedAt);
expect(updatedUser.updatedAt).to.be.above(originallyUpdatedAt); expect(updatedUser.updatedAt).to.be.above(originallyUpdatedAt);
done();
}); });
}); });
}); });
}, 1000); });
}); });
}); });
it('should update the associations as well', function(done) { it('should update the associations as well', function() {
var Book = this.sequelize.define('Book', { title: DataTypes.STRING }) var Book = this.sequelize.define('Book', { title: DataTypes.STRING })
, Page = this.sequelize.define('Page', { content: DataTypes.TEXT }); , Page = this.sequelize.define('Page', { content: DataTypes.TEXT });
Book.hasMany(Page); Book.hasMany(Page);
Page.belongsTo(Book); Page.belongsTo(Book);
Book.sync({force: true}).success(function() { return Book.sync({force: true}).then(function() {
Page.sync({force: true}).success(function() { return Page.sync({force: true}).then(function() {
Book.create({ title: 'A very old book' }).success(function(book) { return Book.create({ title: 'A very old book' }).then(function(book) {
Page.create({ content: 'om nom nom' }).success(function(page) { return Page.create({ content: 'om nom nom' }).then(function(page) {
book.setPages([page]).success(function() { return book.setPages([page]).then(function() {
Book.find({ return Book.find({
where: { id: book.id }, where: { id: book.id },
include: [Page] include: [Page]
}).success(function(leBook) { }).then(function(leBook) {
page.updateAttributes({ content: 'something totally different' }).success(function(page) { return page.updateAttributes({ content: 'something totally different' }).then(function(page) {
expect(leBook.Pages.length).to.equal(1); expect(leBook.Pages.length).to.equal(1);
expect(leBook.Pages[0].content).to.equal('om nom nom'); expect(leBook.Pages[0].content).to.equal('om nom nom');
expect(page.content).to.equal('something totally different'); expect(page.content).to.equal('something totally different');
return leBook.reload().then(function(leBook) {
leBook.reload().success(function(leBook) {
expect(leBook.Pages.length).to.equal(1); expect(leBook.Pages.length).to.equal(1);
expect(leBook.Pages[0].content).to.equal('something totally different'); expect(leBook.Pages[0].content).to.equal('something totally different');
expect(page.content).to.equal('something totally different'); expect(page.content).to.equal('something totally different');
done();
}); });
}); });
}); });
...@@ -670,25 +620,22 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -670,25 +620,22 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
describe('default values', function() { describe('default values', function() {
describe('uuid', function() { describe('uuid', function() {
it('should store a string in uuidv1 and uuidv4', function(done) { it('should store a string in uuidv1 and uuidv4', function() {
var user = this.User.build({ username: 'a user'}); var user = this.User.build({ username: 'a user'});
expect(user.uuidv1).to.be.a('string'); expect(user.uuidv1).to.be.a('string');
expect(user.uuidv4).to.be.a('string'); expect(user.uuidv4).to.be.a('string');
done();
}); });
it('should store a string of length 36 in uuidv1 and uuidv4', function(done) { it('should store a string of length 36 in uuidv1 and uuidv4', function() {
var user = this.User.build({ username: 'a user'}); var user = this.User.build({ username: 'a user'});
expect(user.uuidv1).to.have.length(36); expect(user.uuidv1).to.have.length(36);
expect(user.uuidv4).to.have.length(36); expect(user.uuidv4).to.have.length(36);
done();
}); });
it('should store a valid uuid in uuidv1 and uuidv4 that can be parsed to something of length 16', function(done) { it('should store a valid uuid in uuidv1 and uuidv4 that can be parsed to something of length 16', function() {
var user = this.User.build({ username: 'a user'}); var user = this.User.build({ username: 'a user'});
expect(uuid.parse(user.uuidv1)).to.have.length(16); expect(uuid.parse(user.uuidv1)).to.have.length(16);
expect(uuid.parse(user.uuidv4)).to.have.length(16); expect(uuid.parse(user.uuidv4)).to.have.length(16);
done();
}); });
it('should store a valid uuid if the field is a primary key named id', function() { it('should store a valid uuid if the field is a primary key named id', function() {
...@@ -706,40 +653,36 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -706,40 +653,36 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
describe('current date', function() { describe('current date', function() {
it('should store a date in touchedAt', function(done) { it('should store a date in touchedAt', function() {
var user = this.User.build({ username: 'a user'}); var user = this.User.build({ username: 'a user'});
expect(user.touchedAt).to.be.instanceof(Date); expect(user.touchedAt).to.be.instanceof(Date);
done();
}); });
it('should store the current date in touchedAt', function(done) { it('should store the current date in touchedAt', function() {
var clock = sinon.useFakeTimers(); var clock = sinon.useFakeTimers();
clock.tick(5000); clock.tick(5000);
var user = this.User.build({ username: 'a user'}); var user = this.User.build({ username: 'a user'});
clock.restore(); clock.restore();
expect(+user.touchedAt).to.be.equal(5000); expect(+user.touchedAt).to.be.equal(5000);
done();
}); });
}); });
describe('allowNull date', function() { describe('allowNull date', function() {
it('should be just "null" and not Date with Invalid Date', function(done) { it('should be just "null" and not Date with Invalid Date', function() {
var self = this; var self = this;
this.User.build({ username: 'a user'}).save().success(function() { return this.User.build({ username: 'a user'}).save().then(function() {
self.User.find({where: {username: 'a user'}}).success(function(user) { return self.User.find({where: {username: 'a user'}}).then(function(user) {
expect(user.dateAllowNullTrue).to.be.null; expect(user.dateAllowNullTrue).to.be.null;
done();
}); });
}); });
}); });
it('should be the same valid date when saving the date', function(done) { it('should be the same valid date when saving the date', function() {
var self = this; var self = this;
var date = new Date(); var date = new Date();
this.User.build({ username: 'a user', dateAllowNullTrue: date}).save().success(function() { return this.User.build({ username: 'a user', dateAllowNullTrue: date}).save().then(function() {
self.User.find({where: {username: 'a user'}}).success(function(user) { return self.User.find({where: {username: 'a user'}}).then(function(user) {
expect(user.dateAllowNullTrue.toString()).to.equal(date.toString()); expect(user.dateAllowNullTrue.toString()).to.equal(date.toString());
done();
}); });
}); });
}); });
...@@ -842,37 +785,33 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -842,37 +785,33 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
describe('complete', function() { describe('complete', function() {
it('gets triggered if an error occurs', function(done) { it('gets triggered if an error occurs', function() {
this.User.find({ where: 'asdasdasd' }).complete(function(err) { return this.User.find({ where: 'asdasdasd' }).catch(function(err) {
expect(err).to.exist; expect(err).to.exist;
expect(err.message).to.exist; expect(err.message).to.exist;
done();
}); });
}); });
it('gets triggered if everything was ok', function(done) { it('gets triggered if everything was ok', function() {
this.User.count().complete(function(err, result) { return this.User.count().then(function(result) {
expect(err).to.be.null;
expect(result).to.exist; expect(result).to.exist;
done();
}); });
}); });
}); });
describe('save', function() { describe('save', function() {
if (current.dialect.supports.transactions) { if (current.dialect.supports.transactions) {
it('supports transactions', function(done) { it('supports transactions', function() {
Support.prepareTransactionTest(this.sequelize, function(sequelize) { return Support.prepareTransactionTest(this.sequelize).bind({}).then(function(sequelize) {
var User = sequelize.define('User', { username: Support.Sequelize.STRING }); var User = sequelize.define('User', { username: Support.Sequelize.STRING });
return User.sync({ force: true }).then(function() {
User.sync({ force: true }).success(function() { return sequelize.transaction().then(function(t) {
sequelize.transaction().then(function(t) { return User.build({ username: 'foo' }).save({ transaction: t }).then(function() {
User.build({ username: 'foo' }).save({ transaction: t }).success(function() { return User.count().then(function(count1) {
User.count().success(function(count1) { return User.count({ transaction: t }).then(function(count2) {
User.count({ transaction: t }).success(function(count2) {
expect(count1).to.equal(0); expect(count1).to.equal(0);
expect(count2).to.equal(1); expect(count2).to.equal(1);
t.rollback().success(function() { done(); }); return t.rollback();
}); });
}); });
}); });
...@@ -882,25 +821,24 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -882,25 +821,24 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
} }
it('only updates fields in passed array', function(done) { it('only updates fields in passed array', function() {
var self = this var self = this
, userId = null , userId = null
, date = new Date(1990, 1, 1); , date = new Date(1990, 1, 1);
this.User.create({ return this.User.create({
username: 'foo', username: 'foo',
touchedAt: new Date() touchedAt: new Date()
}).success(function(user) { }).then(function(user) {
user.username = 'fizz'; user.username = 'fizz';
user.touchedAt = date; user.touchedAt = date;
user.save(['username']).success(function() { return user.save(['username']).then(function() {
// re-select user // re-select user
self.User.find(user.id).success(function(user2) { return self.User.find(user.id).then(function(user2) {
// name should have changed // name should have changed
expect(user2.username).to.equal('fizz'); expect(user2.username).to.equal('fizz');
// bio should be unchanged // bio should be unchanged
expect(user2.birthDate).not.to.equal(date); expect(user2.birthDate).not.to.equal(date);
done();
}); });
}); });
}); });
...@@ -934,13 +872,11 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -934,13 +872,11 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('only validates fields in passed array', function(done) { it('only validates fields in passed array', function() {
this.User.build({ return this.User.build({
validateTest: 'cake', // invalid, but not saved validateTest: 'cake', // invalid, but not saved
validateCustom: '1' validateCustom: '1'
}).save(['validateCustom']).success(function() { }).save(['validateCustom']);
done();
});
}); });
describe('hooks', function () { describe('hooks', function () {
...@@ -1075,7 +1011,7 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1075,7 +1011,7 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('stores an entry in the database', function(done) { it('stores an entry in the database', function() {
var username = 'user' var username = 'user'
, User = this.User , User = this.User
, user = this.User.build({ , user = this.User.build({
...@@ -1083,97 +1019,77 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1083,97 +1019,77 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
touchedAt: new Date(1984, 8, 23) touchedAt: new Date(1984, 8, 23)
}); });
User.all().success(function(users) { return User.findAll().then(function(users) {
expect(users).to.have.length(0); expect(users).to.have.length(0);
user.save().success(function() { return user.save().then(function() {
User.all().success(function(users) { return User.findAll().then(function(users) {
expect(users).to.have.length(1); expect(users).to.have.length(1);
expect(users[0].username).to.equal(username); expect(users[0].username).to.equal(username);
expect(users[0].touchedAt).to.be.instanceof(Date); expect(users[0].touchedAt).to.be.instanceof(Date);
expect(users[0].touchedAt).to.equalDate(new Date(1984, 8, 23)); expect(users[0].touchedAt).to.equalDate(new Date(1984, 8, 23));
done();
}); });
}); });
}); });
}); });
it('updates the timestamps', function(done) { it('updates the timestamps', function() {
var now = Date.now() var now = Date.now()
, user = null , user = null
, updatedAt = null , updatedAt = null
, User = this.User; , User = this.User;
// timeout is needed, in order to check the update of the timestamp // timeout is needed, in order to check the update of the timestamp
var build = function(callback) { return this.sequelize.Promise.deplay(1000).then(function() {
user = User.build({ username: 'user' }); user = User.build({ username: 'user' });
return user.save().then(function() {
var save = user.save();
save.success(function() {
expect(now).to.be.below(user.updatedAt.getTime()); expect(now).to.be.below(user.updatedAt.getTime());
callback();
}); });
}; });
// closures are fun :)
setTimeout(function() {
build(function() {
done();
});
}, 1000);
}); });
it('does not update timestamps when passing silent=true', function() { it('does not update timestamps when passing silent=true', function() {
var self = this; var self = this;
return this.User.create({ username: 'user' }).then(function(user) { return this.User.create({ username: 'user' }).then(function(user) {
var updatedAt = user.updatedAt; var updatedAt = user.updatedAt;
return this.sequelize.Promise.delay(2000).then(function() {
return new self.sequelize.Promise(function(resolve) { return user.update({
setTimeout(function() { username: 'userman'
user.updateAttributes({ }, {
username: 'userman' silent: true
}, { }).then(function(user1) {
// silent: true expect(user1.updatedAt).to.equalDate(updatedAt);
}).then(function() { });
expect(user.updatedAt).to.equalDate(updatedAt);
resolve();
});
}, 2000);
}); });
}); });
}); });
it('updates with function and column value', function(done) { it('updates with function and column value', function() {
var self = this; var self = this;
this.User.create({ return this.User.create({
aNumber: 42 aNumber: 42
}).success(function(user) { }).then(function(user) {
user.bNumber = self.sequelize.col('aNumber'); user.bNumber = self.sequelize.col('aNumber');
user.username = self.sequelize.fn('upper', 'sequelize'); user.username = self.sequelize.fn('upper', 'sequelize');
return user.save().then(function() {
user.save().success(function() { return self.User.find(user.id).then(function(user2) {
self.User.find(user.id).success(function(user2) {
expect(user2.username).to.equal('SEQUELIZE'); expect(user2.username).to.equal('SEQUELIZE');
expect(user2.bNumber).to.equal(42); expect(user2.bNumber).to.equal(42);
done();
}); });
}); });
}); });
}); });
describe('without timestamps option', function() { describe('without timestamps option', function() {
it("doesn't update the updatedAt column", function(done) { it("doesn't update the updatedAt column", function() {
var User2 = this.sequelize.define('User2', { var User2 = this.sequelize.define('User2', {
username: DataTypes.STRING, username: DataTypes.STRING,
updatedAt: DataTypes.DATE updatedAt: DataTypes.DATE
}, { timestamps: false }); }, { timestamps: false });
User2.sync().success(function() { return User2.sync().then(function() {
User2.create({ username: 'john doe' }).success(function(johnDoe) { return User2.create({ username: 'john doe' }).then(function(johnDoe) {
// sqlite and mysql return undefined, whereas postgres returns null // sqlite and mysql return undefined, whereas postgres returns null
expect([undefined, null].indexOf(johnDoe.updatedAt)).not.to.be.equal(-1); expect([undefined, null].indexOf(johnDoe.updatedAt)).not.to.be.equal(-1);
done();
}); });
}); });
}); });
...@@ -1182,109 +1098,101 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1182,109 +1098,101 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
describe('with custom timestamp options', function() { describe('with custom timestamp options', function() {
var now = Date.now(); var now = Date.now();
it('updates the createdAt column if updatedAt is disabled', function(done) { it('updates the createdAt column if updatedAt is disabled', function() {
var User2 = this.sequelize.define('User2', { var User2 = this.sequelize.define('User2', {
username: DataTypes.STRING username: DataTypes.STRING
}, { updatedAt: false }); }, { updatedAt: false });
User2.sync().success(function() { return User2.sync().then(function() {
User2.create({ username: 'john doe' }).success(function(johnDoe) { return User2.create({ username: 'john doe' }).then(function(johnDoe) {
expect(johnDoe.updatedAt).to.be.undefined; expect(johnDoe.updatedAt).to.be.undefined;
expect(now).to.be.below(johnDoe.createdAt.getTime()); expect(now).to.be.below(johnDoe.createdAt.getTime());
done();
}); });
}); });
}); });
it('updates the updatedAt column if createdAt is disabled', function(done) { it('updates the updatedAt column if createdAt is disabled', function() {
var User2 = this.sequelize.define('User2', { var User2 = this.sequelize.define('User2', {
username: DataTypes.STRING username: DataTypes.STRING
}, { createdAt: false }); }, { createdAt: false });
User2.sync().success(function() { return User2.sync().then(function() {
User2.create({ username: 'john doe' }).success(function(johnDoe) { return User2.create({ username: 'john doe' }).then(function(johnDoe) {
expect(johnDoe.createdAt).to.be.undefined; expect(johnDoe.createdAt).to.be.undefined;
expect(now).to.be.below(johnDoe.updatedAt.getTime()); expect(now).to.be.below(johnDoe.updatedAt.getTime());
done();
}); });
}); });
}); });
}); });
it('should fail a validation upon creating', function(done) { it('should fail a validation upon creating', function() {
this.User.create({aNumber: 0, validateTest: 'hello'}).error(function(err) { return this.User.create({aNumber: 0, validateTest: 'hello'}).catch(function(err) {
expect(err).to.exist; expect(err).to.exist;
expect(err).to.be.instanceof(Object); expect(err).to.be.instanceof(Object);
expect(err.get('validateTest')).to.be.instanceof(Array); expect(err.get('validateTest')).to.be.instanceof(Array);
expect(err.get('validateTest')[0]).to.exist; expect(err.get('validateTest')[0]).to.exist;
expect(err.get('validateTest')[0].message).to.equal('Validation isInt failed'); expect(err.get('validateTest')[0].message).to.equal('Validation isInt failed');
done();
}); });
}); });
it('should fail a validation upon creating with hooks false', function(done) { it('should fail a validation upon creating with hooks false', function() {
this.User.create({aNumber: 0, validateTest: 'hello'}, {hooks: false}).error(function(err) { return this.User.create({aNumber: 0, validateTest: 'hello'}, {hooks: false}).catch(function(err) {
expect(err).to.exist; expect(err).to.exist;
expect(err).to.be.instanceof(Object); expect(err).to.be.instanceof(Object);
expect(err.get('validateTest')).to.be.instanceof(Array); expect(err.get('validateTest')).to.be.instanceof(Array);
expect(err.get('validateTest')[0]).to.exist; expect(err.get('validateTest')[0]).to.exist;
expect(err.get('validateTest')[0].message).to.equal('Validation isInt failed'); expect(err.get('validateTest')[0].message).to.equal('Validation isInt failed');
done();
}); });
}); });
it('should fail a validation upon building', function(done) { it('should fail a validation upon building', function() {
this.User.build({aNumber: 0, validateCustom: 'aaaaaaaaaaaaaaaaaaaaaaaaaa'}).save() return this.User.build({aNumber: 0, validateCustom: 'aaaaaaaaaaaaaaaaaaaaaaaaaa'}).save()
.error(function(err) { .catch(function(err) {
expect(err).to.exist; expect(err).to.exist;
expect(err).to.be.instanceof(Object); expect(err).to.be.instanceof(Object);
expect(err.get('validateCustom')).to.exist; expect(err.get('validateCustom')).to.exist;
expect(err.get('validateCustom')).to.be.instanceof(Array); expect(err.get('validateCustom')).to.be.instanceof(Array);
expect(err.get('validateCustom')[0]).to.exist; expect(err.get('validateCustom')[0]).to.exist;
expect(err.get('validateCustom')[0].message).to.equal('Length failed.'); expect(err.get('validateCustom')[0].message).to.equal('Length failed.');
done();
}); });
}); });
it('should fail a validation when updating', function(done) { it('should fail a validation when updating', function() {
this.User.create({aNumber: 0}).success(function(user) { return this.User.create({aNumber: 0}).then(function(user) {
user.updateAttributes({validateTest: 'hello'}).error(function(err) { return user.updateAttributes({validateTest: 'hello'}).catch(function(err) {
expect(err).to.exist; expect(err).to.exist;
expect(err).to.be.instanceof(Object); expect(err).to.be.instanceof(Object);
expect(err.get('validateTest')).to.exist; expect(err.get('validateTest')).to.exist;
expect(err.get('validateTest')).to.be.instanceof(Array); expect(err.get('validateTest')).to.be.instanceof(Array);
expect(err.get('validateTest')[0]).to.exist; expect(err.get('validateTest')[0]).to.exist;
expect(err.get('validateTest')[0].message).to.equal('Validation isInt failed'); expect(err.get('validateTest')[0].message).to.equal('Validation isInt failed');
done();
}); });
}); });
}); });
it('takes zero into account', function(done) { it('takes zero into account', function() {
this.User.build({ aNumber: 0 }).save(['aNumber']).success(function(user) { return this.User.build({ aNumber: 0 }).save(['aNumber']).then(function(user) {
expect(user.aNumber).to.equal(0); expect(user.aNumber).to.equal(0);
done();
}); });
}); });
it('saves a record with no primary key', function(done) { it('saves a record with no primary key', function() {
var HistoryLog = this.sequelize.define('HistoryLog', { var HistoryLog = this.sequelize.define('HistoryLog', {
someText: { type: DataTypes.STRING }, someText: { type: DataTypes.STRING },
aNumber: { type: DataTypes.INTEGER }, aNumber: { type: DataTypes.INTEGER },
aRandomId: { type: DataTypes.INTEGER } aRandomId: { type: DataTypes.INTEGER }
}); });
HistoryLog.sync().success(function() { return HistoryLog.sync().then(function() {
HistoryLog.create({ someText: 'Some random text', aNumber: 3, aRandomId: 5 }).success(function(log) { return HistoryLog.create({ someText: 'Some random text', aNumber: 3, aRandomId: 5 }).then(function(log) {
log.updateAttributes({ aNumber: 5 }).success(function(newLog) { return log.updateAttributes({ aNumber: 5 }).then(function(newLog) {
expect(newLog.aNumber).to.equal(5); expect(newLog.aNumber).to.equal(5);
done();
}); });
}); });
}); });
}); });
describe('eagerly loaded objects', function() { describe('eagerly loaded objects', function() {
beforeEach(function(done) { beforeEach(function() {
var self = this; var self = this;
this.UserEager = this.sequelize.define('UserEagerLoadingSaves', { this.UserEager = this.sequelize.define('UserEagerLoadingSaves', {
username: DataTypes.STRING, username: DataTypes.STRING,
...@@ -1299,33 +1207,29 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1299,33 +1207,29 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
this.UserEager.hasMany(this.ProjectEager, { as: 'Projects', foreignKey: 'PoobahId' }); this.UserEager.hasMany(this.ProjectEager, { as: 'Projects', foreignKey: 'PoobahId' });
this.ProjectEager.belongsTo(this.UserEager, { as: 'Poobah', foreignKey: 'PoobahId' }); this.ProjectEager.belongsTo(this.UserEager, { as: 'Poobah', foreignKey: 'PoobahId' });
self.UserEager.sync({force: true}).success(function() { return self.UserEager.sync({force: true}).then(function() {
self.ProjectEager.sync({force: true}).success(function() { return self.ProjectEager.sync({force: true});
done();
});
}); });
}); });
it('saves one object that has a collection of eagerly loaded objects', function(done) { it('saves one object that has a collection of eagerly loaded objects', function() {
var self = this; var self = this;
this.UserEager.create({ username: 'joe', age: 1 }).success(function(user) { return this.UserEager.create({ username: 'joe', age: 1 }).then(function(user) {
self.ProjectEager.create({ title: 'project-joe1', overdue_days: 0 }).success(function(project1) { return self.ProjectEager.create({ title: 'project-joe1', overdue_days: 0 }).then(function(project1) {
self.ProjectEager.create({ title: 'project-joe2', overdue_days: 0 }).success(function(project2) { return self.ProjectEager.create({ title: 'project-joe2', overdue_days: 0 }).then(function(project2) {
user.setProjects([project1, project2]).success(function() { return user.setProjects([project1, project2]).then(function() {
self.UserEager.find({where: {age: 1}, include: [{model: self.ProjectEager, as: 'Projects'}]}).success(function(user) { return self.UserEager.find({where: {age: 1}, include: [{model: self.ProjectEager, as: 'Projects'}]}).then(function(user) {
expect(user.username).to.equal('joe'); expect(user.username).to.equal('joe');
expect(user.age).to.equal(1); expect(user.age).to.equal(1);
expect(user.Projects).to.exist; expect(user.Projects).to.exist;
expect(user.Projects.length).to.equal(2); expect(user.Projects.length).to.equal(2);
user.age = user.age + 1; // happy birthday joe user.age = user.age + 1; // happy birthday joe
return user.save().then(function(user) {
user.save().done(function(err) {
expect(user.username).to.equal('joe'); expect(user.username).to.equal('joe');
expect(user.age).to.equal(2); expect(user.age).to.equal(2);
expect(user.Projects).to.exist; expect(user.Projects).to.exist;
expect(user.Projects.length).to.equal(2); expect(user.Projects.length).to.equal(2);
done();
}); });
}); });
}); });
...@@ -1334,17 +1238,17 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1334,17 +1238,17 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('saves many objects that each a have collection of eagerly loaded objects', function(done) { it('saves many objects that each a have collection of eagerly loaded objects', function() {
var self = this; var self = this;
this.UserEager.create({ username: 'bart', age: 20 }).success(function(bart) { return this.UserEager.create({ username: 'bart', age: 20 }).then(function(bart) {
self.UserEager.create({ username: 'lisa', age: 20 }).success(function(lisa) { return self.UserEager.create({ username: 'lisa', age: 20 }).then(function(lisa) {
self.ProjectEager.create({ title: 'detention1', overdue_days: 0 }).success(function(detention1) { return self.ProjectEager.create({ title: 'detention1', overdue_days: 0 }).then(function(detention1) {
self.ProjectEager.create({ title: 'detention2', overdue_days: 0 }).success(function(detention2) { return self.ProjectEager.create({ title: 'detention2', overdue_days: 0 }).then(function(detention2) {
self.ProjectEager.create({ title: 'exam1', overdue_days: 0 }).success(function(exam1) { return self.ProjectEager.create({ title: 'exam1', overdue_days: 0 }).then(function(exam1) {
self.ProjectEager.create({ title: 'exam2', overdue_days: 0 }).success(function(exam2) { return self.ProjectEager.create({ title: 'exam2', overdue_days: 0 }).then(function(exam2) {
bart.setProjects([detention1, detention2]).success(function() { return bart.setProjects([detention1, detention2]).then(function() {
lisa.setProjects([exam1, exam2]).success(function() { return lisa.setProjects([exam1, exam2]).then(function() {
self.UserEager.findAll({where: {age: 20}, order: 'username ASC', include: [{model: self.ProjectEager, as: 'Projects'}]}).success(function(simpsons) { return self.UserEager.findAll({where: {age: 20}, order: 'username ASC', include: [{model: self.ProjectEager, as: 'Projects'}]}).then(function(simpsons) {
var _bart, _lisa; var _bart, _lisa;
expect(simpsons.length).to.equal(2); expect(simpsons.length).to.equal(2);
...@@ -1359,17 +1263,15 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1359,17 +1263,15 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
_bart.age = _bart.age + 1; // happy birthday bart - off to Moe's _bart.age = _bart.age + 1; // happy birthday bart - off to Moe's
_bart.save().success(function(savedbart) { return _bart.save().then(function(savedbart) {
expect(savedbart.username).to.equal('bart'); expect(savedbart.username).to.equal('bart');
expect(savedbart.age).to.equal(21); expect(savedbart.age).to.equal(21);
_lisa.username = 'lsimpson'; _lisa.username = 'lsimpson';
_lisa.save().success(function(savedlisa) { return _lisa.save().then(function(savedlisa) {
expect(savedlisa.username).to.equal('lsimpson'); expect(savedlisa.username).to.equal('lsimpson');
expect(savedlisa.age).to.equal(20); expect(savedlisa.age).to.equal(20);
done();
}); });
}); });
}); });
...@@ -1383,13 +1285,13 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1383,13 +1285,13 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('saves many objects that each has one eagerly loaded object (to which they belong)', function(done) { it('saves many objects that each has one eagerly loaded object (to which they belong)', function() {
var self = this; var self = this;
this.UserEager.create({ username: 'poobah', age: 18 }).success(function(user) { return this.UserEager.create({ username: 'poobah', age: 18 }).then(function(user) {
self.ProjectEager.create({ title: 'homework', overdue_days: 10 }).success(function(homework) { return self.ProjectEager.create({ title: 'homework', overdue_days: 10 }).then(function(homework) {
self.ProjectEager.create({ title: 'party', overdue_days: 2 }).success(function(party) { return self.ProjectEager.create({ title: 'party', overdue_days: 2 }).then(function(party) {
user.setProjects([homework, party]).success(function() { return user.setProjects([homework, party]).then(function() {
self.ProjectEager.findAll({include: [{model: self.UserEager, as: 'Poobah'}]}).success(function(projects) { return self.ProjectEager.findAll({include: [{model: self.UserEager, as: 'Poobah'}]}).then(function(projects) {
expect(projects.length).to.equal(2); expect(projects.length).to.equal(2);
expect(projects[0].Poobah).to.exist; expect(projects[0].Poobah).to.exist;
expect(projects[1].Poobah).to.exist; expect(projects[1].Poobah).to.exist;
...@@ -1401,17 +1303,14 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1401,17 +1303,14 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
projects[0].overdue_days = 0; projects[0].overdue_days = 0;
projects[1].overdue_days = 0; projects[1].overdue_days = 0;
projects[0].save().success(function() { return projects[0].save().then(function() {
projects[1].save().success(function() { return projects[1].save().then(function() {
self.ProjectEager.findAll({where: {title: 'partymore', overdue_days: 0}, include: [{model: self.UserEager, as: 'Poobah'}]}).success(function(savedprojects) { return self.ProjectEager.findAll({where: {title: 'partymore', overdue_days: 0}, include: [{model: self.UserEager, as: 'Poobah'}]}).then(function(savedprojects) {
expect(savedprojects.length).to.equal(2); expect(savedprojects.length).to.equal(2);
expect(savedprojects[0].Poobah).to.exist; expect(savedprojects[0].Poobah).to.exist;
expect(savedprojects[1].Poobah).to.exist; expect(savedprojects[1].Poobah).to.exist;
expect(savedprojects[0].Poobah.username).to.equal('poobah'); expect(savedprojects[0].Poobah.username).to.equal('poobah');
expect(savedprojects[1].Poobah.username).to.equal('poobah'); expect(savedprojects[1].Poobah.username).to.equal('poobah');
done();
}); });
}); });
}); });
...@@ -1426,7 +1325,7 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1426,7 +1325,7 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
describe('many to many relations', function() { describe('many to many relations', function() {
var udo; var udo;
beforeEach(function(done) { beforeEach(function() {
var self = this; var self = this;
this.User = this.sequelize.define('UserWithUsernameAndAgeAndIsAdmin', { this.User = this.sequelize.define('UserWithUsernameAndAgeAndIsAdmin', {
username: DataTypes.STRING, username: DataTypes.STRING,
...@@ -1440,32 +1339,30 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1440,32 +1339,30 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
this.Project.hasMany(this.User); this.Project.hasMany(this.User);
this.User.hasMany(this.Project); this.User.hasMany(this.Project);
this.User.sync({ force: true }).success(function() { return this.User.sync({ force: true }).then(function() {
self.Project.sync({ force: true }).success(function() { return self.Project.sync({ force: true }).then(function() {
self.User.create({ username: 'fnord', age: 1, isAdmin: true }) return self.User.create({ username: 'fnord', age: 1, isAdmin: true })
.success(function(user) { .then(function(user) {
udo = user; udo = user;
done();
}); });
}); });
}); });
}); });
it.skip('Should assign a property to the instance', function(done) { it.skip('Should assign a property to the instance', function() {
// @thanpolas rethink this test, it doesn't make sense, a relation has // @thanpolas rethink this test, it doesn't make sense, a relation has
// to be created first in the beforeEach(). // to be created first in the beforeEach().
var self = this; var self = this;
this.User.find({id: udo.id}) return this.User.find({id: udo.id})
.success(function(user) { .then(function(user) {
user.NiceProjectId = 1; user.NiceProjectId = 1;
expect(user.NiceProjectId).to.equal(1); expect(user.NiceProjectId).to.equal(1);
done();
}); });
}); });
}); });
describe('toJSON', function() { describe('toJSON', function() {
beforeEach(function(done) { beforeEach(function() {
var self = this; var self = this;
this.User = this.sequelize.define('UserWithUsernameAndAgeAndIsAdmin', { this.User = this.sequelize.define('UserWithUsernameAndAgeAndIsAdmin', {
username: DataTypes.STRING, username: DataTypes.STRING,
...@@ -1478,17 +1375,14 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1478,17 +1375,14 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
this.User.hasMany(this.Project, { as: 'Projects', foreignKey: 'lovelyUserId' }); this.User.hasMany(this.Project, { as: 'Projects', foreignKey: 'lovelyUserId' });
this.Project.belongsTo(this.User, { as: 'LovelyUser', foreignKey: 'lovelyUserId' }); this.Project.belongsTo(this.User, { as: 'LovelyUser', foreignKey: 'lovelyUserId' });
this.User.sync({ force: true }).success(function() { return this.User.sync({ force: true }).then(function() {
self.Project.sync({ force: true }).success(function() { return self.Project.sync({ force: true });
done();
});
}); });
}); });
it("dont return instance that isn't defined", function(done ) { it("dont return instance that isn't defined", function(done ) {
var self = this; var self = this;
return self.Project.create({ lovelyUserId: null })
self.Project.create({ lovelyUserId: null })
.then(function(project ) { .then(function(project ) {
return self.Project.find({ return self.Project.find({
where: { where: {
...@@ -1501,18 +1395,13 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1501,18 +1395,13 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}) })
.then(function(project ) { .then(function(project ) {
var json = project.toJSON(); var json = project.toJSON();
expect(json.LovelyUser).to.be.equal(null); expect(json.LovelyUser).to.be.equal(null);
}) });
.done(done)
.catch (done);
}); });
it("dont return instances that aren't defined", function(done ) { it("dont return instances that aren't defined", function(done ) {
var self = this; var self = this;
return self.User.create({ username: 'cuss' })
self.User.create({ username: 'cuss' })
.then(function(user ) { .then(function(user ) {
return self.User.find({ return self.User.find({
where: { where: {
...@@ -1525,51 +1414,42 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1525,51 +1414,42 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}) })
.then(function(user ) { .then(function(user ) {
var json = user.toJSON(); var json = user.toJSON();
expect(user.Projects).to.be.instanceof(Array); expect(user.Projects).to.be.instanceof(Array);
expect(user.Projects).to.be.length(0); expect(user.Projects).to.be.length(0);
}) });
.done(done)
.catch (done);
}); });
it('returns an object containing all values', function(done) { it('returns an object containing all values', function() {
var user = this.User.build({ username: 'test.user', age: 99, isAdmin: true }); var user = this.User.build({ username: 'test.user', age: 99, isAdmin: true });
expect(user.toJSON()).to.deep.equal({ username: 'test.user', age: 99, isAdmin: true, id: null }); expect(user.toJSON()).to.deep.equal({ username: 'test.user', age: 99, isAdmin: true, id: null });
done();
}); });
it('returns a response that can be stringified', function(done) { it('returns a response that can be stringified', function() {
var user = this.User.build({ username: 'test.user', age: 99, isAdmin: true }); var user = this.User.build({ username: 'test.user', age: 99, isAdmin: true });
expect(JSON.stringify(user)).to.deep.equal('{"id":null,"username":"test.user","age":99,"isAdmin":true}'); expect(JSON.stringify(user)).to.deep.equal('{"id":null,"username":"test.user","age":99,"isAdmin":true}');
done();
}); });
it('returns a response that can be stringified and then parsed', function(done) { it('returns a response that can be stringified and then parsed', function() {
var user = this.User.build({ username: 'test.user', age: 99, isAdmin: true }); var user = this.User.build({ username: 'test.user', age: 99, isAdmin: true });
expect(JSON.parse(JSON.stringify(user))).to.deep.equal({ username: 'test.user', age: 99, isAdmin: true, id: null }); expect(JSON.parse(JSON.stringify(user))).to.deep.equal({ username: 'test.user', age: 99, isAdmin: true, id: null });
done();
}); });
it('includes the eagerly loaded associations', function(done) { it('includes the eagerly loaded associations', function() {
var self = this; var self = this;
this.User.create({ username: 'fnord', age: 1, isAdmin: true }).success(function(user) { return this.User.create({ username: 'fnord', age: 1, isAdmin: true }).then(function(user) {
self.Project.create({ title: 'fnord' }).success(function(project) { return self.Project.create({ title: 'fnord' }).then(function(project) {
user.setProjects([project]).success(function() { return user.setProjects([project]).then(function() {
self.User.findAll({include: [{ model: self.Project, as: 'Projects' }]}).success(function(users) { return self.User.findAll({include: [{ model: self.Project, as: 'Projects' }]}).then(function(users) {
var _user = users[0]; var _user = users[0];
expect(_user.Projects).to.exist; expect(_user.Projects).to.exist;
expect(JSON.parse(JSON.stringify(_user)).Projects).to.exist; expect(JSON.parse(JSON.stringify(_user)).Projects).to.exist;
self.Project.findAll({include: [{ model: self.User, as: 'LovelyUser' }]}).success(function(projects) { return self.Project.findAll({include: [{ model: self.User, as: 'LovelyUser' }]}).then(function(projects) {
var _project = projects[0]; var _project = projects[0];
expect(_project.LovelyUser).to.exist; expect(_project.LovelyUser).to.exist;
expect(JSON.parse(JSON.stringify(_project)).LovelyUser).to.exist; expect(JSON.parse(JSON.stringify(_project)).LovelyUser).to.exist;
done();
}); });
}); });
}); });
...@@ -1579,43 +1459,36 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1579,43 +1459,36 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
describe('findAll', function() { describe('findAll', function() {
beforeEach(function(done) { beforeEach(function() {
this.ParanoidUser = this.sequelize.define('ParanoidUser', { this.ParanoidUser = this.sequelize.define('ParanoidUser', {
username: { type: DataTypes.STRING } username: { type: DataTypes.STRING }
}, { paranoid: true }); }, { paranoid: true });
this.ParanoidUser.hasOne(this.ParanoidUser); this.ParanoidUser.hasOne(this.ParanoidUser);
this.ParanoidUser.sync({ force: true }).success(function() { return this.ParanoidUser.sync({ force: true });
done();
});
}); });
it('sql should have paranoid condition', function(done ) { it('sql should have paranoid condition', function(done ) {
var self = this; var self = this;
return self.ParanoidUser.create({ username: 'cuss' })
self.ParanoidUser.create({ username: 'cuss' })
.then(function() { .then(function() {
return self.ParanoidUser.findAll(); return self.ParanoidUser.findAll();
}) })
.then(function(users ) { .then(function(users) {
expect(users).to.have.length(1); expect(users).to.have.length(1);
return users[0].destroy(); return users[0].destroy();
}) })
.then(function() { .then(function() {
return self.ParanoidUser.findAll(); return self.ParanoidUser.findAll();
}) })
.then(function(users ) { .then(function(users) {
expect(users).to.have.length(0); expect(users).to.have.length(0);
}) });
.done(done)
.catch (done);
}); });
it('sequelize.and as where should include paranoid condition', function(done ) { it('sequelize.and as where should include paranoid condition', function(done ) {
var self = this; var self = this;
return self.ParanoidUser.create({ username: 'cuss' })
self.ParanoidUser.create({ username: 'cuss' })
.then(function() { .then(function() {
return self.ParanoidUser.findAll({ return self.ParanoidUser.findAll({
where: self.sequelize.and({ where: self.sequelize.and({
...@@ -1623,9 +1496,8 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1623,9 +1496,8 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}) })
}); });
}) })
.then(function(users ) { .then(function(users) {
expect(users).to.have.length(1); expect(users).to.have.length(1);
return users[0].destroy(); return users[0].destroy();
}) })
.then(function() { .then(function() {
...@@ -1635,18 +1507,14 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1635,18 +1507,14 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}) })
}); });
}) })
.then(function(users ) { .then(function(users) {
expect(users).to.have.length(0); expect(users).to.have.length(0);
}) });
.done(done)
.catch (done);
}); });
it('sequelize.or as where should include paranoid condition', function(done ) { it('sequelize.or as where should include paranoid condition', function(done ) {
var self = this; var self = this;
return self.ParanoidUser.create({ username: 'cuss' })
self.ParanoidUser.create({ username: 'cuss' })
.then(function() { .then(function() {
return self.ParanoidUser.findAll({ return self.ParanoidUser.findAll({
where: self.sequelize.or({ where: self.sequelize.or({
...@@ -1654,9 +1522,8 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1654,9 +1522,8 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}) })
}); });
}) })
.then(function(users ) { .then(function(users) {
expect(users).to.have.length(1); expect(users).to.have.length(1);
return users[0].destroy(); return users[0].destroy();
}) })
.then(function() { .then(function() {
...@@ -1666,78 +1533,68 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1666,78 +1533,68 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}) })
}); });
}) })
.then(function(users ) { .then(function(users) {
expect(users).to.have.length(0); expect(users).to.have.length(0);
}) });
.done(done)
.catch (done);
}); });
it('escapes a single single quotes properly in where clauses', function(done) { it('escapes a single single quotes properly in where clauses', function() {
var self = this; var self = this;
return this.User
this.User
.create({ username: "user'name" }) .create({ username: "user'name" })
.success(function() { .then(function() {
self.User.findAll({ return self.User.findAll({
where: { username: "user'name" } where: { username: "user'name" }
}).success(function(users) { }).then(function(users) {
expect(users.length).to.equal(1); expect(users.length).to.equal(1);
expect(users[0].username).to.equal("user'name"); expect(users[0].username).to.equal("user'name");
done();
}); });
}); });
}); });
it('escapes two single quotes properly in where clauses', function(done) { it('escapes two single quotes properly in where clauses', function() {
var self = this; var self = this;
return this.User
this.User
.create({ username: "user''name" }) .create({ username: "user''name" })
.success(function() { .then(function() {
self.User.findAll({ return self.User.findAll({
where: { username: "user''name" } where: { username: "user''name" }
}).success(function(users) { }).then(function(users) {
expect(users.length).to.equal(1); expect(users.length).to.equal(1);
expect(users[0].username).to.equal("user''name"); expect(users[0].username).to.equal("user''name");
done();
}); });
}); });
}); });
it('returns the timestamps if no attributes have been specified', function(done) { it('returns the timestamps if no attributes have been specified', function() {
var self = this; var self = this;
this.User.create({ username: 'fnord' }).success(function() { return this.User.create({ username: 'fnord' }).then(function() {
self.User.findAll().success(function(users) { return self.User.findAll().then(function(users) {
expect(users[0].createdAt).to.exist; expect(users[0].createdAt).to.exist;
done();
}); });
}); });
}); });
it('does not return the timestamps if the username attribute has been specified', function(done) { it('does not return the timestamps if the username attribute has been specified', function() {
var self = this; var self = this;
this.User.create({ username: 'fnord' }).success(function() { return this.User.create({ username: 'fnord' }).then(function() {
self.User.findAll({ attributes: ['username'] }).success(function(users) { return self.User.findAll({ attributes: ['username'] }).then(function(users) {
expect(users[0].createdAt).not.to.exist; expect(users[0].createdAt).not.to.exist;
expect(users[0].username).to.exist; expect(users[0].username).to.exist;
done();
}); });
}); });
}); });
it('creates the deletedAt property, when defining paranoid as true', function(done) { it('creates the deletedAt property, when defining paranoid as true', function() {
var self = this; var self = this;
this.ParanoidUser.create({ username: 'fnord' }).success(function() { return this.ParanoidUser.create({ username: 'fnord' }).then(function() {
self.ParanoidUser.findAll().success(function(users) { return self.ParanoidUser.findAll().then(function(users) {
expect(users[0].deletedAt).to.be.null; expect(users[0].deletedAt).to.be.null;
done();
}); });
}); });
}); });
it('destroys a record with a primary key of something other than id', function(done) { it('destroys a record with a primary key of something other than id', function() {
var UserDestroy = this.sequelize.define('UserDestroy', { var UserDestroy = this.sequelize.define('UserDestroy', {
newId: { newId: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -1746,63 +1603,58 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1746,63 +1603,58 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
email: DataTypes.STRING email: DataTypes.STRING
}); });
UserDestroy.sync().success(function() { return UserDestroy.sync().then(function() {
UserDestroy.create({newId: '123ABC', email: 'hello'}).success(function() { return UserDestroy.create({newId: '123ABC', email: 'hello'}).then(function() {
UserDestroy.find({where: {email: 'hello'}}).success(function(user) { return UserDestroy.find({where: {email: 'hello'}}).then(function(user) {
user.destroy().done(done); return user.destroy();
}); });
}); });
}); });
}); });
it('sets deletedAt property to a specific date when deleting an instance', function(done) { it('sets deletedAt property to a specific date when deleting an instance', function() {
var self = this; var self = this;
this.ParanoidUser.create({ username: 'fnord' }).success(function() { return this.ParanoidUser.create({ username: 'fnord' }).then(function() {
self.ParanoidUser.findAll().success(function(users) { return self.ParanoidUser.findAll().then(function(users) {
users[0].destroy().success(function(user) { return users[0].destroy().then(function(user) {
expect(user.deletedAt.getMonth).to.exist; expect(user.deletedAt.getMonth).to.exist;
done();
}); });
}); });
}); });
}); });
it('keeps the deletedAt-attribute with value null, when running updateAttributes', function(done) { it('keeps the deletedAt-attribute with value null, when running updateAttributes', function() {
var self = this; var self = this;
this.ParanoidUser.create({ username: 'fnord' }).success(function() { return this.ParanoidUser.create({ username: 'fnord' }).then(function() {
self.ParanoidUser.findAll().success(function(users) { return self.ParanoidUser.findAll().then(function(users) {
users[0].updateAttributes({username: 'newFnord'}).success(function(user) { return users[0].updateAttributes({username: 'newFnord'}).then(function(user) {
expect(user.deletedAt).not.to.exist; expect(user.deletedAt).not.to.exist;
done();
}); });
}); });
}); });
}); });
it('keeps the deletedAt-attribute with value null, when updating associations', function(done) { it('keeps the deletedAt-attribute with value null, when updating associations', function() {
var self = this; var self = this;
this.ParanoidUser.create({ username: 'fnord' }).success(function() { return this.ParanoidUser.create({ username: 'fnord' }).then(function() {
self.ParanoidUser.findAll().success(function(users) { return self.ParanoidUser.findAll().then(function(users) {
self.ParanoidUser.create({ username: 'linkedFnord' }).success(function(linkedUser) { return self.ParanoidUser.create({ username: 'linkedFnord' }).then(function(linkedUser) {
users[0].setParanoidUser(linkedUser).success(function(user) { return users[0].setParanoidUser(linkedUser).then(function(user) {
expect(user.deletedAt).not.to.exist; expect(user.deletedAt).not.to.exist;
done();
}); });
}); });
}); });
}); });
}); });
it('can reuse query option objects', function(done) { it('can reuse query option objects', function() {
var self = this; var self = this;
this.User.create({ username: 'fnord' }).success(function() { return this.User.create({ username: 'fnord' }).then(function() {
var query = { where: { username: 'fnord' }}; var query = { where: { username: 'fnord' }};
return self.User.findAll(query).then(function(users) {
self.User.findAll(query).success(function(users) {
expect(users[0].username).to.equal('fnord'); expect(users[0].username).to.equal('fnord');
self.User.findAll(query).success(function(users) { return self.User.findAll(query).then(function(users) {
expect(users[0].username).to.equal('fnord'); expect(users[0].username).to.equal('fnord');
done();
}); });
}); });
}); });
...@@ -1810,22 +1662,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1810,22 +1662,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
describe('find', function() { describe('find', function() {
it('can reuse query option objects', function(done) { it('can reuse query option objects', function() {
var self = this; var self = this;
this.User.create({ username: 'fnord' }).success(function() { return this.User.create({ username: 'fnord' }).then(function() {
var query = { where: { username: 'fnord' }}; var query = { where: { username: 'fnord' }};
return self.User.find(query).then(function(user) {
self.User.find(query).success(function(user) {
expect(user.username).to.equal('fnord'); expect(user.username).to.equal('fnord');
return self.User.find(query).then(function(user) {
self.User.find(query).success(function(user) {
expect(user.username).to.equal('fnord'); expect(user.username).to.equal('fnord');
done();
}); });
}); });
}); });
}); });
it('returns null for null, undefined, and unset boolean values', function(done) { it('returns null for null, undefined, and unset boolean values', function() {
var Setting = this.sequelize.define('SettingHelper', { var Setting = this.sequelize.define('SettingHelper', {
setting_key: DataTypes.STRING, setting_key: DataTypes.STRING,
bool_value: { type: DataTypes.BOOLEAN, allowNull: true }, bool_value: { type: DataTypes.BOOLEAN, allowNull: true },
...@@ -1833,13 +1682,12 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1833,13 +1682,12 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
bool_value3: { type: DataTypes.BOOLEAN, allowNull: true } bool_value3: { type: DataTypes.BOOLEAN, allowNull: true }
}, { timestamps: false, logging: false }); }, { timestamps: false, logging: false });
Setting.sync({ force: true }).success(function() { return Setting.sync({ force: true }).then(function() {
Setting.create({ setting_key: 'test', bool_value: null, bool_value2: undefined }).success(function() { return Setting.create({ setting_key: 'test', bool_value: null, bool_value2: undefined }).then(function() {
Setting.find({ where: { setting_key: 'test' } }).success(function(setting) { return Setting.find({ where: { setting_key: 'test' } }).then(function(setting) {
expect(setting.bool_value).to.equal(null); expect(setting.bool_value).to.equal(null);
expect(setting.bool_value2).to.equal(null); expect(setting.bool_value2).to.equal(null);
expect(setting.bool_value3).to.equal(null); expect(setting.bool_value3).to.equal(null);
done();
}); });
}); });
}); });
...@@ -1847,48 +1695,44 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1847,48 +1695,44 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
describe('equals', function() { describe('equals', function() {
it('can compare records with Date field', function(done) { it('can compare records with Date field', function() {
var self = this; var self = this;
this.User.create({ username: 'fnord' }).success(function(user1) { return this.User.create({ username: 'fnord' }).then(function(user1) {
var query = { where: { username: 'fnord' }}; return self.User.find({ where: { username: 'fnord' }}).then(function(user2) {
self.User.find(query).success(function(user2) {
expect(user1.equals(user2)).to.be.true; expect(user1.equals(user2)).to.be.true;
done();
}); });
}); });
}); });
}); });
describe('values', function() { describe('values', function() {
it('returns all values', function(done) { it('returns all values', function() {
var User = this.sequelize.define('UserHelper', { var User = this.sequelize.define('UserHelper', {
username: DataTypes.STRING username: DataTypes.STRING
}, { timestamps: false, logging: false }); }, { timestamps: false, logging: false });
User.sync().success(function() { return User.sync().then(function() {
var user = User.build({ username: 'foo' }); var user = User.build({ username: 'foo' });
expect(user.values).to.deep.equal({ username: 'foo', id: null }); expect(user.values).to.deep.equal({ username: 'foo', id: null });
done();
}); });
}); });
}); });
describe('destroy', function() { describe('destroy', function() {
if (current.dialect.supports.transactions) { if (current.dialect.supports.transactions) {
it('supports transactions', function(done) { it('supports transactions', function() {
Support.prepareTransactionTest(this.sequelize, function(sequelize) { return Support.prepareTransactionTest(this.sequelize).bind({}).then(function(sequelize) {
var User = sequelize.define('User', { username: Support.Sequelize.STRING }); var User = sequelize.define('User', { username: Support.Sequelize.STRING });
User.sync({ force: true }).success(function() { return User.sync({ force: true }).then(function() {
User.create({ username: 'foo' }).success(function(user) { return User.create({ username: 'foo' }).then(function(user) {
sequelize.transaction().then(function(t) { return sequelize.transaction().then(function(t) {
user.destroy({ transaction: t }).success(function() { return user.destroy({ transaction: t }).then(function() {
User.count().success(function(count1) { return User.count().then(function(count1) {
User.count({ transaction: t }).success(function(count2) { return User.count({ transaction: t }).then(function(count2) {
expect(count1).to.equal(1); expect(count1).to.equal(1);
expect(count2).to.equal(0); expect(count2).to.equal(0);
t.rollback().success(function() { done(); }); return t.rollback();
}); });
}); });
}); });
...@@ -1899,20 +1743,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1899,20 +1743,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
} }
it('deletes a record from the database if dao is not paranoid', function(done) { it('deletes a record from the database if dao is not paranoid', function() {
var UserDestroy = this.sequelize.define('UserDestroy', { var UserDestroy = this.sequelize.define('UserDestroy', {
name: Support.Sequelize.STRING, name: Support.Sequelize.STRING,
bio: Support.Sequelize.TEXT bio: Support.Sequelize.TEXT
}); });
UserDestroy.sync({ force: true }).success(function() { return UserDestroy.sync({ force: true }).then(function() {
UserDestroy.create({name: 'hallo', bio: 'welt'}).success(function(u) { return UserDestroy.create({name: 'hallo', bio: 'welt'}).then(function(u) {
UserDestroy.all().success(function(users) { return UserDestroy.findAll().then(function(users) {
expect(users.length).to.equal(1); expect(users.length).to.equal(1);
u.destroy().success(function() { return u.destroy().then(function() {
UserDestroy.all().success(function(users) { return UserDestroy.findAll().then(function(users) {
expect(users.length).to.equal(0); expect(users.length).to.equal(0);
done();
}); });
}); });
}); });
...@@ -1920,20 +1763,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() { ...@@ -1920,20 +1763,19 @@ describe(Support.getTestDialectTeaser('Instance'), function() {
}); });
}); });
it('allows sql logging of delete statements', function(done) { it('allows sql logging of delete statements', function() {
var UserDelete = this.sequelize.define('UserDelete', { var UserDelete = this.sequelize.define('UserDelete', {
name: Support.Sequelize.STRING, name: Support.Sequelize.STRING,
bio: Support.Sequelize.TEXT bio: Support.Sequelize.TEXT
}); });
UserDelete.sync({ force: true }).success(function() { return UserDelete.sync({ force: true }).then(function() {
UserDelete.create({name: 'hallo', bio: 'welt'}).success(function(u) { return UserDelete.create({name: 'hallo', bio: 'welt'}).then(function(u) {
UserDelete.all().success(function(users) { return UserDelete.findAll().then(function(users) {
expect(users.length).to.equal(1); expect(users.length).to.equal(1);
u.destroy().on('sql', function(sql) { return u.destroy().on('sql', function(sql) {
expect(sql).to.exist; expect(sql).to.exist;
expect(sql.toUpperCase().indexOf('DELETE')).to.be.above(-1); expect(sql.toUpperCase().indexOf('DELETE')).to.be.above(-1);
done();
}); });
}); });
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!