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

Commit 795b28b0 by Daniel Durante

Cleaned up the BusterJS file even more, foreign keys should be working properly too.

1 parent e5f6adf8
...@@ -43,7 +43,7 @@ module.exports = (function() { ...@@ -43,7 +43,7 @@ module.exports = (function() {
if (obsoleteAssociations.length > 0) { if (obsoleteAssociations.length > 0) {
// clear the old associations // clear the old associations
var obsoleteIds = obsoleteAssociations.map(function(associatedObject) { var obsoleteIds = obsoleteAssociations.map(function(associatedObject) {
associatedObject[self.__factory.identifier] = null associatedObject[self.__factory.identifier] = (newAssociations.length < 1 ? null : self.instance.id)
return associatedObject.id return associatedObject.id
}) })
...@@ -55,12 +55,12 @@ module.exports = (function() { ...@@ -55,12 +55,12 @@ module.exports = (function() {
if (unassociatedObjects.length > 0) { if (unassociatedObjects.length > 0) {
// set the new associations // set the new associations
var unassociatedIds = unassociatedObjects.map(function(associatedObject) { var unassociatedIds = unassociatedObjects.map(function(associatedObject) {
associatedObject[self.__factory.identifier] = self.instance.id associatedObject[self.__factory.identifier] = (newAssociations.length < 1 ? null : self.instance.id)
return associatedObject.id return associatedObject.id
}) })
update = {} update = {}
update[self.__factory.identifier] = self.instance.id update[self.__factory.identifier] = (newAssociations.length < 1 ? null : self.instance.id)
chainer.add(this.__factory.target.update(update, { id: unassociatedIds })) chainer.add(this.__factory.target.update(update, { id: unassociatedIds }))
} }
......
...@@ -70,17 +70,25 @@ module.exports = (function() { ...@@ -70,17 +70,25 @@ module.exports = (function() {
HasOne.prototype.injectSetter = function(obj) { HasOne.prototype.injectSetter = function(obj) {
var self = this var self = this
, options = self.options || {}
obj[this.accessors.set] = function(associatedObject) { obj[this.accessors.set] = function(associatedObject) {
var instance = this; var instance = this
return new Utils.CustomEventEmitter(function(emitter) { return new Utils.CustomEventEmitter(function(emitter) {
instance[self.accessors.get]().success(function(oldObj) { instance[self.accessors.get]().success(function(oldObj) {
if (oldObj) { if (oldObj) {
oldObj[self.identifier] = null oldObj[self.identifier] = null
oldObj.save() oldObj.save().success(function() {
if (associatedObject) {
associatedObject[self.identifier] = instance.id
associatedObject
.save()
.success(function() { emitter.emit('success', associatedObject) })
.error(function(err) { emitter.emit('error', err) })
} else {
emitter.emit('success', null)
} }
})
} else {
if (associatedObject) { if (associatedObject) {
associatedObject[self.identifier] = instance.id associatedObject[self.identifier] = instance.id
associatedObject associatedObject
...@@ -90,7 +98,7 @@ module.exports = (function() { ...@@ -90,7 +98,7 @@ module.exports = (function() {
} else { } else {
emitter.emit('success', null) emitter.emit('success', null)
} }
}
}) })
}).run() }).run()
} }
......
...@@ -266,23 +266,129 @@ module.exports = (function() { ...@@ -266,23 +266,129 @@ module.exports = (function() {
} }
QueryInterface.prototype.update = function(dao, tableName, values, identifier) { QueryInterface.prototype.update = function(dao, tableName, values, identifier) {
var sql = this.QueryGenerator.updateQuery(tableName, values, identifier) var self = this
return queryAndEmit.call(this, [sql, dao], 'update') , restrict = false
, sql = self.QueryGenerator.updateQuery(tableName, values, identifier)
// Check for a restrict field
if (!!dao.daoFactory && !!dao.daoFactory.associations) {
var keys = Object.keys(dao.daoFactory.associations)
, length = keys.length
for (var i = 0; i < length; i++) {
if (dao.daoFactory.associations[keys[i]].options && dao.daoFactory.associations[keys[i]].options.onUpdate && dao.daoFactory.associations[keys[i]].options.onUpdate === "restrict") {
restrict = true
}
}
}
return new Utils.CustomEventEmitter(function(emitter) {
var chainer = new Utils.QueryChainer()
chainer.add(self, 'enableForeignKeyConstraints', [])
chainer.add(self, 'queryAndEmit', [[sql, dao], 'delete'])
chainer.runSerially()
.success(function(results){
emitter.query = { sql: sql }
emitter.emit('success', results[1])
emitter.emit('sql', sql)
})
.error(function(err) {
emitter.query = { sql: sql }
emitter.emit('error', err)
emitter.emit('sql', sql)
})
.on('sql', function(sql) {
console.log('SQL!');
emitter.emit('sql', sql)
})
}).run()
} }
QueryInterface.prototype.bulkUpdate = function(tableName, values, identifier) { QueryInterface.prototype.bulkUpdate = function(tableName, values, identifier) {
var sql = this.QueryGenerator.updateQuery(tableName, values, identifier) var self = this
return queryAndEmit.call(this, sql, 'bulkUpdate') , sql = self.QueryGenerator.updateQuery(tableName, values, identifier)
return new Utils.CustomEventEmitter(function(emitter) {
var chainer = new Utils.QueryChainer()
chainer.add(self, 'enableForeignKeyConstraints', [])
chainer.add(self, 'queryAndEmit', [sql, 'bulkUpdate'])
return chainer.runSerially()
.success(function(results){
emitter.query = { sql: sql }
emitter.emit('sql', sql)
emitter.emit('success', results[1])
})
.error(function(err) {
emitter.query = { sql: sql }
emitter.emit('sql', sql)
emitter.emit('error', err)
})
}).run()
} }
QueryInterface.prototype.delete = function(dao, tableName, identifier) { QueryInterface.prototype.delete = function(dao, tableName, identifier) {
var sql = this.QueryGenerator.deleteQuery(tableName, identifier) var self = this
return queryAndEmit.call(this, [sql, dao], 'delete') , restrict = false
, sql = self.QueryGenerator.deleteQuery(tableName, identifier)
// Check for a restrict field
if (!!dao.daoFactory && !!dao.daoFactory.associations) {
var keys = Object.keys(dao.daoFactory.associations)
, length = keys.length
for (var i = 0; i < length; i++) {
if (dao.daoFactory.associations[keys[i]].options && dao.daoFactory.associations[keys[i]].options.onDelete && dao.daoFactory.associations[keys[i]].options.onDelete === "restrict") {
restrict = true
}
}
}
return new Utils.CustomEventEmitter(function(emitter) {
var chainer = new Utils.QueryChainer()
chainer.add(self, 'enableForeignKeyConstraints', [])
chainer.add(self, 'queryAndEmit', [[sql, dao], 'delete'])
chainer.runSerially()
.success(function(results){
emitter.query = { sql: sql }
emitter.emit('sql', sql)
emitter.emit('success', results[1])
})
.error(function(err) {
emitter.query = { sql: sql }
emitter.emit('sql', sql)
emitter.emit('error', err)
})
}).run()
} }
QueryInterface.prototype.bulkDelete = function(tableName, identifier, options) { QueryInterface.prototype.bulkDelete = function(tableName, identifier, options) {
var sql = this.QueryGenerator.deleteQuery(tableName, identifier, Utils._.defaults(options || {}, {limit: null})) var self = this
return queryAndEmit.call(this, sql, 'bulkDelete') var sql = self.QueryGenerator.deleteQuery(tableName, identifier, Utils._.defaults(options || {}, {limit: null}))
return new Utils.CustomEventEmitter(function(emitter) {
var chainer = new Utils.QueryChainer()
chainer.add(self, 'enableForeignKeyConstraints', [])
chainer.add(self, 'queryAndEmit', [sql, 'bulkDelete', options])
chainer.runSerially()
.success(function(results){
emitter.query = { sql: sql }
emitter.emit('sql', sql)
emitter.emit('success', results[1])
})
.error(function(err) {
emitter.query = { sql: sql }
emitter.emit('sql', sql)
emitter.emit('error', err)
})
}).run()
} }
QueryInterface.prototype.select = function(factory, tableName, options, queryOptions) { QueryInterface.prototype.select = function(factory, tableName, options, queryOptions) {
...@@ -385,9 +491,7 @@ module.exports = (function() { ...@@ -385,9 +491,7 @@ module.exports = (function() {
return this.QueryGenerator.escape(value) return this.QueryGenerator.escape(value)
} }
// private var queryAndEmit = QueryInterface.prototype.queryAndEmit = function(sqlOrQueryParams, methodName, options, emitter) {
var queryAndEmit = function(sqlOrQueryParams, methodName, options, emitter) {
options = Utils._.extend({ options = Utils._.extend({
success: function(){}, success: function(){},
error: function(){} error: function(){}
......
/* jshint camelcase: false */
var buster = require("buster")
, Helpers = require('../buster-helpers')
, Sequelize = require('../../index')
, DataTypes = require(__dirname + "/../../lib/data-types")
, dialect = Helpers.getTestDialect()
buster.spec.expose()
buster.testRunner.timeout = 1000
describe(Helpers.getTestDialectTeaser("ForeignKeys"), function() {
var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
before(function(done) {
var self = this
self.sequelize = Object.create(sequelize)
Helpers.clearDatabase(this.sequelize, done)
})
afterAll(function(done) {
Helpers.clearDatabase(sequelize, done)
})
describe("Foreign key constraints", function() {
it("are not enabled by default", function(done) {
var self = Object.create(this.sequelize)
, Task = self.define('Task1', { title: Sequelize.STRING })
, User = self.define('User1', { username: Sequelize.STRING })
User.hasMany(Task)
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask1s([task]).success(function() {
user.destroy().success(function() {
Task.findAll().success(function(tasks) {
expect(tasks.length).toEqual(1)
done()
})
})
})
})
})
})
})
})
it("can cascade deletes", function(done) {
var self = Object.create(this.sequelize)
, Task = self.define('Task2', { title: DataTypes.STRING })
, User = self.define('User2', { username: DataTypes.STRING })
User.hasMany(Task, {onDelete: 'cascade'})
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask2s([task]).success(function() {
user.destroy()
.error(function(err) {
expect(false).toEqual('This shouldn\'t error.')
done()
})
.success(function() {
Task.all({where: {User2Id: user.id}}).success(function(tasks) {
expect(tasks.length).toEqual(0)
done()
})
})
})
})
})
})
})
})
it("can restrict deletes", function(done) {
var self = Object.create(this.sequelize)
, Task = self.define('Task3', { title: DataTypes.STRING })
, User = self.define('User3', { username: DataTypes.STRING })
User.hasMany(Task, {onDelete: 'restrict'})
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask3s([task]).success(function() {
user.destroy()
.success(function(success) {
expect(false).toEqual('This shouldn\'t succeed.')
done()
})
.error(function(err) {
// Should fail due to FK restriction
Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1)
done()
})
})
})
})
})
})
})
})
it("can cascade updates", function(done) {
var self = Object.create(this.sequelize)
, Task = self.define('Task4', { title: DataTypes.STRING })
, User = self.define('User4', { username: DataTypes.STRING })
User.hasMany(Task, {onUpdate: 'cascade'})
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask4s([task]).success(function() {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.error(function() {
expect(false).toEqual('This shouldn\'t error.')
done()
})
.success(function() {
Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1)
expect(tasks[0].User4Id).toEqual(999)
done()
})
})
})
})
})
})
})
})
it("can restrict updates", function(done) {
var self = Object.create(this.sequelize)
, Task = self.define('Task5', { title: DataTypes.STRING })
, User = self.define('User5', { username: DataTypes.STRING })
User.hasMany(Task, {onUpdate: 'restrict'})
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask5s([task]).success(function() {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() {
expect(false).toEqual('You shouldn\'t reach this.')
done()
})
.error(function() {
// Should fail due to FK restriction
Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1)
done()
})
})
})
})
})
})
})
})
})
})
...@@ -14,10 +14,14 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -14,10 +14,14 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
before(function(done) { before(function(done) {
var self = this var self = this
self.sequelize = sequelize self.sequelize = Object.create(sequelize)
Helpers.clearDatabase(this.sequelize, done) Helpers.clearDatabase(this.sequelize, done)
}) })
afterAll(function(done) {
Helpers.clearDatabase(sequelize, done)
})
describe('general usage', function() { describe('general usage', function() {
before(function(done) { before(function(done) {
var self = this var self = this
...@@ -29,44 +33,49 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -29,44 +33,49 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
describe('mono-directional', function() { describe('mono-directional', function() {
it("adds the foreign key", function() { it("adds the foreign key", function(done) {
var self = this var self = this
self.User.hasMany(self.Task) self.User.hasMany(self.Task)
expect(self.Task.attributes.UserId).toEqual("INTEGER") expect(self.Task.attributes.UserId).toEqual("INTEGER")
done()
}) })
it('adds the foreign key with underscore', function() { it('adds the foreign key with underscore', function(done) {
var self = this var self = Object.create(this.sequelize)
, User = self.sequelize.define('User', { username: Helpers.Sequelize.STRING }) , User = self.define('User', { username: Helpers.Sequelize.STRING })
, Task = self.sequelize.define('Task', { title: Helpers.Sequelize.STRING }, { underscored: true }) , Task = self.define('Task', { title: Helpers.Sequelize.STRING }, { underscored: true })
Task.hasMany(User) Task.hasMany(User)
expect(User.attributes.task_id).toBeDefined() expect(User.attributes.task_id).toBeDefined()
done()
}) })
it('uses the passed foreign key', function() { it('uses the passed foreign key', function(done) {
var self = this var self = this
self.User.hasMany(self.Task, { foreignKey: 'person_id' }) self.User.hasMany(self.Task, { foreignKey: 'person_id' })
expect(self.Task.attributes.person_id).toEqual("INTEGER") expect(self.Task.attributes.person_id).toEqual("INTEGER")
done()
}) })
it('defines getters and setters', function() { it('defines getters and setters', function(done) {
var self = this var self = this
self.User.hasMany(self.Task) self.User.hasMany(self.Task)
var u = self.User.build({username: 'asd'}) var u = self.User.build({username: 'asd'})
expect(u.setTasks).toBeDefined() expect(u.setTasks).toBeDefined()
expect(u.getTasks).toBeDefined() expect(u.getTasks).toBeDefined()
done()
}) })
it("defines getters and setters according to the 'as' option", function() { it("defines getters and setters according to the 'as' option", function(done) {
var self = this var self = this
self.User.hasMany(self.Task, {as: 'Tasks'}) self.User.hasMany(self.Task, {as: 'Tasks'})
var u = self.User.build({username: 'asd'}) var u = self.User.build({username: 'asd'})
expect(u.setTasks).toBeDefined() expect(u.setTasks).toBeDefined()
expect(u.getTasks).toBeDefined() expect(u.getTasks).toBeDefined()
done()
}) })
it("sets and gets associated objects", function(done) { it("sets and gets associated objects", function(done) {
...@@ -97,16 +106,16 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -97,16 +106,16 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
it("should allow selfAssociation to be single linked (only one DAO is created)", function(done) { it("should allow selfAssociation to be single linked (only one DAO is created)", function(done) {
var self = this var self = Object.create(this.sequelize)
, oldLength = self.sequelize.daoFactoryManager.daos.length , oldLength = self.daoFactoryManager.daos.length
, Comment = self.sequelize.define('Comment', { content: Helpers.Sequelize.STRING }) , Comment = self.define('Comment', { content: Helpers.Sequelize.STRING })
Comment.belongsTo(Comment, {as: "Parent"}); Comment.belongsTo(Comment, {as: "Parent"});
Comment.hasMany(Comment, {as: 'Children', foreignKey: "ParentId", useJunctionTable: false}) Comment.hasMany(Comment, {as: 'Children', foreignKey: "ParentId", useJunctionTable: false})
expect(self.sequelize.daoFactoryManager.daos.length).toEqual(oldLength + 1) expect(self.daoFactoryManager.daos.length).toEqual(oldLength + 1)
self.sequelize.sync({ force: true }).success(function() { Comment.sync({ force: true }).success(function() {
Comment.create({ content: 'parentComment' }).success(function(parent) { Comment.create({ content: 'parentComment' }).success(function(parent) {
Comment.create({ content: 'child1' }).success(function(child1) { Comment.create({ content: 'child1' }).success(function(child1) {
child1.setParent(parent).success(function() { child1.setParent(parent).success(function() {
...@@ -138,28 +147,31 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -138,28 +147,31 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
describe('bi-directional', function() { describe('bi-directional', function() {
it('adds the foreign key', function() { it('adds the foreign key', function(done) {
var self = this var self = Object.create(this.sequelize)
, selfx = this
this.Task.hasMany(this.User) selfx.Task.hasMany(selfx.User)
this.User.hasMany(this.Task) selfx.User.hasMany(selfx.Task)
expect(this.Task.attributes.UserId).not.toBeDefined() expect(selfx.Task.attributes.UserId).not.toBeDefined()
expect(this.User.attributes.UserId).not.toBeDefined() expect(selfx.User.attributes.UserId).not.toBeDefined()
var daos = this.sequelize.daoFactoryManager.daos.filter(function(dao) { var daos = self.daoFactoryManager.daos.filter(function(dao) {
return (dao.tableName == (self.Task.tableName + self.User.tableName)) return (dao.tableName == (selfx.Task.tableName + selfx.User.tableName))
}) })
daos.forEach(function(dao) { daos.forEach(function(dao) {
expect(dao.attributes.UserId).toBeDefined() expect(dao.attributes.UserId).toBeDefined()
expect(dao.attributes.TaskId).toBeDefined() expect(dao.attributes.TaskId).toBeDefined()
}) })
done()
}) })
it("adds the foreign key with underscores", function(done) { it("adds the foreign key with underscores", function(done) {
var User = this.sequelize.define('User', { username: Helpers.Sequelize.STRING }, { underscored: true }) var self = Object.create(this.sequelize)
, Task = this.sequelize.define('Task', { title: Helpers.Sequelize.STRING }) , User = self.define('User', { username: Helpers.Sequelize.STRING }, { underscored: true })
, Task = self.define('Task', { title: Helpers.Sequelize.STRING })
Task.hasMany(User) Task.hasMany(User)
User.hasMany(Task) User.hasMany(Task)
...@@ -167,7 +179,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -167,7 +179,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
expect(Task.attributes.user_id).not.toBeDefined() expect(Task.attributes.user_id).not.toBeDefined()
expect(User.attributes.user_id).not.toBeDefined() expect(User.attributes.user_id).not.toBeDefined()
var daos = this.sequelize.daoFactoryManager.daos.filter(function(dao) { var daos = self.daoFactoryManager.daos.filter(function(dao) {
return (dao.tableName == (Task.tableName + User.tableName)) return (dao.tableName == (Task.tableName + User.tableName))
}) })
...@@ -179,13 +191,14 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -179,13 +191,14 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
it("uses the passed foreign keys", function(done) { it("uses the passed foreign keys", function(done) {
var self = this var self = Object.create(this.sequelize)
, selfx = this
this.User.hasMany(this.Task, { foreignKey: 'person_id' }) this.User.hasMany(this.Task, { foreignKey: 'person_id' })
this.Task.hasMany(this.User, { foreignKey: 'work_item_id' }) this.Task.hasMany(this.User, { foreignKey: 'work_item_id' })
var daos = this.sequelize.daoFactoryManager.daos.filter(function(dao) { var daos = self.daoFactoryManager.daos.filter(function(dao) {
return (dao.tableName == (self.Task.tableName + self.User.tableName)) return (dao.tableName == (selfx.Task.tableName + selfx.User.tableName))
}) })
daos.forEach(function(dao) { daos.forEach(function(dao) {
...@@ -230,7 +243,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -230,7 +243,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
this.User.hasMany(this.Task, {as: 'Tasks'}) this.User.hasMany(this.Task, {as: 'Tasks'})
this.Task.hasMany(this.User, {as: 'Users'}) this.Task.hasMany(this.User, {as: 'Users'})
this.sequelize.sync({ force: true }).success(function() {
self.User.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() {
self.User.create({username: 'name'}).success(function(user1) { self.User.create({username: 'name'}).success(function(user1) {
self.User.create({username: 'name2'}).success(function(user2) { self.User.create({username: 'name2'}).success(function(user2) {
self.Task.create({title: 'task1'}).success(function(task1) { self.Task.create({title: 'task1'}).success(function(task1) {
...@@ -259,17 +274,18 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -259,17 +274,18 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
})
it("build the connector daos name", function(done) { it("build the connector daos name", function(done) {
var self = this var self = Object.create(this.sequelize)
, Person = this.sequelize.define('Person', { name: Helpers.Sequelize.STRING }) , Person = self.define('Person', { name: Helpers.Sequelize.STRING })
Person.hasMany(Person, {as: 'Children'}) Person.hasMany(Person, {as: 'Children'})
Person.hasMany(Person, {as: 'Friends'}) Person.hasMany(Person, {as: 'Friends'})
Person.hasMany(Person, {as: 'CoWorkers'}) Person.hasMany(Person, {as: 'CoWorkers'})
Person.sync({force: true}).success(function() { Person.sync({ force: true }).success(function() {
var daoNames = self.sequelize.daoFactoryManager.daos.map(function(dao) { return dao.tableName }) var daoNames = self.daoFactoryManager.daos.map(function(dao) { return dao.tableName })
, expectation = ["Persons", "ChildrenPersons", "CoWorkersPersons", "FriendsPersons"] , expectation = ["Persons", "ChildrenPersons", "CoWorkersPersons", "FriendsPersons"]
expectation.forEach(function(ex) { expectation.forEach(function(ex) {
...@@ -326,7 +342,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -326,7 +342,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
User.hasMany(Company, {as: 'Companies', foreignKey: 'user_id', joinTableName: 'CompanyAccess'}) User.hasMany(Company, {as: 'Companies', foreignKey: 'user_id', joinTableName: 'CompanyAccess'})
Company.hasMany(User, {as: 'Users', foreignKey: 'company_id', joinTableName: 'CompanyAccess'}) Company.hasMany(User, {as: 'Users', foreignKey: 'company_id', joinTableName: 'CompanyAccess'})
this.sequelize.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
Company.sync({ force: true }).success(function() {
CompanyAccess.sync({ force: true }).success(function() {
Company.create({name: 'IBM'}).success(function(ibm) { Company.create({name: 'IBM'}).success(function(ibm) {
companies.push(ibm) companies.push(ibm)
Company.create({name: 'EA'}).success(function(ea) { Company.create({name: 'EA'}).success(function(ea) {
...@@ -347,6 +365,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -347,6 +365,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
})
})
it("gets and sets the connector daos", function(done) { it("gets and sets the connector daos", function(done) {
var self = this var self = this
...@@ -375,6 +395,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -375,6 +395,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
describe('(1:N)', function() { describe('(1:N)', function() {
describe('hasSingle', function() { describe('hasSingle', function() {
before(function(done) { before(function(done) {
var self = this
this.Article = this.sequelize.define('Article', { this.Article = this.sequelize.define('Article', {
'title': Sequelize.STRING 'title': Sequelize.STRING
}) })
...@@ -384,7 +405,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -384,7 +405,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
this.Article.hasMany(this.Label) this.Article.hasMany(this.Label)
this.sequelize.sync({ force: true }).success(done) self.Article.sync({ force: true }).success(function() {
self.Label.sync({ force: true }).success(done)
})
}) })
it('does not have any labels assigned to it initially', function(done) { it('does not have any labels assigned to it initially', function(done) {
...@@ -434,6 +457,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -434,6 +457,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
describe('hasAll', function() { describe('hasAll', function() {
before(function(done) { before(function(done) {
var self = this
this.Article = this.sequelize.define('Article', { this.Article = this.sequelize.define('Article', {
'title': Sequelize.STRING 'title': Sequelize.STRING
}) })
...@@ -443,7 +467,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -443,7 +467,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
this.Article.hasMany(this.Label) this.Article.hasMany(this.Label)
this.sequelize.sync({ force: true }).success(done) self.Article.sync({ force: true }).success(function() {
self.Label.sync({ force: true }).success(done)
})
}) })
it('answers false if only some labels have been assigned', function(done) { it('answers false if only some labels have been assigned', function(done) {
...@@ -483,18 +509,19 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -483,18 +509,19 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
describe('setAssociations', function() { describe('setAssociations', function() {
it("clears associations when passing null to the set-method", function(done) { it("clears associations when passing null to the set-method", function(done) {
var User = this.sequelize.define('User', { username: Sequelize.STRING }) var self = Object.create(this.sequelize)
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) , User = self.define('User', { username: Sequelize.STRING })
, Task = self.define('Task', { title: Sequelize.STRING })
Task.hasMany(User) Task.hasMany(User)
this.sequelize.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) { User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) { Task.create({ title: 'task' }).success(function(task) {
task.setUsers([ user ]).success(function() { task.setUsers([ user ]).success(function() {
task.getUsers().success(function(_users) { task.getUsers().success(function(_users) {
expect(_users.length).toEqual(1) expect(_users.length).toEqual(1)
task.setUsers(null).success(function() { task.setUsers(null).success(function() {
task.getUsers().success(function(_users) { task.getUsers().success(function(_users) {
expect(_users.length).toEqual(0) expect(_users.length).toEqual(0)
...@@ -508,22 +535,24 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -508,22 +535,24 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
})
it("clears associations when passing null to the set-method with omitNull set to true", function(done) { it("clears associations when passing null to the set-method with omitNull set to true", function(done) {
this.sequelize.options.omitNull = true var self = Object.create(this.sequelize)
self.options.omitNull = true
var User = this.sequelize.define('User', { username: Sequelize.STRING }) var User = self.define('User', { username: Sequelize.STRING })
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) , Task = self.define('Task', { title: Sequelize.STRING })
Task.hasMany(User) Task.hasMany(User)
this.sequelize.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) { User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) { Task.create({ title: 'task' }).success(function(task) {
task.setUsers([ user ]).success(function() { task.setUsers([ user ]).success(function() {
task.getUsers().success(function(_users) { task.getUsers().success(function(_users) {
expect(_users.length).toEqual(1) expect(_users.length).toEqual(1)
task.setUsers(null).success(function() { task.setUsers(null).success(function() {
task.getUsers().success(function(_users) { task.getUsers().success(function(_users) {
expect(_users.length).toEqual(0) expect(_users.length).toEqual(0)
...@@ -536,6 +565,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -536,6 +565,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
})
describe("getting assocations with options", function() { describe("getting assocations with options", function() {
before(function(done) { before(function(done) {
...@@ -573,7 +603,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -573,7 +603,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
this.Article.hasMany(this.Label) this.Article.hasMany(this.Label)
this.sequelize.sync({ force: true }).success(function() { self.Article.sync({ force: true }).success(function() {
self.Label.sync({ force: true }).success(function() {
var chainer = new Sequelize.Utils.QueryChainer([ var chainer = new Sequelize.Utils.QueryChainer([
self.Article.create({ title: 'Article' }), self.Article.create({ title: 'Article' }),
self.Label.create({ text: 'Awesomeness', until: '2014-01-01 01:00:00' }), self.Label.create({ text: 'Awesomeness', until: '2014-01-01 01:00:00' }),
...@@ -592,6 +623,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -592,6 +623,7 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
})
it("gets all associated objects when no options are passed", function(done) { it("gets all associated objects when no options are passed", function(done) {
this.User.find({where: {username: 'John'}}).success(function (john) { this.User.find({where: {username: 'John'}}).success(function (john) {
...@@ -613,39 +645,45 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -613,39 +645,45 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
describe('optimizations using bulk create, destroy and update', function () { describe('optimizations using bulk create, destroy and update', function () {
before(function (done) { before(function(done) {
this.User = this.sequelize.define('User', { username: Sequelize.STRING }, {timestamps: false}) var self = Object.create(this.sequelize)
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING }, {timestamps: false}) , selfx = this
this.User = self.define('User', { username: Sequelize.STRING }, {timestamps: false})
this.Task = self.define('Task', { title: Sequelize.STRING }, {timestamps: false})
this.User.hasMany(this.Task) this.User.hasMany(this.Task)
this.sequelize.sync({force: true}).success(done) selfx.User.sync({ force: true }).success(function() {
selfx.Task.sync({force: true}).success(done)
})
}) })
it('uses one UPDATE statement', function (done) { it('uses one UPDATE statement', function(done) {
var spy = this.spy() var spy = this.spy()
, self = this
this.User.create({ username: 'foo' }).success(function(user) { this.User.create({ username: 'foo' }).success(function(user) {
this.Task.create({ title: 'task1' }).success(function(task1) { self.Task.create({ title: 'task1' }).success(function(task1) {
this.Task.create({ title: 'task2' }).success(function(task2) { self.Task.create({ title: 'task2' }).success(function(task2) {
user.setTasks([task1, task2]).on('sql', spy).on('sql', _.after(2, function (sql) { // We don't care about SELECt, only UPDAET user.setTasks([task1, task2]).on('sql', spy).on('sql', _.after(2, function (sql) { // We don't care about SELECT, only UPDAET
expect(sql).toMatch("UPDATE") expect(sql).toMatch("UPDATE")
expect(sql).toMatch("IN (1,2)") expect(sql).toMatch("IN (1,2)")
})).success(function () { })).success(function () {
expect(spy).toHaveBeenCalledTwice() // Once for SELECT, once for UPDATE expect(spy).toHaveBeenCalledTwice() // Once for SELECT, once for UPDATE
done() done()
}) })
}.bind(this)) })
}.bind(this)) })
}.bind(this)) })
}) })
it('uses one UPDATE statement', function (done) { it('uses one UPDATE statement', function(done) {
var spy = this.spy() var spy = this.spy()
, self = this
this.User.create({ username: 'foo' }).success(function (user) { this.User.create({ username: 'foo' }).success(function (user) {
this.Task.create({ title: 'task1' }).success(function (task1) { self.Task.create({ title: 'task1' }).success(function (task1) {
this.Task.create({ title: 'task2' }).success(function (task2) { self.Task.create({ title: 'task2' }).success(function (task2) {
user.setTasks([task1, task2]).success(function () { user.setTasks([task1, task2]).success(function () {
user.setTasks(null).on('sql', spy).on('sql', _.after(2, function (sql) { // We don't care about SELECT, only UPDATE user.setTasks(null).on('sql', spy).on('sql', _.after(2, function (sql) { // We don't care about SELECT, only UPDATE
expect(sql).toMatch("UPDATE") expect(sql).toMatch("UPDATE")
...@@ -655,9 +693,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -655,9 +693,9 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
done() done()
}) })
}) })
}.bind(this)) })
}.bind(this)) })
}.bind(this)) })
}) })
}) // end optimization using bulk create, destroy and update }) // end optimization using bulk create, destroy and update
}) })
...@@ -665,19 +703,21 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -665,19 +703,21 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
describe('(N:M)', function() { describe('(N:M)', function() {
describe("getting assocations with options", function() { describe("getting assocations with options", function() {
before(function(done) { before(function(done) {
var self = this var self = Object.create(this.sequelize)
, selfx = this
this.User = this.sequelize.define('User', { username: Sequelize.STRING }) selfx.User = self.define('User', { username: Sequelize.STRING })
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING, active: Sequelize.BOOLEAN }) selfx.Task = self.define('Task', { title: Sequelize.STRING, active: Sequelize.BOOLEAN })
self.User.hasMany(self.Task) selfx.User.hasMany(selfx.Task)
self.Task.hasMany(self.User) selfx.Task.hasMany(selfx.User)
this.sequelize.sync({ force: true }).done(function() { selfx.User.sync({ force: true }).done(function() {
selfx.Task.sync({ force: true }).success(function() {
var chainer = new Sequelize.Utils.QueryChainer([ var chainer = new Sequelize.Utils.QueryChainer([
self.User.create({ username: 'John'}), selfx.User.create({ username: 'John'}),
self.Task.create({ title: 'Get rich', active: true}), selfx.Task.create({ title: 'Get rich', active: true}),
self.Task.create({ title: 'Die trying', active: false}) selfx.Task.create({ title: 'Die trying', active: false})
]) ])
chainer.run().success(function (results, john, task1, task2) { chainer.run().success(function (results, john, task1, task2) {
...@@ -685,10 +725,11 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -685,10 +725,11 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
})
it("gets all associated objects when no options are passed", function(done) { it("gets all associated objects when no options are passed", function(done) {
this.User.find({where: {username: 'John'}}).success(function (john) { this.User.find({where: {username: 'John'}}).success(function(john) {
john.getTasks().success(function (tasks) { john.getTasks().success(function(tasks) {
expect(tasks.length).toEqual(2) expect(tasks.length).toEqual(2)
done() done()
}) })
...@@ -696,8 +737,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -696,8 +737,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
it("only get objects that fulfill the options", function(done) { it("only get objects that fulfill the options", function(done) {
this.User.find({where: {username: 'John'}}).success(function (john) { this.User.find({where: {username: 'John'}}).success(function(john) {
john.getTasks({where: {active: true}}).success(function (tasks) { john.getTasks({where: {active: true}}).success(function(tasks) {
expect(tasks.length).toEqual(1) expect(tasks.length).toEqual(1)
done() done()
}) })
...@@ -705,8 +746,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -705,8 +746,8 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
it("only gets objects that fulfill options with a formatted value", function(done) { it("only gets objects that fulfill options with a formatted value", function(done) {
this.User.find({where: {username: 'John'}}).success(function (john) { this.User.find({where: {username: 'John'}}).success(function(john) {
john.getTasks({where: ['active = ?', true]}).success(function (tasks) { john.getTasks({where: ['active = ?', true]}).success(function(tasks) {
expect(tasks.length).toEqual(1) expect(tasks.length).toEqual(1)
done() done()
}) })
...@@ -714,20 +755,23 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -714,20 +755,23 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
it("removes the reference id, which was added in the first place", function() { it("removes the reference id, which was added in the first place", function(done) {
var User = this.sequelize.define('User', { username: Sequelize.STRING }) var self = Object.create(this.sequelize)
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) , User = self.define('User', { username: Sequelize.STRING })
, Task = self.define('Task', { title: Sequelize.STRING })
User.hasMany(Task) User.hasMany(Task)
expect(Task.attributes.UserId).toBeDefined() expect(Task.attributes.UserId).toBeDefined()
Task.hasMany(User) Task.hasMany(User)
expect(Task.attributes.UserId).not.toBeDefined() expect(Task.attributes.UserId).not.toBeDefined()
done()
}) })
it("adds three items to the query chainer when calling sync", function() { it("adds three items to the query chainer when calling sync", function(done) {
var User = this.sequelize.define('User', { username: Sequelize.STRING }) var self = Object.create(this.sequelize)
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) , User = self.define('User', { username: Sequelize.STRING })
, Task = self.define('Task', { title: Sequelize.STRING })
User.hasMany(Task) User.hasMany(Task)
Task.hasMany(User) Task.hasMany(User)
...@@ -736,19 +780,22 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -736,19 +780,22 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
this.stub(Sequelize.Utils, 'QueryChainer').returns({ add: add, runSerially: function(){} }) this.stub(Sequelize.Utils, 'QueryChainer').returns({ add: add, runSerially: function(){} })
this.sequelize.sync({ force: true }) self.sync({ force: true })
expect(add).toHaveBeenCalledThrice() expect(add).toHaveBeenCalledThrice()
done()
}) })
describe('setAssociations', function() { describe('setAssociations', function() {
it("clears associations when passing null to the set-method", function(done) { it("clears associations when passing null to the set-method", function(done) {
var User = this.sequelize.define('User', { username: Sequelize.STRING }) var self = Object.create(this.sequelize)
, Task = this.sequelize.define('Task', { title: Sequelize.STRING }) , User = self.define('User', { username: Sequelize.STRING })
, Task = self.define('Task', { title: Sequelize.STRING })
User.hasMany(Task) User.hasMany(Task)
Task.hasMany(User) Task.hasMany(User)
this.sequelize.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) { User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) { Task.create({ title: 'task' }).success(function(task) {
task.setUsers([ user ]).success(function() { task.setUsers([ user ]).success(function() {
...@@ -768,24 +815,23 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -768,24 +815,23 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
}) })
describe('optimizations using bulk create, destroy and update', function () {
before(function (done) {
this.User = this.sequelize.define('User', { username: Sequelize.STRING }, {timestamps: false})
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING }, {timestamps: false})
this.User.hasMany(this.Task)
this.Task.hasMany(this.User)
this.sequelize.sync({force: true}).success(done)
}) })
it('uses one insert into statement', function (done) { describe('optimizations using bulk create, destroy and update', function () {
it('uses one insert into statement', function(done) {
var spy = this.spy() var spy = this.spy()
, selfx = Object.create(this.sequelize)
, User = selfx.define('User', { username: Sequelize.STRING }, {timestamps: false})
, Task = selfx.define('Task', { title: Sequelize.STRING }, {timestamps: false})
this.User.create({ username: 'foo' }).success(function(user) { User.hasMany(Task)
this.Task.create({ title: 'task1' }).success(function(task1) { Task.hasMany(User)
this.Task.create({ title: 'task2' }).success(function(task2) {
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task1' }).success(function(task1) {
Task.create({ title: 'task2' }).success(function(task2) {
user.setTasks([task1, task2]).on('sql', spy).on('sql', _.after(2, function (sql) { user.setTasks([task1, task2]).on('sql', spy).on('sql', _.after(2, function (sql) {
expect(sql).toMatch("INSERT INTO") expect(sql).toMatch("INSERT INTO")
expect(sql).toMatch("VALUES (1,1),(2,1)") expect(sql).toMatch("VALUES (1,1),(2,1)")
...@@ -793,17 +839,27 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -793,17 +839,27 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
expect(spy).toHaveBeenCalledTwice() // Once for SELECT, once for INSERT into expect(spy).toHaveBeenCalledTwice() // Once for SELECT, once for INSERT into
done() done()
}) })
}.bind(this)) })
}.bind(this)) })
}.bind(this)) })
})
})
}) })
it('uses one delete from statement', function (done) { it('uses one delete from statement', function(done) {
var spy = this.spy() var spy = this.spy()
, selfx = Object.create(this.sequelize)
, User = selfx.define('User', { username: Sequelize.STRING }, {timestamps: false})
, Task = selfx.define('Task', { title: Sequelize.STRING }, {timestamps: false})
this.User.create({ username: 'foo' }).success(function (user) { User.hasMany(Task)
this.Task.create({ title: 'task1' }).success(function (task1) { Task.hasMany(User)
this.Task.create({ title: 'task2' }).success(function (task2) {
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function (user) {
Task.create({ title: 'task1' }).success(function (task1) {
Task.create({ title: 'task2' }).success(function (task2) {
user.setTasks([task1, task2]).success(function () { user.setTasks([task1, task2]).success(function () {
user.setTasks(null).on('sql', spy).on('sql', _.after(2, function (sql) { user.setTasks(null).on('sql', spy).on('sql', _.after(2, function (sql) {
expect(sql).toMatch("DELETE FROM") expect(sql).toMatch("DELETE FROM")
...@@ -813,14 +869,17 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -813,14 +869,17 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
done() done()
}) })
}) })
}.bind(this)) })
}.bind(this)) })
}.bind(this)) })
})
})
}) })
}) // end optimization using bulk create, destroy and update }) // end optimization using bulk create, destroy and update
describe('join table creation', function () { describe('join table creation', function () {
before(function (done) { before(function(done) {
var self = this
this.User = this.sequelize.define('User', this.User = this.sequelize.define('User',
{ username: Sequelize.STRING }, { username: Sequelize.STRING },
{ tableName: 'users'} { tableName: 'users'}
...@@ -835,19 +894,22 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -835,19 +894,22 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
) )
this.Task.hasMany(this.User) this.Task.hasMany(this.User)
this.sequelize.sync({force: true}).success(done) self.User.sync({ force: true }).success(function() {
self.Task.sync({force: true}).success(done)
})
}) })
it('uses the specified joinTableName or a reasonable default', function(done) { it('uses the specified joinTableName or a reasonable default', function(done) {
for (var associationName in this.User.associations) { var self = this
expect(associationName).not.toEqual(this.User.tableName) for (var associationName in self.User.associations) {
expect(associationName).not.toEqual(this.Task.tableName) expect(associationName).not.toEqual(self.User.tableName)
expect(associationName).not.toEqual(self.Task.tableName)
var joinTableName = this.User.associations[associationName].options.joinTableName var joinTableName = self.User.associations[associationName].options.joinTableName
if (typeof joinTableName !== 'undefined') { if (typeof joinTableName !== 'undefined') {
expect(joinTableName).toEqual(associationName) expect(joinTableName).toEqual(associationName)
} }
var tableName = this.User.associations[associationName].options.tableName var tableName = self.User.associations[associationName].options.tableName
if (typeof tableName !== 'undefined') { if (typeof tableName !== 'undefined') {
expect(tableName).toEqual(associationName) expect(tableName).toEqual(associationName)
} }
...@@ -857,153 +919,19 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() { ...@@ -857,153 +919,19 @@ describe(Helpers.getTestDialectTeaser("HasMany"), function() {
}) })
}) })
describe("Foreign key constraints", function() {
before(function(done) {
Helpers.clearDatabase(this.sequelize, done) // Constraints need this for some reason...
})
it("are not enabled by default", function(done) {
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task)
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTasks([task]).success(function() {
user.destroy().success(function() {
Task.findAll().success(function(tasks) {
expect(tasks.length).toEqual(1)
done()
})
})
})
})
})
})
})
it("can cascade deletes", function(done) {
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task, {onDelete: 'cascade'})
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTasks([task]).success(function() {
user.destroy().success(function() {
Task.findAll().success(function(tasks) {
expect(tasks.length).toEqual(0)
done()
})
})
})
})
})
})
})
it("can restrict deletes", function(done) {
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task, {onDelete: 'restrict'})
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTasks([task]).success(function() {
user.destroy().error(function() {
// Should fail due to FK restriction
Task.findAll().success(function(tasks) {
expect(tasks.length).toEqual(1)
done()
})
})
})
})
})
})
})
it("can cascade updates", function(done) {
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task, {onUpdate: 'cascade'})
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTasks([task]).success(function() {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() {
Task.findAll().success(function(tasks) {
expect(tasks.length).toEqual(1)
expect(tasks[0].UserId).toEqual(999)
done()
})
})
})
})
})
})
})
it("can restrict updates", function(done) {
var Task = this.sequelize.define('Task', { title: Sequelize.STRING })
, User = this.sequelize.define('User', { username: Sequelize.STRING })
User.hasMany(Task, {onUpdate: 'restrict'})
this.sequelize.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTasks([task]).success(function() {
// Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory)
user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.error(function() {
// Should fail due to FK restriction
Task.findAll().success(function(tasks) {
expect(tasks.length).toEqual(1)
done()
})
})
})
})
})
})
})
})
describe("Association options", function() { describe("Association options", function() {
it('can specify data type for autogenerated relational keys', function(done) { it('can specify data type for autogenerated relational keys', function(done) {
var User = this.sequelize.define('UserXYZ', { username: Sequelize.STRING }) var self = Object.create(this.sequelize)
, User = self.define('UserXYZ', { username: Sequelize.STRING })
, dataTypes = [Sequelize.INTEGER, Sequelize.BIGINT, Sequelize.STRING] , dataTypes = [Sequelize.INTEGER, Sequelize.BIGINT, Sequelize.STRING]
, self = this
dataTypes.forEach(function(dataType) { dataTypes.forEach(function(dataType) {
var tableName = 'TaskXYZ_' + dataType.toString() var tableName = 'TaskXYZ_' + dataType.toString()
, Task = self.sequelize.define(tableName, { title: Sequelize.STRING }) , Task = self.define(tableName, { title: Sequelize.STRING })
User.hasMany(Task, { foreignKey: 'userId', keyType: dataType }) User.hasMany(Task, { foreignKey: 'userId', keyType: dataType })
self.sequelize.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
expect(Task.rawAttributes.userId.type.toString()) expect(Task.rawAttributes.userId.type.toString())
.toEqual(dataType.toString()) .toEqual(dataType.toString())
......
...@@ -7,83 +7,86 @@ var buster = require("buster") ...@@ -7,83 +7,86 @@ var buster = require("buster")
buster.spec.expose() buster.spec.expose()
buster.testRunner.timeout = 1500 buster.testRunner.timeout = 1500
var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
describe(Helpers.getTestDialectTeaser("HasOne"), function() { describe(Helpers.getTestDialectTeaser("HasOne"), function() {
var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
before(function(done) { before(function(done) {
this.sequelize = sequelize var self = this
Helpers.clearDatabase(this.sequelize, done) self.sequelize = Object.create(sequelize)
Helpers.clearDatabase(self.sequelize, done)
}) })
describe('general usage', function() { describe('general usage', function() {
before(function(done) { before(function(done) {
this.User = this.sequelize.define('User', { username: DataTypes.STRING })
this.Task = this.sequelize.define('Task', { title: DataTypes.STRING })
var self = this var self = this
this.User.sync({ force: true }).success(function() { Helpers.clearDatabase(self.sequelize, function() {
self.User = self.sequelize.define('User', { username: DataTypes.STRING })
self.Task = self.sequelize.define('Task', { title: DataTypes.STRING })
self.User.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(done) self.Task.sync({ force: true }).success(done)
}) })
}) })
})
it("adds the foreign key", function(done) { it("adds the foreign key", function() {
this.User.hasOne(this.Task) var self = this
expect(this.Task.attributes.UserId).toEqual("INTEGER") self.User.hasOne(self.Task)
done() expect(self.Task.attributes.UserId).toEqual("INTEGER")
}) })
it("adds an underscored foreign key", function(done) { it("adds an underscored foreign key", function() {
var User = this.sequelize.define('User', { username: DataTypes.STRING }, {underscored: true}) var self = this
, Task = this.sequelize.define('Task', { title: DataTypes.STRING }) , User = self.sequelize.define('User', { username: DataTypes.STRING }, {underscored: true})
, Task = self.sequelize.define('Task', { title: DataTypes.STRING })
User.hasOne(Task) User.hasOne(Task)
expect(Task.attributes.user_id).toEqual("INTEGER") expect(Task.attributes.user_id).toEqual("INTEGER")
done()
}) })
it("uses the passed foreign key", function(done) { it("uses the passed foreign key", function() {
var User = this.sequelize.define('User', { username: DataTypes.STRING }, {underscored: true}) var self = this
, Task = this.sequelize.define('Task', { title: DataTypes.STRING }) , User = self.sequelize.define('User', { username: DataTypes.STRING }, {underscored: true})
, Task = self.sequelize.define('Task', { title: DataTypes.STRING })
User.hasOne(Task, {foreignKey: 'person_id'}) User.hasOne(Task, {foreignKey: 'person_id'})
expect(Task.attributes.person_id).toEqual("INTEGER") expect(Task.attributes.person_id).toEqual("INTEGER")
done()
}) })
it("defines the getter and the setter", function(done) { it("defines the getter and the setter", function() {
this.User.hasOne(this.Task) var self = this
var u = this.User.build({username: 'asd'}) self.User.hasOne(self.Task)
var u = self.User.build({username: 'asd'})
expect(u.setTask).toBeDefined() expect(u.setTask).toBeDefined()
expect(u.getTask).toBeDefined() expect(u.getTask).toBeDefined()
done()
}) })
it("defined the getter and the setter according to the passed 'as' option", function(done) { it("defined the getter and the setter according to the passed 'as' option", function() {
this.User.hasOne(this.Task, {as: 'Work'}) var self = this
var u = this.User.build({username: 'asd'}) self.User.hasOne(self.Task, {as: 'Work'})
var u = self.User.build({username: 'asd'})
expect(u.setWork).toBeDefined() expect(u.setWork).toBeDefined()
expect(u.getWork).toBeDefined() expect(u.getWork).toBeDefined()
done()
}) })
it("aliases associations to the same table according to the passed 'as' option", function(done) { it("aliases associations to the same table according to the passed 'as' option", function() {
this.User.hasOne(this.Task, {as: 'Work'}); var self = this
this.User.hasOne(this.Task, {as: 'Play'}); self.User.hasOne(self.Task, {as: 'Work'});
self.User.hasOne(self.Task, {as: 'Play'});
var u = this.User.build({username: 'asd'}) var u = self.User.build({username: 'asd'})
expect(u.getWork).toBeDefined() expect(u.getWork).toBeDefined()
expect(u.setWork).toBeDefined() expect(u.setWork).toBeDefined()
expect(u.getPlay).toBeDefined() expect(u.getPlay).toBeDefined()
expect(u.setPlay).toBeDefined() expect(u.setPlay).toBeDefined()
done()
}) })
it("gets and sets the correct objects", function(done) { it("gets and sets the correct objects", function(done) {
var self = this var self = this
this.User.hasOne(this.Task, {as: 'Task'}) self.User.hasOne(self.Task, {as: 'Task'})
this.User.sync({ force: true }).success(function() { self.User.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.User.create({username: 'name'}).success(function(user) { self.User.create({username: 'name'}).success(function(user) {
self.Task.create({title: 'snafu'}).success(function(task) { self.Task.create({title: 'snafu'}).success(function(task) {
...@@ -106,8 +109,8 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -106,8 +109,8 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
it("unsets unassociated objects", function(done) { it("unsets unassociated objects", function(done) {
var self = this var self = this
this.User.hasOne(this.Task, {as: 'Task'}) self.User.hasOne(self.Task, {as: 'Task'})
this.User.sync({ force: true }).success(function() { self.User.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.User.create({username: 'name'}).success(function(user) { self.User.create({username: 'name'}).success(function(user) {
self.Task.create({title: 'snafu'}).success(function(task1) { self.Task.create({title: 'snafu'}).success(function(task1) {
...@@ -135,7 +138,7 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -135,7 +138,7 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
Person.hasOne(Person, {as: 'Mother', foreignKey: 'MotherId'}) Person.hasOne(Person, {as: 'Mother', foreignKey: 'MotherId'})
Person.hasOne(Person, {as: 'Father', foreignKey: 'FatherId'}) Person.hasOne(Person, {as: 'Father', foreignKey: 'FatherId'})
Person.sync({force: true}).success(function() { Person.sync({ force: true }).success(function() {
var p = Person.build() var p = Person.build()
expect(p.setFather).toBeDefined() expect(p.setFather).toBeDefined()
expect(p.setMother).toBeDefined() expect(p.setMother).toBeDefined()
...@@ -154,8 +157,9 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -154,8 +157,9 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
describe('getAssocation', function() { describe('getAssocation', function() {
it('should be able to handle a where object that\'s a first class citizen.', function(done) { it('should be able to handle a where object that\'s a first class citizen.', function(done) {
var User = this.sequelize.define('UserXYZ', { username: DataTypes.STRING }) var self = this
, Task = this.sequelize.define('TaskXYZ', { title: DataTypes.STRING, status: DataTypes.STRING }) , User = self.sequelize.define('UserXYZ', { username: DataTypes.STRING })
, Task = self.sequelize.define('TaskXYZ', { title: DataTypes.STRING, status: DataTypes.STRING })
User.hasOne(Task) User.hasOne(Task)
User.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
...@@ -177,9 +181,9 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -177,9 +181,9 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
describe('setAssociation', function() { describe('setAssociation', function() {
it('clears the association if null is passed', function(done) { it('clears the association if null is passed', function(done) {
var User = this.sequelize.define('UserXYZ', { username: DataTypes.STRING }) var self = this
, Task = this.sequelize.define('TaskXYZ', { title: DataTypes.STRING }) , User = self.sequelize.define('UserXYZ', { username: DataTypes.STRING })
, Task = self.sequelize.define('TaskXYZ', { title: DataTypes.STRING })
User.hasOne(Task) User.hasOne(Task)
User.sync({ force: true }).success(function() { User.sync({ force: true }).success(function() {
...@@ -189,14 +193,12 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -189,14 +193,12 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
user.setTaskXYZ(task).success(function() { user.setTaskXYZ(task).success(function() {
user.getTaskXYZ().success(function(task) { user.getTaskXYZ().success(function(task) {
expect(task).not.toEqual(null) expect(task).not.toEqual(null)
user.setTaskXYZ(null).success(function() { user.setTaskXYZ(null).success(function() {
user.getTaskXYZ().success(function(task) { user.getTaskXYZ().success(function(task) {
expect(task).toEqual(null) expect(task).toEqual(null)
done() done()
}) })
}) })
}) })
}) })
}) })
...@@ -209,30 +211,24 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -209,30 +211,24 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
describe("Foreign key constraints", function() { describe("Foreign key constraints", function() {
before(function(done) { before(function(done) {
var self = this var self = this
Helpers.initTests({ self.sequelize = Object.create(self.sequelize)
dialect: dialect, Helpers.clearDatabase(self.sequelize, done)
beforeComplete: function(sequelize, DataTypes) {
self.sequelize = sequelize
self.Task = sequelize.define('Task', { title: DataTypes.STRING })
self.User = sequelize.define('User', { username: DataTypes.STRING })
},
onComplete: function() {
self.sequelize.sync({ force: true }).success(done)
}
})
}) })
it("are not enabled by default", function(done) { it("is not enabled by default", function(done) {
var self = this var self = this
self.User.hasOne(self.Task) , Task = self.sequelize.define('Task1', { title: DataTypes.STRING })
, User = self.sequelize.define('User1', { username: DataTypes.STRING })
self.User.sync({ force: true }).success(function() { User.hasOne(Task)
self.Task.sync({ force: true }).success(function() {
self.User.create({ username: 'foo' }).success(function(user) { User.sync({ force: true }).success(function() {
self.Task.create({ title: 'task' }).success(function(task) { Task.sync({ force: true }).success(function() {
user.setTask(task).success(function() { User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask1(task).success(function() {
user.destroy().success(function() { user.destroy().success(function() {
self.Task.findAll().success(function(tasks) { Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1) expect(tasks.length).toEqual(1)
done() done()
}) })
...@@ -246,15 +242,18 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -246,15 +242,18 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
it("can cascade deletes", function(done) { it("can cascade deletes", function(done) {
var self = this var self = this
self.User.hasOne(self.Task, {onDelete: 'cascade'}) , Task = self.sequelize.define('Task2', { title: DataTypes.STRING })
, User = self.sequelize.define('User2', { username: DataTypes.STRING })
self.User.sync({ force: true }).success(function() { User.hasOne(Task, {onDelete: 'cascade'})
self.Task.sync({ force: true }).success(function() {
self.User.create({ username: 'foo' }).success(function(user) { User.sync({ force: true }).success(function() {
self.Task.create({ title: 'task' }).success(function(task) { Task.sync({ force: true }).success(function() {
user.setTask(task).success(function() { User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask2(task).success(function() {
user.destroy().success(function() { user.destroy().success(function() {
self.Task.findAll().success(function(tasks) { Task.all().success(function(tasks) {
expect(tasks.length).toEqual(0) expect(tasks.length).toEqual(0)
done() done()
}) })
...@@ -268,16 +267,23 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -268,16 +267,23 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
it("can restrict deletes", function(done) { it("can restrict deletes", function(done) {
var self = this var self = this
self.User.hasOne(self.Task, {onDelete: 'restrict'}) , Task = self.sequelize.define('Task3', { title: DataTypes.STRING })
, User = self.sequelize.define('User3', { username: DataTypes.STRING })
self.User.sync({ force: true }).success(function() { User.hasOne(Task, {onDelete: 'restrict'})
self.Task.sync({ force: true }).success(function() {
self.User.create({ username: 'foo' }).success(function(user) { User.sync({ force: true }).success(function() {
self.Task.create({ title: 'task' }).success(function(task) { Task.sync({ force: true }).success(function() {
user.setTask(task).success(function() { User.create({ username: 'foo' }).success(function(user) {
user.destroy().error(function() { Task.create({ title: 'task' }).success(function(task) {
user.setTask3(task).success(function() {
user.destroy().success(function() {
expect(false).toEqual('You shouldn\'t reach here.')
done()
})
.error(function() {
// Should fail due to FK restriction // Should fail due to FK restriction
self.Task.findAll().success(function(tasks) { Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1) expect(tasks.length).toEqual(1)
done() done()
}) })
...@@ -291,13 +297,16 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -291,13 +297,16 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
it("can cascade updates", function(done) { it("can cascade updates", function(done) {
var self = this var self = this
self.User.hasOne(self.Task, {onUpdate: 'cascade'}) , Task = self.sequelize.define('Task4', { title: DataTypes.STRING })
, User = self.sequelize.define('User4', { username: DataTypes.STRING })
self.User.sync({ force: true }).success(function() { User.hasOne(Task, {onUpdate: 'cascade'})
self.Task.sync({ force: true }).success(function() {
self.User.create({ username: 'foo' }).success(function(user) { User.sync({ force: true }).success(function() {
self.Task.create({ title: 'task' }).success(function(task) { Task.sync({ force: true }).success(function() {
user.setTask(task).success(function() { User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask4(task).success(function() {
// Changing the id of a DAO requires a little dance since // Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the // the `UPDATE` query generated by `save()` uses `id` in the
...@@ -306,9 +315,9 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -306,9 +315,9 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory) var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory)
user.QueryInterface.update(user, tableName, {id: 999}, user.id) user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() { .success(function() {
self.Task.findAll().success(function(tasks) { Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1) expect(tasks.length).toEqual(1)
expect(tasks[0].UserId).toEqual(999) expect(tasks[0].User4Id).toEqual(999)
done() done()
}) })
}) })
...@@ -321,23 +330,29 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() { ...@@ -321,23 +330,29 @@ describe(Helpers.getTestDialectTeaser("HasOne"), function() {
it("can restrict updates", function(done) { it("can restrict updates", function(done) {
var self = this var self = this
self.User.hasOne(self.Task, {onUpdate: 'restrict'}) , Task = self.sequelize.define('Task5', { title: DataTypes.STRING })
, User = self.sequelize.define('User5', { username: DataTypes.STRING })
self.User.sync({ force: true }).success(function() { User.hasOne(Task, {onUpdate: 'restrict'})
self.Task.sync({ force: true }).success(function() {
self.User.create({ username: 'foo' }).success(function(user) {
self.Task.create({ title: 'task' }).success(function(task) {
user.setTask(task).success(function() {
User.sync({ force: true }).success(function() {
Task.sync({ force: true }).success(function() {
User.create({ username: 'foo' }).success(function(user) {
Task.create({ title: 'task' }).success(function(task) {
user.setTask5(task).success(function() {
// Changing the id of a DAO requires a little dance since // Changing the id of a DAO requires a little dance since
// the `UPDATE` query generated by `save()` uses `id` in the // the `UPDATE` query generated by `save()` uses `id` in the
// `WHERE` clause // `WHERE` clause
var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory) var tableName = user.QueryInterface.QueryGenerator.addSchema(user.__factory)
user.QueryInterface.update(user, tableName, {id: 999}, user.id) user.QueryInterface.update(user, tableName, {id: 999}, user.id)
.success(function() {
expect(1).toEqual(2)
done()
})
.error(function() { .error(function() {
// Should fail due to FK restriction // Should fail due to FK restriction
self.Task.findAll().success(function(tasks) { Task.all().success(function(tasks) {
expect(tasks.length).toEqual(1) expect(tasks.length).toEqual(1)
done() done()
}) })
......
...@@ -50,6 +50,7 @@ describe(Helpers.getTestDialectTeaser("Configuration"), function() { ...@@ -50,6 +50,7 @@ describe(Helpers.getTestDialectTeaser("Configuration"), function() {
return done() return done()
} }
(function() {
var sequelizeSpecific1 = new Sequelize(config[dialect].database, config[dialect].username, 'fakepass123', {logging: false, host: config[dialect].host, port: 1, dialect: dialect}) var sequelizeSpecific1 = new Sequelize(config[dialect].database, config[dialect].username, 'fakepass123', {logging: false, host: config[dialect].host, port: 1, dialect: dialect})
, domain = require('domain') , domain = require('domain')
, d = domain.create() , d = domain.create()
...@@ -65,6 +66,7 @@ describe(Helpers.getTestDialectTeaser("Configuration"), function() { ...@@ -65,6 +66,7 @@ describe(Helpers.getTestDialectTeaser("Configuration"), function() {
sequelizeSpecific1.query('select 1 as hello') sequelizeSpecific1.query('select 1 as hello')
.success(function(){}) .success(function(){})
}) })
})()
}) })
it('when we don\'t have a valid dialect.', function(done) { it('when we don\'t have a valid dialect.', function(done) {
......
...@@ -21,8 +21,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -21,8 +21,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
before(function(done) { before(function(done) {
this.sequelize = sequelize this.sequelize = Object.create(sequelize)
this.DataTypes = DataTypes
this.User = User this.User = User
var self = this var self = this
Helpers.clearDatabase(this.sequelize, function() { Helpers.clearDatabase(this.sequelize, function() {
...@@ -570,15 +569,14 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -570,15 +569,14 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('enums', function() { describe('enums', function() {
it('correctly restores enum values', function(done) { it('correctly restores enum values', function(done) {
var self = this var self = this
this.Item = this.sequelize.define('Item', { , Item = self.sequelize.define('Item', {
state: { type: Helpers.Sequelize.ENUM, values: ['available', 'in_cart', 'shipped'] } state: { type: Helpers.Sequelize.ENUM, values: ['available', 'in_cart', 'shipped'] }
}) })
this.Item.sync({ force: true }).success(function() { Item.sync({ force: true }).success(function() {
self.Item.create({ state: 'available' }).success(function(item) { Item.create({ state: 'available' }).success(function(_item) {
self.item = item Item.find({ where: { state: 'available' }}).success(function(item) {
self.Item.find({ where: { state: 'available' }}).success(function(item) { expect(item.id).toEqual(_item.id)
expect(item.id).toEqual(self.item.id)
done() done()
}) })
}) })
...@@ -710,25 +708,21 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -710,25 +708,21 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
describe('enums', function() { describe('enums', function() {
before(function(done) { it('correctly restores enum values', function(done) {
var self = this var self = this
this.Item = this.sequelize.define('Item', { , Item = self.sequelize.define('Item', {
state: { type: Helpers.Sequelize.ENUM, values: ['available', 'in_cart', 'shipped'] }, state: { type: Helpers.Sequelize.ENUM, values: ['available', 'in_cart', 'shipped'] },
name: Sequelize.STRING name: Sequelize.STRING
}) })
this.Item.sync({ force: true }).success(function() { Item.sync({ force: true }).success(function() {
self.Item.bulkCreate([{state: 'in_cart', name: 'A'}, { state: 'available', name: 'B'}]).success(function() { Item.bulkCreate([{state: 'in_cart', name: 'A'}, { state: 'available', name: 'B'}]).success(function() {
Item.find({ where: { state: 'available' }}).success(function(item) {
expect(item.name).toEqual('B')
done() done()
}) })
}) })
}) })
it('correctly restores enum values', function(done) {
this.Item.find({ where: { state: 'available' }}).success(function(item) {
expect(item.name).toEqual('B')
done()
})
}) })
}) })
}) })
...@@ -809,17 +803,17 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -809,17 +803,17 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('destroy', function() { describe('destroy', 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(done) {
var User = this.sequelize.define('User', { var UserDestroy = this.sequelize.define('UserDestory', {
name: Sequelize.STRING, name: Sequelize.STRING,
bio: Sequelize.TEXT bio: Sequelize.TEXT
}) })
User.sync({ force: true }).success(function() { UserDestroy.sync({ force: true }).success(function() {
User.create({name: 'hallo', bio: 'welt'}).success(function(u) { UserDestroy.create({name: 'hallo', bio: 'welt'}).success(function(u) {
User.all().success(function(users) { UserDestroy.all().success(function(users) {
expect(users.length).toEqual(1) expect(users.length).toEqual(1)
u.destroy().success(function() { u.destroy().success(function() {
User.all().success(function(users) { UserDestroy.all().success(function(users) {
expect(users.length).toEqual(0) expect(users.length).toEqual(0)
done() done()
}) })
...@@ -830,14 +824,14 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -830,14 +824,14 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
it('allows sql logging of delete statements', function(done) { it('allows sql logging of delete statements', function(done) {
var User = this.sequelize.define('User', { var UserDelete = this.sequelize.define('UserDelete', {
name: Sequelize.STRING, name: Sequelize.STRING,
bio: Sequelize.TEXT bio: Sequelize.TEXT
}) })
User.sync({ force: true }).success(function() { UserDelete.sync({ force: true }).success(function() {
User.create({name: 'hallo', bio: 'welt'}).success(function(u) { UserDelete.create({name: 'hallo', bio: 'welt'}).success(function(u) {
User.all().success(function(users) { UserDelete.all().success(function(users) {
expect(users.length).toEqual(1) expect(users.length).toEqual(1)
u.destroy().on('sql', function(sql) { u.destroy().on('sql', function(sql) {
expect(sql).toBeDefined() expect(sql).toBeDefined()
...@@ -868,7 +862,8 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -868,7 +862,8 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
it('sets deletedAt to the current timestamp if paranoid is true', function(done) { it('sets deletedAt to the current timestamp if paranoid is true', function(done) {
var User = this.sequelize.define('ParanoidUser', { var self = this
, ParanoidUser = self.sequelize.define('ParanoidUser', {
username: Sequelize.STRING, username: Sequelize.STRING,
secretValue: Sequelize.STRING, secretValue: Sequelize.STRING,
data: Sequelize.STRING, data: Sequelize.STRING,
...@@ -880,18 +875,19 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -880,18 +875,19 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
{ username: 'Paul', secretValue: '42' }, { username: 'Paul', secretValue: '42' },
{ username: 'Bob', secretValue: '43' }] { username: 'Bob', secretValue: '43' }]
User.sync({ force: true }).success(function() { ParanoidUser.sync({ force: true }).success(function() {
User.bulkCreate(data).success(function() { ParanoidUser.bulkCreate(data).success(function() {
User.destroy({secretValue: '42'}).success(function() { var date = parseInt(+new Date()/5000, 10)
User.findAll({order: 'id'}).success(function(users) { ParanoidUser.destroy({secretValue: '42'}).success(function() {
ParanoidUser.findAll({order: 'id'}).success(function(users) {
expect(users.length).toEqual(3) expect(users.length).toEqual(3)
expect(users[0].username).toEqual("Peter") expect(users[0].username).toEqual("Peter")
expect(users[1].username).toEqual("Paul") expect(users[1].username).toEqual("Paul")
expect(users[2].username).toEqual("Bob") expect(users[2].username).toEqual("Bob")
expect(parseInt(+users[0].deletedAt/5000, 10)).toEqual(parseInt(+new Date()/5000, 10)) expect(parseInt(+users[0].deletedAt/5000, 10)).toEqual(date)
expect(parseInt(+users[1].deletedAt/5000, 10)).toEqual(parseInt(+new Date()/5000, 10)) expect(parseInt(+users[1].deletedAt/5000, 10)).toEqual(date)
done() done()
}) })
...@@ -1118,7 +1114,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1118,7 +1114,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
this.User.create({username: 'barfooz'}).success(function(user) { this.User.create({username: 'barfooz'}).success(function(user) {
self.UserPrimary = self.sequelize.define('UserPrimary', { self.UserPrimary = self.sequelize.define('UserPrimary', {
specialKey: { specialKey: {
type: self.DataTypes.STRING, type: DataTypes.STRING,
primaryKey: true primaryKey: true
} }
}) })
...@@ -1177,7 +1173,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1177,7 +1173,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
it("should not try to convert boolean values if they are not selected", function(done) { it("should not try to convert boolean values if they are not selected", function(done) {
var UserWithBoolean = this.sequelize.define('user', { var UserWithBoolean = this.sequelize.define('UserBoolean', {
active: Sequelize.BOOLEAN active: Sequelize.BOOLEAN
}) })
...@@ -1223,19 +1219,20 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1223,19 +1219,20 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
it('finds entries via primary keys', function(done) { it('finds entries via primary keys', function(done) {
var User = this.sequelize.define('UserWithPrimaryKey', { var self = this
, UserPrimary = self.sequelize.define('UserWithPrimaryKey', {
identifier: {type: Sequelize.STRING, primaryKey: true}, identifier: {type: Sequelize.STRING, primaryKey: true},
name: Sequelize.STRING name: Sequelize.STRING
}) })
User.sync({ force: true }).success(function() { UserPrimary.sync({ force: true }).success(function() {
User.create({ UserPrimary.create({
identifier: 'an identifier', identifier: 'an identifier',
name: 'John' name: 'John'
}).success(function(u) { }).success(function(u) {
expect(u.id).not.toBeDefined() expect(u.id).not.toBeDefined()
User.find('an identifier').success(function(u2) { UserPrimary.find('an identifier').success(function(u2) {
expect(u2.identifier).toEqual('an identifier') expect(u2.identifier).toEqual('an identifier')
expect(u2.name).toEqual('John') expect(u2.name).toEqual('John')
done() done()
...@@ -1261,15 +1258,15 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1261,15 +1258,15 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
it('returns the selected fields and all fields of the included table as instance.selectedValues', function(done) { it('returns the selected fields and all fields of the included table as instance.selectedValues', function(done) {
var self = this var self = this
this.Mission = this.sequelize.define('Mission', { self.Mission = self.sequelize.define('Mission', {
title: {type: Sequelize.STRING, defaultValue: 'a mission!!'}, title: {type: Sequelize.STRING, defaultValue: 'a mission!!'},
foo: {type: Sequelize.INTEGER, defaultValue: 2}, foo: {type: Sequelize.INTEGER, defaultValue: 2},
}) })
this.Mission.belongsTo(this.User) self.Mission.belongsTo(self.User)
this.User.hasMany(this.Mission) self.User.hasMany(self.Mission)
this.Mission.sync({ force: true }).success(function() { self.Mission.sync({ force: true }).success(function() {
self.Mission.create().success(function(mission) { self.Mission.create().success(function(mission) {
self.User.create({username: 'John DOE'}).success(function(user) { self.User.create({username: 'John DOE'}).success(function(user) {
mission.setUser(user).success(function() { mission.setUser(user).success(function() {
...@@ -1336,14 +1333,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1336,14 +1333,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('belongsTo', function() { describe('belongsTo', function() {
describe('generic', function() { describe('generic', function() {
before(function(done) {
var self = this
this.Task.belongsTo(this.Worker)
this.init(function() {
self.task.setWorker(self.worker).success(done)
})
})
it('throws an error about unexpected input if include contains a non-object', function(done) { it('throws an error about unexpected input if include contains a non-object', function(done) {
var self = this var self = this
expect(function() { expect(function() {
...@@ -1369,9 +1358,13 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1369,9 +1358,13 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
it('returns the associated worker via task.worker', function(done) { it('returns the associated worker via task.worker', function(done) {
this.Task.find({ var self = this
this.Task.belongsTo(this.Worker)
this.init(function() {
self.task.setWorker(self.worker).success(function() {
self.Task.find({
where: { title: 'homework' }, where: { title: 'homework' },
include: [ this.Worker ] include: [ self.Worker ]
}).complete(function(err, task) { }).complete(function(err, task) {
expect(err).toBeNull() expect(err).toBeNull()
expect(task).toBeDefined() expect(task).toBeDefined()
...@@ -1381,9 +1374,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1381,9 +1374,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
}) })
}) })
})
})
it('returns the private and public ip', function(done) { it('returns the private and public ip', function(done) {
var self = this var self = Object.create(this)
self.Domain = self.sequelize.define('Domain', { ip: Sequelize.STRING }) self.Domain = self.sequelize.define('Domain', { ip: Sequelize.STRING })
self.Environment = self.sequelize.define('Environment', { name: Sequelize.STRING }) self.Environment = self.sequelize.define('Environment', { name: Sequelize.STRING })
self.Environment self.Environment
...@@ -1454,14 +1449,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1454,14 +1449,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
describe('hasOne with alias', function() { describe('hasOne with alias', function() {
before(function(done) {
var self = this
this.Worker.hasOne(this.Task, { as: 'ToDo' })
this.init(function() {
self.worker.setToDo(self.task).success(done)
})
})
it('throws an error if included DaoFactory is not referenced by alias', function(done) { it('throws an error if included DaoFactory is not referenced by alias', function(done) {
var self = this var self = this
expect(function() { expect(function() {
...@@ -1470,6 +1457,15 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1470,6 +1457,15 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
done() done()
}) })
describe('alias', function(done) {
before(function(done) {
var self = this
this.Worker.hasOne(this.Task, { as: 'ToDo' })
this.init(function() {
self.worker.setToDo(self.task).success(done)
})
})
it('throws an error if alias is not associated', function(done) { it('throws an error if alias is not associated', function(done) {
var self = this var self = this
expect(function() { expect(function() {
...@@ -1501,6 +1497,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1501,6 +1497,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
}) })
}) })
})
describe('hasMany', function() { describe('hasMany', function() {
before(function(done) { before(function(done) {
...@@ -1534,14 +1531,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1534,14 +1531,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
describe('hasMany with alias', function() { describe('hasMany with alias', function() {
before(function(done) {
var self = this
this.Worker.hasMany(this.Task, { as: 'ToDos' })
this.init(function() {
self.worker.setToDos([ self.task ]).success(done)
})
})
it('throws an error if included DaoFactory is not referenced by alias', function(done) { it('throws an error if included DaoFactory is not referenced by alias', function(done) {
var self = this var self = this
expect(function() { expect(function() {
...@@ -1550,6 +1539,15 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1550,6 +1539,15 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
done() done()
}) })
describe('alias', function() {
before(function(done) {
var self = this
this.Worker.hasMany(this.Task, { as: 'ToDos' })
this.init(function() {
self.worker.setToDos([ self.task ]).success(done)
})
})
it('throws an error if alias is not associated', function(done) { it('throws an error if alias is not associated', function(done) {
var self = this var self = this
expect(function() { expect(function() {
...@@ -1582,6 +1580,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1582,6 +1580,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
}) })
}) })
})
describe('queryOptions', function() { describe('queryOptions', function() {
before(function(done) { before(function(done) {
...@@ -1626,11 +1625,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1626,11 +1625,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('belongsTo', function() { describe('belongsTo', function() {
before(function(done) { before(function(done) {
var self = this var self = this
this.Task = this.sequelize.define('TaskBelongsTo', { title: Sequelize.STRING }) self.Task = self.sequelize.define('TaskBelongsTo', { title: Sequelize.STRING })
this.Worker = this.sequelize.define('Worker', { name: Sequelize.STRING }) self.Worker = self.sequelize.define('Worker', { name: Sequelize.STRING })
this.Task.belongsTo(this.Worker) self.Task.belongsTo(self.Worker)
this.Worker.sync({ force: true }).success(function() { self.Worker.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.Worker.create({ name: 'worker' }).success(function(worker) { self.Worker.create({ name: 'worker' }).success(function(worker) {
self.Task.create({ title: 'homework' }).success(function(task) { self.Task.create({ title: 'homework' }).success(function(task) {
...@@ -1685,10 +1684,10 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1685,10 +1684,10 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('hasOne', function() { describe('hasOne', function() {
before(function(done) { before(function(done) {
var self = this var self = this
this.Task = this.sequelize.define('TaskHasOne', { title: Sequelize.STRING }) self.Task = self.sequelize.define('TaskHasOne', { title: Sequelize.STRING })
this.Worker = this.sequelize.define('Worker', { name: Sequelize.STRING }) self.Worker = self.sequelize.define('Worker', { name: Sequelize.STRING })
this.Worker.hasOne(this.Task) self.Worker.hasOne(self.Task)
this.Worker.sync({ force: true }).success(function() { self.Worker.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.Worker.create({ name: 'worker' }).success(function(worker) { self.Worker.create({ name: 'worker' }).success(function(worker) {
self.Task.create({ title: 'homework' }).success(function(task) { self.Task.create({ title: 'homework' }).success(function(task) {
...@@ -1727,11 +1726,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1727,11 +1726,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('hasOne with alias', function() { describe('hasOne with alias', function() {
before(function(done) { before(function(done) {
var self = this var self = this
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING }) self.Task = self.sequelize.define('Task', { title: Sequelize.STRING })
this.Worker = this.sequelize.define('Worker', { name: Sequelize.STRING }) self.Worker = self.sequelize.define('Worker', { name: Sequelize.STRING })
this.Worker.hasOne(this.Task, { as: 'ToDo' }) self.Worker.hasOne(self.Task, { as: 'ToDo' })
this.Worker.sync({ force: true }).success(function() { self.Worker.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.Worker.create({ name: 'worker' }).success(function(worker) { self.Worker.create({ name: 'worker' }).success(function(worker) {
self.Task.create({ title: 'homework' }).success(function(task) { self.Task.create({ title: 'homework' }).success(function(task) {
...@@ -1788,11 +1787,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1788,11 +1787,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('hasMany', function() { describe('hasMany', function() {
before(function(done) { before(function(done) {
var self = this var self = this
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING }) self.Task = self.sequelize.define('Task', { title: Sequelize.STRING })
this.Worker = this.sequelize.define('Worker', { name: Sequelize.STRING }) self.Worker = self.sequelize.define('Worker', { name: Sequelize.STRING })
this.Worker.hasMany(this.Task) self.Worker.hasMany(self.Task)
this.Worker.sync({ force: true }).success(function() { self.Worker.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.Worker.create({ name: 'worker' }).success(function(worker) { self.Worker.create({ name: 'worker' }).success(function(worker) {
self.Task.create({ title: 'homework' }).success(function(task) { self.Task.create({ title: 'homework' }).success(function(task) {
...@@ -1831,11 +1830,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1831,11 +1830,11 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
describe('hasMany with alias', function() { describe('hasMany with alias', function() {
before(function(done) { before(function(done) {
var self = this var self = this
this.Task = this.sequelize.define('Task', { title: Sequelize.STRING }) self.Task = self.sequelize.define('Task', { title: Sequelize.STRING })
this.Worker = this.sequelize.define('Worker', { name: Sequelize.STRING }) self.Worker = self.sequelize.define('Worker', { name: Sequelize.STRING })
this.Worker.hasMany(this.Task, { as: 'ToDos' }) self.Worker.hasMany(self.Task, { as: 'ToDos' })
this.Worker.sync({ force: true }).success(function() { self.Worker.sync({ force: true }).success(function() {
self.Task.sync({ force: true }).success(function() { self.Task.sync({ force: true }).success(function() {
self.Worker.create({ name: 'worker' }).success(function(worker) { self.Worker.create({ name: 'worker' }).success(function(worker) {
self.Task.create({ title: 'homework' }).success(function(task) { self.Task.create({ title: 'homework' }).success(function(task) {
...@@ -1945,7 +1944,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -1945,7 +1944,7 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
it("finds all entries", function(done) { it("finds all entries", function(done) {
this.User.findAll().on('success', function(users) { this.User.all().on('success', function(users) {
expect(users.length).toEqual(2) expect(users.length).toEqual(2)
done() done()
}) })
...@@ -2367,11 +2366,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -2367,11 +2366,6 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
}) })
describe('references', function() { describe('references', function() {
before(function(done) {
this.sequelize = sequelize
done()
})
it('uses an existing dao factory and references the author table', function(done) { it('uses an existing dao factory and references the author table', function(done) {
var self = this var self = this
, Author = self.sequelize.define('author', { firstName: Sequelize.STRING }) , Author = self.sequelize.define('author', { firstName: Sequelize.STRING })
...@@ -2388,7 +2382,8 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() { ...@@ -2388,7 +2382,8 @@ describe(Helpers.getTestDialectTeaser("DAOFactory"), function() {
Post.belongsTo(Author) Post.belongsTo(Author)
Author.sync({ force: true }).success(function() { Author.sync({ force: true }).success(function() {
Post.sync({ force: true }).on('sql', function(sql) { Post.sync({ force: true })
.on('sql', function(sql) {
if (dialect === 'postgres') { if (dialect === 'postgres') {
expect(sql).toMatch(/"authorId" INTEGER REFERENCES "authors" \("id"\)/) expect(sql).toMatch(/"authorId" INTEGER REFERENCES "authors" \("id"\)/)
} else if (dialect === 'mysql') { } else if (dialect === 'mysql') {
......
...@@ -36,10 +36,9 @@ describe(Helpers.getTestDialectTeaser("DAO"), function() { ...@@ -36,10 +36,9 @@ describe(Helpers.getTestDialectTeaser("DAO"), function() {
before(function(done) { before(function(done) {
var self = this var self = this
self.sequelize = Object.create(sequelize)
self.sequelize = sequelize
self.User = User self.User = User
Helpers.clearDatabase(this.sequelize, function(){ Helpers.clearDatabase(self.sequelize, function(){
self.User.sync({ force: true }).success(done) self.User.sync({ force: true }).success(done)
}) })
}) })
...@@ -999,8 +998,8 @@ describe(Helpers.getTestDialectTeaser("DAO"), function() { ...@@ -999,8 +998,8 @@ describe(Helpers.getTestDialectTeaser("DAO"), function() {
identifier: 'identifier' identifier: 'identifier'
}).success(function(user) { }).success(function(user) {
var emitter = user.updateAttributes({name: 'foobar'}) var emitter = user.updateAttributes({name: 'foobar'})
emitter.success(function() { emitter.on('sql', function(sql) {
expect(emitter.query.sql).toMatch(/WHERE [`"]identifier[`"]..identifier./) expect(sql).toMatch(/WHERE [`"]identifier[`"]..identifier./)
done() done()
}) })
}) })
......
...@@ -7,16 +7,13 @@ buster.spec.expose() ...@@ -7,16 +7,13 @@ buster.spec.expose()
buster.testRunner.timeout = 1000 buster.testRunner.timeout = 1000
describe(Helpers.getTestDialectTeaser("DaoValidator"), function() { describe(Helpers.getTestDialectTeaser("DaoValidator"), function() {
var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
describe('validations', function() { describe('validations', function() {
beforeAll(function(done) { beforeAll(function(done) {
var self = this var self = this
Helpers.initTests({ self.sequelize = Object.create(sequelize)
dialect: dialect, Helpers.clearDatabase(self.sequelize, done)
onComplete: function(sequelize) {
self.sequelize = sequelize
done()
}
})
}) })
var checks = { var checks = {
......
...@@ -7,31 +7,30 @@ buster.spec.expose() ...@@ -7,31 +7,30 @@ buster.spec.expose()
buster.testRunner.timeout = 1000 buster.testRunner.timeout = 1000
describe(Helpers.getTestDialectTeaser("Language Util"), function() { describe(Helpers.getTestDialectTeaser("Language Util"), function() {
var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
describe("Plural", function(){ describe("Plural", function(){
beforeAll(function(done) { before(function(done) {
var self = this var self = this
Helpers.initTests({ self.sequelize = Object.create(sequelize)
dialect: dialect,
onComplete: function(sequelize) {
self.sequelize = sequelize
self.sequelize.options.language = 'es' self.sequelize.options.language = 'es'
done() Helpers.clearDatabase(self.sequelize, done)
}
})
}) })
it("should rename tables to their plural form...", function(done){ it("should rename tables to their plural form...", function(done){
var table = this.sequelize.define('arbol', {name: Sequelize.STRING}) var self = this
var table2 = this.sequelize.define('androide', {name: Sequelize.STRING}) , table = self.sequelize.define('arbol', {name: Sequelize.STRING})
, table2 = self.sequelize.define('androide', {name: Sequelize.STRING})
expect(table.tableName).toEqual('arboles') expect(table.tableName).toEqual('arboles')
expect(table2.tableName).toEqual('androides') expect(table2.tableName).toEqual('androides')
done() done()
}) })
it("should be able to pluralize/singularize associations...", function(done){ it("should be able to pluralize/singularize associations...", function(done){
var table = this.sequelize.define('arbol', {name: Sequelize.STRING}) var self = this
var table2 = this.sequelize.define('androide', {name: Sequelize.STRING}) , table = self.sequelize.define('arbol', {name: Sequelize.STRING})
var table3 = this.sequelize.define('hombre', {name: Sequelize.STRING}) , table2 = self.sequelize.define('androide', {name: Sequelize.STRING})
, table3 = self.sequelize.define('hombre', {name: Sequelize.STRING})
table.hasOne(table2) table.hasOne(table2)
table2.belongsTo(table) table2.belongsTo(table)
......
...@@ -34,9 +34,9 @@ describe(Helpers.getTestDialectTeaser("Promise"), function () { ...@@ -34,9 +34,9 @@ describe(Helpers.getTestDialectTeaser("Promise"), function () {
before(function(done) { before(function(done) {
var self = this var self = this
self.sequelize = sequelize self.sequelize = Object.create(sequelize)
self.User = User self.User = User
Helpers.clearDatabase(this.sequelize, function(){ Helpers.clearDatabase(self.sequelize, function(){
self.User.sync({ force: true }).then(function() {done()}, done) self.User.sync({ force: true }).then(function() {done()}, done)
}) })
}) })
......
...@@ -11,8 +11,9 @@ describe(Helpers.getTestDialectTeaser("QueryGenerators"), function() { ...@@ -11,8 +11,9 @@ describe(Helpers.getTestDialectTeaser("QueryGenerators"), function() {
var sequelize = Helpers.createSequelizeInstance({dialect: dialect}) var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
before(function(done) { before(function(done) {
this.sequelize = sequelize var self = this
this.interface = this.sequelize.getQueryInterface() self.sequelize = Object.create(sequelize)
self.interface = self.sequelize.getQueryInterface()
done() done()
}) })
......
...@@ -9,9 +9,10 @@ describe(Helpers.getTestDialectTeaser("QueryInterface"), function() { ...@@ -9,9 +9,10 @@ describe(Helpers.getTestDialectTeaser("QueryInterface"), function() {
var sequelize = Helpers.createSequelizeInstance({dialect: dialect}) var sequelize = Helpers.createSequelizeInstance({dialect: dialect})
before(function(done) { before(function(done) {
this.sequelize = sequelize var self = this
this.interface = this.sequelize.getQueryInterface() self.sequelize = Object.create(sequelize)
Helpers.clearDatabase(this.sequelize, done) self.interface = self.sequelize.getQueryInterface()
Helpers.clearDatabase(self.sequelize, done)
}) })
describe('dropAllTables', function() { describe('dropAllTables', function() {
......
...@@ -22,7 +22,7 @@ describe(Helpers.getTestDialectTeaser("Sequelize"), function() { ...@@ -22,7 +22,7 @@ describe(Helpers.getTestDialectTeaser("Sequelize"), function() {
before(function(done) { before(function(done) {
var self = this var self = this
self.sequelize = sequelize self.sequelize = Object.create(sequelize)
Helpers.clearDatabase(self.sequelize, done) Helpers.clearDatabase(self.sequelize, done)
}) })
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!