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

Commit b49a24d4 by Andy Edwards Committed by GitHub

fix(test/integration/hooks): asyncify (#12251)

1 parent 4dbfb5d1
...@@ -8,7 +8,7 @@ const chai = require('chai'), ...@@ -8,7 +8,7 @@ const chai = require('chai'),
dialect = Support.getTestDialect(); dialect = Support.getTestDialect();
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -30,14 +30,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -30,14 +30,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
paranoid: true paranoid: true
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('associations', () => { describe('associations', () => {
describe('1:1', () => { describe('1:1', () => {
describe('cascade onUpdate', () => { describe('cascade onUpdate', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -49,54 +49,49 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -49,54 +49,49 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.hasOne(this.Tasks, { onUpdate: 'cascade', hooks: true }); this.Projects.hasOne(this.Tasks, { onUpdate: 'cascade', hooks: true });
this.Tasks.belongsTo(this.Projects); this.Tasks.belongsTo(this.Projects);
return this.Projects.sync({ force: true }).then(() => { await this.Projects.sync({ force: true });
return this.Tasks.sync({ force: true });
}); await this.Tasks.sync({ force: true });
}); });
it('on success', function() { it('on success', async function() {
let beforeHook = false, let beforeHook = false,
afterHook = false; afterHook = false;
this.Tasks.beforeUpdate(() => { this.Tasks.beforeUpdate(async () => {
beforeHook = true; beforeHook = true;
return Promise.resolve();
}); });
this.Tasks.afterUpdate(() => { this.Tasks.afterUpdate(async () => {
afterHook = true; afterHook = true;
return Promise.resolve();
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.setTask(task).then(() => { await project.setTask(task);
return project.update({ id: 2 }).then(() => { await project.update({ id: 2 });
expect(beforeHook).to.be.true; expect(beforeHook).to.be.true;
expect(afterHook).to.be.true; expect(afterHook).to.be.true;
});
});
});
});
}); });
it('on error', function() { it('on error', async function() {
this.Tasks.afterUpdate(() => { this.Tasks.afterUpdate(async () => {
return Promise.reject(new Error('Whoops!')); throw new Error('Whoops!');
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.setTask(task).catch(err => {
expect(err).to.be.instanceOf(Error); try {
}); await project.setTask(task);
}); } catch (err) {
}); expect(err).to.be.instanceOf(Error);
}
}); });
}); });
describe('cascade onDelete', () => { describe('cascade onDelete', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -108,11 +103,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -108,11 +103,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.hasOne(this.Tasks, { onDelete: 'CASCADE', hooks: true }); this.Projects.hasOne(this.Tasks, { onDelete: 'CASCADE', hooks: true });
this.Tasks.belongsTo(this.Projects); this.Tasks.belongsTo(this.Projects);
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -123,65 +118,54 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -123,65 +118,54 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Tasks.beforeDestroy(beforeTask); this.Tasks.beforeDestroy(beforeTask);
this.Tasks.afterDestroy(afterTask); this.Tasks.afterDestroy(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.setTask(task).then(() => { await project.setTask(task);
return project.destroy().then(() => { await project.destroy();
expect(beforeProject).to.have.been.calledOnce; expect(beforeProject).to.have.been.calledOnce;
expect(afterProject).to.have.been.calledOnce; expect(afterProject).to.have.been.calledOnce;
expect(beforeTask).to.have.been.calledOnce; expect(beforeTask).to.have.been.calledOnce;
expect(afterTask).to.have.been.calledOnce; expect(afterTask).to.have.been.calledOnce;
});
});
});
});
}); });
it('with errors', function() { it('with errors', async function() {
const CustomErrorText = 'Whoops!'; const CustomErrorText = 'Whoops!';
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
afterTask = false; afterTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeDestroy(() => { this.Tasks.beforeDestroy(async () => {
beforeTask = true; beforeTask = true;
return Promise.reject(new Error(CustomErrorText)); throw new Error(CustomErrorText);
}); });
this.Tasks.afterDestroy(() => { this.Tasks.afterDestroy(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.setTask(task).then(() => { await project.setTask(task);
return expect(project.destroy()).to.eventually.be.rejectedWith(CustomErrorText).then(() => { await expect(project.destroy()).to.eventually.be.rejectedWith(CustomErrorText);
expect(beforeProject).to.be.true; expect(beforeProject).to.be.true;
expect(afterProject).to.be.true; expect(afterProject).to.be.true;
expect(beforeTask).to.be.true; expect(beforeTask).to.be.true;
expect(afterTask).to.be.false; expect(afterTask).to.be.false;
});
});
});
});
}); });
}); });
}); });
describe('no cascade update', () => { describe('no cascade update', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -193,45 +177,40 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -193,45 +177,40 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.hasOne(this.Tasks); this.Projects.hasOne(this.Tasks);
this.Tasks.belongsTo(this.Projects); this.Tasks.belongsTo(this.Projects);
return this.Projects.sync({ force: true }).then(() => { await this.Projects.sync({ force: true });
return this.Tasks.sync({ force: true });
}); await this.Tasks.sync({ force: true });
}); });
it('on success', function() { it('on success', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.Tasks.beforeUpdate(beforeHook); this.Tasks.beforeUpdate(beforeHook);
this.Tasks.afterUpdate(afterHook); this.Tasks.afterUpdate(afterHook);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.setTask(task).then(() => { await project.setTask(task);
return project.update({ id: 2 }).then(() => { await project.update({ id: 2 });
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
});
});
});
}); });
it('on error', function() { it('on error', async function() {
this.Tasks.afterUpdate(() => { this.Tasks.afterUpdate(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return expect(project.setTask(task)).to.be.rejected;
}); await expect(project.setTask(task)).to.be.rejected;
});
}); });
}); });
describe('no cascade delete', () => { describe('no cascade delete', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -243,13 +222,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -243,13 +222,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.hasMany(this.Tasks); this.Projects.hasMany(this.Tasks);
this.Tasks.belongsTo(this.Projects); this.Tasks.belongsTo(this.Projects);
return this.Projects.sync({ force: true }).then(() => { await this.Projects.sync({ force: true });
return this.Tasks.sync({ force: true });
}); await this.Tasks.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -260,21 +239,17 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -260,21 +239,17 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Tasks.beforeUpdate(beforeTask); this.Tasks.beforeUpdate(beforeTask);
this.Tasks.afterUpdate(afterTask); this.Tasks.afterUpdate(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.removeTask(task).then(() => { await project.removeTask(task);
expect(beforeProject).to.have.been.called; expect(beforeProject).to.have.been.called;
expect(afterProject).to.have.been.called; expect(afterProject).to.have.been.called;
expect(beforeTask).not.to.have.been.called; expect(beforeTask).not.to.have.been.called;
expect(afterTask).not.to.have.been.called; expect(afterTask).not.to.have.been.called;
});
});
});
});
}); });
it('with errors', function() { it('with errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -288,17 +263,18 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -288,17 +263,18 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
this.Tasks.afterUpdate(afterTask); this.Tasks.afterUpdate(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).catch(err => {
expect(err).to.be.instanceOf(Error); try {
expect(beforeProject).to.have.been.calledOnce; await project.addTask(task);
expect(afterProject).to.have.been.calledOnce; } catch (err) {
expect(beforeTask).to.have.been.calledOnce; expect(err).to.be.instanceOf(Error);
expect(afterTask).not.to.have.been.called; expect(beforeProject).to.have.been.calledOnce;
}); expect(afterProject).to.have.been.calledOnce;
}); expect(beforeTask).to.have.been.calledOnce;
}); expect(afterTask).not.to.have.been.called;
}
}); });
}); });
}); });
...@@ -306,7 +282,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -306,7 +282,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
describe('1:M', () => { describe('1:M', () => {
describe('cascade', () => { describe('cascade', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -318,13 +294,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -318,13 +294,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.hasMany(this.Tasks, { onDelete: 'cascade', hooks: true }); this.Projects.hasMany(this.Tasks, { onDelete: 'cascade', hooks: true });
this.Tasks.belongsTo(this.Projects, { hooks: true }); this.Tasks.belongsTo(this.Projects, { hooks: true });
return this.Projects.sync({ force: true }).then(() => { await this.Projects.sync({ force: true });
return this.Tasks.sync({ force: true });
}); await this.Tasks.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -335,65 +311,58 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -335,65 +311,58 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Tasks.beforeDestroy(beforeTask); this.Tasks.beforeDestroy(beforeTask);
this.Tasks.afterDestroy(afterTask); this.Tasks.afterDestroy(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.destroy().then(() => { await project.destroy();
expect(beforeProject).to.have.been.calledOnce; expect(beforeProject).to.have.been.calledOnce;
expect(afterProject).to.have.been.calledOnce; expect(afterProject).to.have.been.calledOnce;
expect(beforeTask).to.have.been.calledOnce; expect(beforeTask).to.have.been.calledOnce;
expect(afterTask).to.have.been.calledOnce; expect(afterTask).to.have.been.calledOnce;
});
});
});
});
}); });
it('with errors', function() { it('with errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
afterTask = false; afterTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeDestroy(() => { this.Tasks.beforeDestroy(async () => {
beforeTask = true; beforeTask = true;
return Promise.reject(new Error('Whoops!')); throw new Error('Whoops!');
}); });
this.Tasks.afterDestroy(() => { this.Tasks.afterDestroy(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.destroy().catch(err => {
expect(err).to.be.instanceOf(Error); try {
expect(beforeProject).to.be.true; await project.destroy();
expect(afterProject).to.be.true; } catch (err) {
expect(beforeTask).to.be.true; expect(err).to.be.instanceOf(Error);
expect(afterTask).to.be.false; expect(beforeProject).to.be.true;
}); expect(afterProject).to.be.true;
}); expect(beforeTask).to.be.true;
}); expect(afterTask).to.be.false;
}); }
}); });
}); });
}); });
describe('no cascade', () => { describe('no cascade', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -405,11 +374,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -405,11 +374,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.hasMany(this.Tasks); this.Projects.hasMany(this.Tasks);
this.Tasks.belongsTo(this.Projects); this.Tasks.belongsTo(this.Projects);
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -420,57 +389,51 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -420,57 +389,51 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Tasks.beforeUpdate(beforeTask); this.Tasks.beforeUpdate(beforeTask);
this.Tasks.afterUpdate(afterTask); this.Tasks.afterUpdate(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.removeTask(task).then(() => { await project.removeTask(task);
expect(beforeProject).to.have.been.called; expect(beforeProject).to.have.been.called;
expect(afterProject).to.have.been.called; expect(afterProject).to.have.been.called;
expect(beforeTask).not.to.have.been.called; expect(beforeTask).not.to.have.been.called;
expect(afterTask).not.to.have.been.called; expect(afterTask).not.to.have.been.called;
});
});
});
});
}); });
it('with errors', function() { it('with errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
afterTask = false; afterTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeUpdate(() => { this.Tasks.beforeUpdate(async () => {
beforeTask = true; beforeTask = true;
return Promise.reject(new Error('Whoops!')); throw new Error('Whoops!');
}); });
this.Tasks.afterUpdate(() => { this.Tasks.afterUpdate(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).catch(err => {
expect(err).to.be.instanceOf(Error); try {
expect(beforeProject).to.be.true; await project.addTask(task);
expect(afterProject).to.be.true; } catch (err) {
expect(beforeTask).to.be.true; expect(err).to.be.instanceOf(Error);
expect(afterTask).to.be.false; expect(beforeProject).to.be.true;
}); expect(afterProject).to.be.true;
}); expect(beforeTask).to.be.true;
}); expect(afterTask).to.be.false;
}
}); });
}); });
}); });
...@@ -478,7 +441,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -478,7 +441,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
describe('M:M', () => { describe('M:M', () => {
describe('cascade', () => { describe('cascade', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -490,11 +453,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -490,11 +453,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.belongsToMany(this.Tasks, { cascade: 'onDelete', through: 'projects_and_tasks', hooks: true }); this.Projects.belongsToMany(this.Tasks, { cascade: 'onDelete', through: 'projects_and_tasks', hooks: true });
this.Tasks.belongsToMany(this.Projects, { cascade: 'onDelete', through: 'projects_and_tasks', hooks: true }); this.Tasks.belongsToMany(this.Projects, { cascade: 'onDelete', through: 'projects_and_tasks', hooks: true });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -505,65 +468,54 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -505,65 +468,54 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Tasks.beforeDestroy(beforeTask); this.Tasks.beforeDestroy(beforeTask);
this.Tasks.afterDestroy(afterTask); this.Tasks.afterDestroy(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.destroy().then(() => { await project.destroy();
expect(beforeProject).to.have.been.calledOnce; expect(beforeProject).to.have.been.calledOnce;
expect(afterProject).to.have.been.calledOnce; expect(afterProject).to.have.been.calledOnce;
// Since Sequelize does not cascade M:M, these should be false // Since Sequelize does not cascade M:M, these should be false
expect(beforeTask).not.to.have.been.called; expect(beforeTask).not.to.have.been.called;
expect(afterTask).not.to.have.been.called; expect(afterTask).not.to.have.been.called;
});
});
});
});
}); });
it('with errors', function() { it('with errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
afterTask = false; afterTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeDestroy(() => { this.Tasks.beforeDestroy(async () => {
beforeTask = true; beforeTask = true;
return Promise.reject(new Error('Whoops!')); throw new Error('Whoops!');
}); });
this.Tasks.afterDestroy(() => { this.Tasks.afterDestroy(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.destroy().then(() => { await project.destroy();
expect(beforeProject).to.be.true; expect(beforeProject).to.be.true;
expect(afterProject).to.be.true; expect(afterProject).to.be.true;
expect(beforeTask).to.be.false; expect(beforeTask).to.be.false;
expect(afterTask).to.be.false; expect(afterTask).to.be.false;
});
});
});
});
}); });
}); });
}); });
describe('no cascade', () => { describe('no cascade', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -575,11 +527,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -575,11 +527,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Projects.belongsToMany(this.Tasks, { hooks: true, through: 'project_tasks' }); this.Projects.belongsToMany(this.Tasks, { hooks: true, through: 'project_tasks' });
this.Tasks.belongsToMany(this.Projects, { hooks: true, through: 'project_tasks' }); this.Tasks.belongsToMany(this.Projects, { hooks: true, through: 'project_tasks' });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
const beforeProject = sinon.spy(), const beforeProject = sinon.spy(),
afterProject = sinon.spy(), afterProject = sinon.spy(),
beforeTask = sinon.spy(), beforeTask = sinon.spy(),
...@@ -590,56 +542,46 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -590,56 +542,46 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.Tasks.beforeUpdate(beforeTask); this.Tasks.beforeUpdate(beforeTask);
this.Tasks.afterUpdate(afterTask); this.Tasks.afterUpdate(afterTask);
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
return project.removeTask(task).then(() => { await project.removeTask(task);
expect(beforeProject).to.have.been.calledOnce; expect(beforeProject).to.have.been.calledOnce;
expect(afterProject).to.have.been.calledOnce; expect(afterProject).to.have.been.calledOnce;
expect(beforeTask).not.to.have.been.called; expect(beforeTask).not.to.have.been.called;
expect(afterTask).not.to.have.been.called; expect(afterTask).not.to.have.been.called;
});
});
});
});
}); });
it('with errors', function() { it('with errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
afterTask = false; afterTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeUpdate(() => { this.Tasks.beforeUpdate(async () => {
beforeTask = true; beforeTask = true;
return Promise.reject(new Error('Whoops!')); throw new Error('Whoops!');
}); });
this.Tasks.afterUpdate(() => { this.Tasks.afterUpdate(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
return this.Projects.create({ title: 'New Project' }).then(project => { const project = await this.Projects.create({ title: 'New Project' });
return this.Tasks.create({ title: 'New Task' }).then(task => { const task = await this.Tasks.create({ title: 'New Task' });
return project.addTask(task).then(() => { await project.addTask(task);
expect(beforeProject).to.be.true; expect(beforeProject).to.be.true;
expect(afterProject).to.be.true; expect(afterProject).to.be.true;
expect(beforeTask).to.be.false; expect(beforeTask).to.be.false;
expect(afterTask).to.be.false; expect(afterTask).to.be.false;
});
});
});
}); });
}); });
}); });
...@@ -650,7 +592,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -650,7 +592,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
describe('multiple 1:M', () => { describe('multiple 1:M', () => {
describe('cascade', () => { describe('cascade', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -672,11 +614,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -672,11 +614,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.MiniTasks.belongsTo(this.Projects, { hooks: true }); this.MiniTasks.belongsTo(this.Projects, { hooks: true });
this.MiniTasks.belongsTo(this.Tasks, { hooks: true }); this.MiniTasks.belongsTo(this.Tasks, { hooks: true });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
...@@ -684,55 +626,46 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -684,55 +626,46 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeMiniTask = false, beforeMiniTask = false,
afterMiniTask = false; afterMiniTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeDestroy(() => { this.Tasks.beforeDestroy(async () => {
beforeTask = true; beforeTask = true;
return Promise.resolve();
}); });
this.Tasks.afterDestroy(() => { this.Tasks.afterDestroy(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
this.MiniTasks.beforeDestroy(() => { this.MiniTasks.beforeDestroy(async () => {
beforeMiniTask = true; beforeMiniTask = true;
return Promise.resolve();
}); });
this.MiniTasks.afterDestroy(() => { this.MiniTasks.afterDestroy(async () => {
afterMiniTask = true; afterMiniTask = true;
return Promise.resolve();
}); });
return Promise.all([ const [project0, minitask] = await Promise.all([
this.Projects.create({ title: 'New Project' }), this.Projects.create({ title: 'New Project' }),
this.MiniTasks.create({ mini_title: 'New MiniTask' }) this.MiniTasks.create({ mini_title: 'New MiniTask' })
]).then(([project, minitask]) => { ]);
return project.addMiniTask(minitask);
}).then(project => {
return project.destroy();
}).then(() => {
expect(beforeProject).to.be.true;
expect(afterProject).to.be.true;
expect(beforeTask).to.be.false;
expect(afterTask).to.be.false;
expect(beforeMiniTask).to.be.true;
expect(afterMiniTask).to.be.true;
});
const project = await project0.addMiniTask(minitask);
await project.destroy();
expect(beforeProject).to.be.true;
expect(afterProject).to.be.true;
expect(beforeTask).to.be.false;
expect(afterTask).to.be.false;
expect(beforeMiniTask).to.be.true;
expect(afterMiniTask).to.be.true;
}); });
it('with errors', function() { it('with errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
...@@ -740,51 +673,47 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -740,51 +673,47 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeMiniTask = false, beforeMiniTask = false,
afterMiniTask = false; afterMiniTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeDestroy(() => { this.Tasks.beforeDestroy(async () => {
beforeTask = true; beforeTask = true;
return Promise.resolve();
}); });
this.Tasks.afterDestroy(() => { this.Tasks.afterDestroy(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
this.MiniTasks.beforeDestroy(() => { this.MiniTasks.beforeDestroy(async () => {
beforeMiniTask = true; beforeMiniTask = true;
return Promise.reject(new Error('Whoops!')); throw new Error('Whoops!');
}); });
this.MiniTasks.afterDestroy(() => { this.MiniTasks.afterDestroy(async () => {
afterMiniTask = true; afterMiniTask = true;
return Promise.resolve();
}); });
return Promise.all([ try {
this.Projects.create({ title: 'New Project' }), const [project0, minitask] = await Promise.all([
this.MiniTasks.create({ mini_title: 'New MiniTask' }) this.Projects.create({ title: 'New Project' }),
]).then(([project, minitask]) => { this.MiniTasks.create({ mini_title: 'New MiniTask' })
return project.addMiniTask(minitask); ]);
}).then(project => {
return project.destroy(); const project = await project0.addMiniTask(minitask);
}).catch(() => { await project.destroy();
} catch (err) {
expect(beforeProject).to.be.true; expect(beforeProject).to.be.true;
expect(afterProject).to.be.true; expect(afterProject).to.be.true;
expect(beforeTask).to.be.false; expect(beforeTask).to.be.false;
expect(afterTask).to.be.false; expect(afterTask).to.be.false;
expect(beforeMiniTask).to.be.true; expect(beforeMiniTask).to.be.true;
expect(afterMiniTask).to.be.false; expect(afterMiniTask).to.be.false;
}); }
}); });
}); });
}); });
...@@ -792,7 +721,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -792,7 +721,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
describe('multiple 1:M sequential hooks', () => { describe('multiple 1:M sequential hooks', () => {
describe('cascade', () => { describe('cascade', () => {
beforeEach(function() { beforeEach(async function() {
this.Projects = this.sequelize.define('Project', { this.Projects = this.sequelize.define('Project', {
title: DataTypes.STRING title: DataTypes.STRING
}); });
...@@ -814,11 +743,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -814,11 +743,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.MiniTasks.belongsTo(this.Projects, { hooks: true }); this.MiniTasks.belongsTo(this.Projects, { hooks: true });
this.MiniTasks.belongsTo(this.Tasks, { hooks: true }); this.MiniTasks.belongsTo(this.Tasks, { hooks: true });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#remove', () => { describe('#remove', () => {
it('with no errors', function() { it('with no errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
...@@ -826,58 +755,52 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -826,58 +755,52 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeMiniTask = false, beforeMiniTask = false,
afterMiniTask = false; afterMiniTask = false;
this.Projects.beforeCreate(() => { this.Projects.beforeCreate(async () => {
beforeProject = true; beforeProject = true;
return Promise.resolve();
}); });
this.Projects.afterCreate(() => { this.Projects.afterCreate(async () => {
afterProject = true; afterProject = true;
return Promise.resolve();
}); });
this.Tasks.beforeDestroy(() => { this.Tasks.beforeDestroy(async () => {
beforeTask = true; beforeTask = true;
return Promise.resolve();
}); });
this.Tasks.afterDestroy(() => { this.Tasks.afterDestroy(async () => {
afterTask = true; afterTask = true;
return Promise.resolve();
}); });
this.MiniTasks.beforeDestroy(() => { this.MiniTasks.beforeDestroy(async () => {
beforeMiniTask = true; beforeMiniTask = true;
return Promise.resolve();
}); });
this.MiniTasks.afterDestroy(() => { this.MiniTasks.afterDestroy(async () => {
afterMiniTask = true; afterMiniTask = true;
return Promise.resolve();
}); });
return Promise.all([ const [project0, task, minitask] = await Promise.all([
this.Projects.create({ title: 'New Project' }), this.Projects.create({ title: 'New Project' }),
this.Tasks.create({ title: 'New Task' }), this.Tasks.create({ title: 'New Task' }),
this.MiniTasks.create({ mini_title: 'New MiniTask' }) this.MiniTasks.create({ mini_title: 'New MiniTask' })
]).then(([project, task, minitask]) => { ]);
return Promise.all([
task.addMiniTask(minitask), await Promise.all([
project.addTask(task) task.addMiniTask(minitask),
]).then(() => project); project0.addTask(task)
}).then(project => { ]);
return project.destroy();
}).then(() => { const project = project0;
expect(beforeProject).to.be.true; await project.destroy();
expect(afterProject).to.be.true; expect(beforeProject).to.be.true;
expect(beforeTask).to.be.true; expect(afterProject).to.be.true;
expect(afterTask).to.be.true; expect(beforeTask).to.be.true;
expect(beforeMiniTask).to.be.true; expect(afterTask).to.be.true;
expect(afterMiniTask).to.be.true; expect(beforeMiniTask).to.be.true;
}); expect(afterMiniTask).to.be.true;
}); });
it('with errors', function() { it('with errors', async function() {
let beforeProject = false, let beforeProject = false,
afterProject = false, afterProject = false,
beforeTask = false, beforeTask = false,
...@@ -911,25 +834,25 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -911,25 +834,25 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
afterMiniTask = true; afterMiniTask = true;
}); });
return Promise.all([ const [project0, task, minitask] = await Promise.all([
this.Projects.create({ title: 'New Project' }), this.Projects.create({ title: 'New Project' }),
this.Tasks.create({ title: 'New Task' }), this.Tasks.create({ title: 'New Task' }),
this.MiniTasks.create({ mini_title: 'New MiniTask' }) this.MiniTasks.create({ mini_title: 'New MiniTask' })
]).then(([project, task, minitask]) => { ]);
return Promise.all([
task.addMiniTask(minitask), await Promise.all([
project.addTask(task) task.addMiniTask(minitask),
]).then(() => project); project0.addTask(task)
}).then(project => { ]);
return expect(project.destroy()).to.eventually.be.rejectedWith(CustomErrorText).then(() => {
expect(beforeProject).to.be.true; const project = project0;
expect(afterProject).to.be.true; await expect(project.destroy()).to.eventually.be.rejectedWith(CustomErrorText);
expect(beforeTask).to.be.true; expect(beforeProject).to.be.true;
expect(afterTask).to.be.false; expect(afterProject).to.be.true;
expect(beforeMiniTask).to.be.false; expect(beforeTask).to.be.true;
expect(afterMiniTask).to.be.false; expect(afterTask).to.be.false;
}); expect(beforeMiniTask).to.be.false;
}); expect(afterMiniTask).to.be.false;
}); });
}); });
}); });
......
...@@ -7,7 +7,7 @@ const chai = require('chai'), ...@@ -7,7 +7,7 @@ const chai = require('chai'),
sinon = require('sinon'); sinon = require('sinon');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -29,12 +29,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -29,12 +29,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
paranoid: true paranoid: true
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#bulkCreate', () => { describe('#bulkCreate', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(); afterBulk = sinon.spy();
...@@ -42,34 +42,34 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -42,34 +42,34 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.afterBulkCreate(afterBulk); this.User.afterBulkCreate(afterBulk);
return this.User.bulkCreate([ await this.User.bulkCreate([
{ username: 'Cheech', mood: 'sad' }, { username: 'Cheech', mood: 'sad' },
{ username: 'Chong', mood: 'sad' } { username: 'Chong', mood: 'sad' }
]).then(() => { ]);
expect(beforeBulk).to.have.been.calledOnce;
expect(afterBulk).to.have.been.calledOnce; expect(beforeBulk).to.have.been.calledOnce;
}); expect(afterBulk).to.have.been.calledOnce;
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
this.User.beforeBulkCreate(() => { this.User.beforeBulkCreate(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.User.bulkCreate([ await expect(this.User.bulkCreate([
{ username: 'Cheech', mood: 'sad' }, { username: 'Cheech', mood: 'sad' },
{ username: 'Chong', mood: 'sad' } { username: 'Chong', mood: 'sad' }
])).to.be.rejected; ])).to.be.rejected;
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
this.User.afterBulkCreate(() => { this.User.afterBulkCreate(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.User.bulkCreate([ await expect(this.User.bulkCreate([
{ username: 'Cheech', mood: 'sad' }, { username: 'Cheech', mood: 'sad' },
{ username: 'Chong', mood: 'sad' } { username: 'Chong', mood: 'sad' }
])).to.be.rejected; ])).to.be.rejected;
...@@ -77,7 +77,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -77,7 +77,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
describe('with the {individualHooks: true} option', () => { describe('with the {individualHooks: true} option', () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -93,126 +93,119 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -93,126 +93,119 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
} }
}); });
return this.User.sync({ force: true }); await this.User.sync({ force: true });
}); });
it('should run the afterCreate/beforeCreate functions for each item created successfully', function() { it('should run the afterCreate/beforeCreate functions for each item created successfully', async function() {
let beforeBulkCreate = false, let beforeBulkCreate = false,
afterBulkCreate = false; afterBulkCreate = false;
this.User.beforeBulkCreate(() => { this.User.beforeBulkCreate(async () => {
beforeBulkCreate = true; beforeBulkCreate = true;
return Promise.resolve();
}); });
this.User.afterBulkCreate(() => { this.User.afterBulkCreate(async () => {
afterBulkCreate = true; afterBulkCreate = true;
return Promise.resolve();
}); });
this.User.beforeCreate(user => { this.User.beforeCreate(async user => {
user.beforeHookTest = true; user.beforeHookTest = true;
return Promise.resolve();
}); });
this.User.afterCreate(user => { this.User.afterCreate(async user => {
user.username = `User${user.id}`; user.username = `User${user.id}`;
return Promise.resolve();
}); });
return this.User.bulkCreate([{ aNumber: 5 }, { aNumber: 7 }, { aNumber: 3 }], { fields: ['aNumber'], individualHooks: true }).then(records => { const records = await this.User.bulkCreate([{ aNumber: 5 }, { aNumber: 7 }, { aNumber: 3 }], { fields: ['aNumber'], individualHooks: true });
records.forEach(record => { records.forEach(record => {
expect(record.username).to.equal(`User${record.id}`); expect(record.username).to.equal(`User${record.id}`);
expect(record.beforeHookTest).to.be.true; expect(record.beforeHookTest).to.be.true;
});
expect(beforeBulkCreate).to.be.true;
expect(afterBulkCreate).to.be.true;
}); });
expect(beforeBulkCreate).to.be.true;
expect(afterBulkCreate).to.be.true;
}); });
it('should run the afterCreate/beforeCreate functions for each item created with an error', function() { it('should run the afterCreate/beforeCreate functions for each item created with an error', async function() {
let beforeBulkCreate = false, let beforeBulkCreate = false,
afterBulkCreate = false; afterBulkCreate = false;
this.User.beforeBulkCreate(() => { this.User.beforeBulkCreate(async () => {
beforeBulkCreate = true; beforeBulkCreate = true;
return Promise.resolve();
}); });
this.User.afterBulkCreate(() => { this.User.afterBulkCreate(async () => {
afterBulkCreate = true; afterBulkCreate = true;
return Promise.resolve();
}); });
this.User.beforeCreate(() => { this.User.beforeCreate(async () => {
return Promise.reject(new Error('You shall not pass!')); throw new Error('You shall not pass!');
}); });
this.User.afterCreate(user => { this.User.afterCreate(async user => {
user.username = `User${user.id}`; user.username = `User${user.id}`;
return Promise.resolve();
}); });
return this.User.bulkCreate([{ aNumber: 5 }, { aNumber: 7 }, { aNumber: 3 }], { fields: ['aNumber'], individualHooks: true }).catch(err => { try {
await this.User.bulkCreate([{ aNumber: 5 }, { aNumber: 7 }, { aNumber: 3 }], { fields: ['aNumber'], individualHooks: true });
} catch (err) {
expect(err).to.be.instanceOf(Error); expect(err).to.be.instanceOf(Error);
expect(beforeBulkCreate).to.be.true; expect(beforeBulkCreate).to.be.true;
expect(afterBulkCreate).to.be.false; expect(afterBulkCreate).to.be.false;
}); }
}); });
}); });
}); });
describe('#bulkUpdate', () => { describe('#bulkUpdate', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(); afterBulk = sinon.spy();
this.User.beforeBulkUpdate(beforeBulk); this.User.beforeBulkUpdate(beforeBulk);
this.User.afterBulkUpdate(afterBulk); this.User.afterBulkUpdate(afterBulk);
return this.User.bulkCreate([ await this.User.bulkCreate([
{ username: 'Cheech', mood: 'sad' }, { username: 'Cheech', mood: 'sad' },
{ username: 'Chong', mood: 'sad' } { username: 'Chong', mood: 'sad' }
]).then(() => { ]);
return this.User.update({ mood: 'happy' }, { where: { mood: 'sad' } }).then(() => {
expect(beforeBulk).to.have.been.calledOnce; await this.User.update({ mood: 'happy' }, { where: { mood: 'sad' } });
expect(afterBulk).to.have.been.calledOnce; expect(beforeBulk).to.have.been.calledOnce;
}); expect(afterBulk).to.have.been.calledOnce;
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
this.User.beforeBulkUpdate(() => { this.User.beforeBulkUpdate(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return this.User.bulkCreate([ await this.User.bulkCreate([
{ username: 'Cheech', mood: 'sad' }, { username: 'Cheech', mood: 'sad' },
{ username: 'Chong', mood: 'sad' } { username: 'Chong', mood: 'sad' }
]).then(() => { ]);
return expect(this.User.update({ mood: 'happy' }, { where: { mood: 'sad' } })).to.be.rejected;
}); await expect(this.User.update({ mood: 'happy' }, { where: { mood: 'sad' } })).to.be.rejected;
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
this.User.afterBulkUpdate(() => { this.User.afterBulkUpdate(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return this.User.bulkCreate([ await this.User.bulkCreate([
{ username: 'Cheech', mood: 'sad' }, { username: 'Cheech', mood: 'sad' },
{ username: 'Chong', mood: 'sad' } { username: 'Chong', mood: 'sad' }
]).then(() => { ]);
return expect(this.User.update({ mood: 'happy' }, { where: { mood: 'sad' } })).to.be.rejected;
}); await expect(this.User.update({ mood: 'happy' }, { where: { mood: 'sad' } })).to.be.rejected;
}); });
}); });
describe('with the {individualHooks: true} option', () => { describe('with the {individualHooks: true} option', () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -228,10 +221,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -228,10 +221,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
} }
}); });
return this.User.sync({ force: true }); await this.User.sync({ force: true });
}); });
it('should run the after/before functions for each item created successfully', function() { it('should run the after/before functions for each item created successfully', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(); afterBulk = sinon.spy();
...@@ -248,21 +241,20 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -248,21 +241,20 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
user.username = `User${user.id}`; user.username = `User${user.id}`;
}); });
return this.User.bulkCreate([ await this.User.bulkCreate([
{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 } { aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }
]).then(() => { ]);
return this.User.update({ aNumber: 10 }, { where: { aNumber: 1 }, individualHooks: true }).then(([, records]) => {
records.forEach(record => { const [, records] = await this.User.update({ aNumber: 10 }, { where: { aNumber: 1 }, individualHooks: true });
expect(record.username).to.equal(`User${record.id}`); records.forEach(record => {
expect(record.beforeHookTest).to.be.true; expect(record.username).to.equal(`User${record.id}`);
}); expect(record.beforeHookTest).to.be.true;
expect(beforeBulk).to.have.been.calledOnce;
expect(afterBulk).to.have.been.calledOnce;
});
}); });
expect(beforeBulk).to.have.been.calledOnce;
expect(afterBulk).to.have.been.calledOnce;
}); });
it('should run the after/before functions for each item created successfully changing some data before updating', function() { it('should run the after/before functions for each item created successfully changing some data before updating', async function() {
this.User.beforeUpdate(user => { this.User.beforeUpdate(user => {
expect(user.changed()).to.not.be.empty; expect(user.changed()).to.not.be.empty;
if (user.get('id') === 1) { if (user.get('id') === 1) {
...@@ -270,18 +262,17 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -270,18 +262,17 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
} }
}); });
return this.User.bulkCreate([ await this.User.bulkCreate([
{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 } { aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }
]).then(() => { ]);
return this.User.update({ aNumber: 10 }, { where: { aNumber: 1 }, individualHooks: true }).then(([, records]) => {
records.forEach(record => { const [, records] = await this.User.update({ aNumber: 10 }, { where: { aNumber: 1 }, individualHooks: true });
expect(record.aNumber).to.equal(10 + (record.id === 1 ? 3 : 0)); records.forEach(record => {
}); expect(record.aNumber).to.equal(10 + (record.id === 1 ? 3 : 0));
});
}); });
}); });
it('should run the after/before functions for each item created with an error', function() { it('should run the after/before functions for each item created with an error', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(); afterBulk = sinon.spy();
...@@ -297,54 +288,55 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -297,54 +288,55 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
user.username = `User${user.id}`; user.username = `User${user.id}`;
}); });
return this.User.bulkCreate([{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }], { fields: ['aNumber'] }).then(() => { await this.User.bulkCreate([{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }], { fields: ['aNumber'] });
return this.User.update({ aNumber: 10 }, { where: { aNumber: 1 }, individualHooks: true }).catch(err => {
expect(err).to.be.instanceOf(Error); try {
expect(err.message).to.be.equal('You shall not pass!'); await this.User.update({ aNumber: 10 }, { where: { aNumber: 1 }, individualHooks: true });
expect(beforeBulk).to.have.been.calledOnce; } catch (err) {
expect(afterBulk).not.to.have.been.called; expect(err).to.be.instanceOf(Error);
}); expect(err.message).to.be.equal('You shall not pass!');
}); expect(beforeBulk).to.have.been.calledOnce;
expect(afterBulk).not.to.have.been.called;
}
}); });
}); });
}); });
describe('#bulkDestroy', () => { describe('#bulkDestroy', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(); afterBulk = sinon.spy();
this.User.beforeBulkDestroy(beforeBulk); this.User.beforeBulkDestroy(beforeBulk);
this.User.afterBulkDestroy(afterBulk); this.User.afterBulkDestroy(afterBulk);
return this.User.destroy({ where: { username: 'Cheech', mood: 'sad' } }).then(() => { await this.User.destroy({ where: { username: 'Cheech', mood: 'sad' } });
expect(beforeBulk).to.have.been.calledOnce; expect(beforeBulk).to.have.been.calledOnce;
expect(afterBulk).to.have.been.calledOnce; expect(afterBulk).to.have.been.calledOnce;
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
this.User.beforeBulkDestroy(() => { this.User.beforeBulkDestroy(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.User.destroy({ where: { username: 'Cheech', mood: 'sad' } })).to.be.rejected; await expect(this.User.destroy({ where: { username: 'Cheech', mood: 'sad' } })).to.be.rejected;
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
this.User.afterBulkDestroy(() => { this.User.afterBulkDestroy(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.User.destroy({ where: { username: 'Cheech', mood: 'sad' } })).to.be.rejected; await expect(this.User.destroy({ where: { username: 'Cheech', mood: 'sad' } })).to.be.rejected;
}); });
}); });
describe('with the {individualHooks: true} option', () => { describe('with the {individualHooks: true} option', () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -360,131 +352,124 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -360,131 +352,124 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
} }
}); });
return this.User.sync({ force: true }); await this.User.sync({ force: true });
}); });
it('should run the after/before functions for each item created successfully', function() { it('should run the after/before functions for each item created successfully', async function() {
let beforeBulk = false, let beforeBulk = false,
afterBulk = false, afterBulk = false,
beforeHook = false, beforeHook = false,
afterHook = false; afterHook = false;
this.User.beforeBulkDestroy(() => { this.User.beforeBulkDestroy(async () => {
beforeBulk = true; beforeBulk = true;
return Promise.resolve();
}); });
this.User.afterBulkDestroy(() => { this.User.afterBulkDestroy(async () => {
afterBulk = true; afterBulk = true;
return Promise.resolve();
}); });
this.User.beforeDestroy(() => { this.User.beforeDestroy(async () => {
beforeHook = true; beforeHook = true;
return Promise.resolve();
}); });
this.User.afterDestroy(() => { this.User.afterDestroy(async () => {
afterHook = true; afterHook = true;
return Promise.resolve();
}); });
return this.User.bulkCreate([ await this.User.bulkCreate([
{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 } { aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }
]).then(() => { ]);
return this.User.destroy({ where: { aNumber: 1 }, individualHooks: true }).then(() => {
expect(beforeBulk).to.be.true; await this.User.destroy({ where: { aNumber: 1 }, individualHooks: true });
expect(afterBulk).to.be.true; expect(beforeBulk).to.be.true;
expect(beforeHook).to.be.true; expect(afterBulk).to.be.true;
expect(afterHook).to.be.true; expect(beforeHook).to.be.true;
}); expect(afterHook).to.be.true;
});
}); });
it('should run the after/before functions for each item created with an error', function() { it('should run the after/before functions for each item created with an error', async function() {
let beforeBulk = false, let beforeBulk = false,
afterBulk = false, afterBulk = false,
beforeHook = false, beforeHook = false,
afterHook = false; afterHook = false;
this.User.beforeBulkDestroy(() => { this.User.beforeBulkDestroy(async () => {
beforeBulk = true; beforeBulk = true;
return Promise.resolve();
}); });
this.User.afterBulkDestroy(() => { this.User.afterBulkDestroy(async () => {
afterBulk = true; afterBulk = true;
return Promise.resolve();
}); });
this.User.beforeDestroy(() => { this.User.beforeDestroy(async () => {
beforeHook = true; beforeHook = true;
return Promise.reject(new Error('You shall not pass!')); throw new Error('You shall not pass!');
}); });
this.User.afterDestroy(() => { this.User.afterDestroy(async () => {
afterHook = true; afterHook = true;
return Promise.resolve();
}); });
return this.User.bulkCreate([{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }], { fields: ['aNumber'] }).then(() => { await this.User.bulkCreate([{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }], { fields: ['aNumber'] });
return this.User.destroy({ where: { aNumber: 1 }, individualHooks: true }).catch(err => {
expect(err).to.be.instanceOf(Error); try {
expect(beforeBulk).to.be.true; await this.User.destroy({ where: { aNumber: 1 }, individualHooks: true });
expect(beforeHook).to.be.true; } catch (err) {
expect(afterBulk).to.be.false; expect(err).to.be.instanceOf(Error);
expect(afterHook).to.be.false; expect(beforeBulk).to.be.true;
}); expect(beforeHook).to.be.true;
}); expect(afterBulk).to.be.false;
expect(afterHook).to.be.false;
}
}); });
}); });
}); });
describe('#bulkRestore', () => { describe('#bulkRestore', () => {
beforeEach(function() { beforeEach(async function() {
return this.ParanoidUser.bulkCreate([ await this.ParanoidUser.bulkCreate([
{ username: 'adam', mood: 'happy' }, { username: 'adam', mood: 'happy' },
{ username: 'joe', mood: 'sad' } { username: 'joe', mood: 'sad' }
]).then(() => { ]);
return this.ParanoidUser.destroy({ truncate: true });
}); await this.ParanoidUser.destroy({ truncate: true });
}); });
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(); afterBulk = sinon.spy();
this.ParanoidUser.beforeBulkRestore(beforeBulk); this.ParanoidUser.beforeBulkRestore(beforeBulk);
this.ParanoidUser.afterBulkRestore(afterBulk); this.ParanoidUser.afterBulkRestore(afterBulk);
return this.ParanoidUser.restore({ where: { username: 'adam', mood: 'happy' } }).then(() => { await this.ParanoidUser.restore({ where: { username: 'adam', mood: 'happy' } });
expect(beforeBulk).to.have.been.calledOnce; expect(beforeBulk).to.have.been.calledOnce;
expect(afterBulk).to.have.been.calledOnce; expect(afterBulk).to.have.been.calledOnce;
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
this.ParanoidUser.beforeBulkRestore(() => { this.ParanoidUser.beforeBulkRestore(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.ParanoidUser.restore({ where: { username: 'adam', mood: 'happy' } })).to.be.rejected; await expect(this.ParanoidUser.restore({ where: { username: 'adam', mood: 'happy' } })).to.be.rejected;
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
this.ParanoidUser.afterBulkRestore(() => { this.ParanoidUser.afterBulkRestore(() => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.ParanoidUser.restore({ where: { username: 'adam', mood: 'happy' } })).to.be.rejected; await expect(this.ParanoidUser.restore({ where: { username: 'adam', mood: 'happy' } })).to.be.rejected;
}); });
}); });
describe('with the {individualHooks: true} option', () => { describe('with the {individualHooks: true} option', () => {
beforeEach(function() { beforeEach(async function() {
this.ParanoidUser = this.sequelize.define('ParanoidUser', { this.ParanoidUser = this.sequelize.define('ParanoidUser', {
aNumber: { aNumber: {
type: DataTypes.INTEGER, type: DataTypes.INTEGER,
...@@ -494,10 +479,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -494,10 +479,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
paranoid: true paranoid: true
}); });
return this.ParanoidUser.sync({ force: true }); await this.ParanoidUser.sync({ force: true });
}); });
it('should run the after/before functions for each item restored successfully', function() { it('should run the after/before functions for each item restored successfully', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(), afterBulk = sinon.spy(),
beforeHook = sinon.spy(), beforeHook = sinon.spy(),
...@@ -508,21 +493,19 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -508,21 +493,19 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.ParanoidUser.beforeRestore(beforeHook); this.ParanoidUser.beforeRestore(beforeHook);
this.ParanoidUser.afterRestore(afterHook); this.ParanoidUser.afterRestore(afterHook);
return this.ParanoidUser.bulkCreate([ await this.ParanoidUser.bulkCreate([
{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 } { aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }
]).then(() => { ]);
return this.ParanoidUser.destroy({ where: { aNumber: 1 } });
}).then(() => { await this.ParanoidUser.destroy({ where: { aNumber: 1 } });
return this.ParanoidUser.restore({ where: { aNumber: 1 }, individualHooks: true }); await this.ParanoidUser.restore({ where: { aNumber: 1 }, individualHooks: true });
}).then(() => { expect(beforeBulk).to.have.been.calledOnce;
expect(beforeBulk).to.have.been.calledOnce; expect(afterBulk).to.have.been.calledOnce;
expect(afterBulk).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledThrice;
expect(beforeHook).to.have.been.calledThrice; expect(afterHook).to.have.been.calledThrice;
expect(afterHook).to.have.been.calledThrice;
});
}); });
it('should run the after/before functions for each item restored with an error', function() { it('should run the after/before functions for each item restored with an error', async function() {
const beforeBulk = sinon.spy(), const beforeBulk = sinon.spy(),
afterBulk = sinon.spy(), afterBulk = sinon.spy(),
beforeHook = sinon.spy(), beforeHook = sinon.spy(),
...@@ -530,24 +513,24 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -530,24 +513,24 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.ParanoidUser.beforeBulkRestore(beforeBulk); this.ParanoidUser.beforeBulkRestore(beforeBulk);
this.ParanoidUser.afterBulkRestore(afterBulk); this.ParanoidUser.afterBulkRestore(afterBulk);
this.ParanoidUser.beforeRestore(() => { this.ParanoidUser.beforeRestore(async () => {
beforeHook(); beforeHook();
return Promise.reject(new Error('You shall not pass!')); throw new Error('You shall not pass!');
}); });
this.ParanoidUser.afterRestore(afterHook); this.ParanoidUser.afterRestore(afterHook);
return this.ParanoidUser.bulkCreate([{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }], { fields: ['aNumber'] }).then(() => { try {
return this.ParanoidUser.destroy({ where: { aNumber: 1 } }); await this.ParanoidUser.bulkCreate([{ aNumber: 1 }, { aNumber: 1 }, { aNumber: 1 }], { fields: ['aNumber'] });
}).then(() => { await this.ParanoidUser.destroy({ where: { aNumber: 1 } });
return this.ParanoidUser.restore({ where: { aNumber: 1 }, individualHooks: true }); await this.ParanoidUser.restore({ where: { aNumber: 1 }, individualHooks: true });
}).catch(err => { } catch (err) {
expect(err).to.be.instanceOf(Error); expect(err).to.be.instanceOf(Error);
expect(beforeBulk).to.have.been.calledOnce; expect(beforeBulk).to.have.been.calledOnce;
expect(beforeHook).to.have.been.calledThrice; expect(beforeHook).to.have.been.calledThrice;
expect(afterBulk).not.to.have.been.called; expect(afterBulk).not.to.have.been.called;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
}); }
}); });
}); });
}); });
......
...@@ -6,7 +6,7 @@ const chai = require('chai'), ...@@ -6,7 +6,7 @@ const chai = require('chai'),
DataTypes = require('../../../lib/data-types'); DataTypes = require('../../../lib/data-types');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -17,12 +17,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -17,12 +17,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
values: ['happy', 'sad', 'neutral'] values: ['happy', 'sad', 'neutral']
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#count', () => { describe('#count', () => {
beforeEach(function() { beforeEach(async function() {
return this.User.bulkCreate([ await this.User.bulkCreate([
{ username: 'adam', mood: 'happy' }, { username: 'adam', mood: 'happy' },
{ username: 'joe', mood: 'sad' }, { username: 'joe', mood: 'sad' },
{ username: 'joe', mood: 'happy' } { username: 'joe', mood: 'happy' }
...@@ -30,35 +30,34 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -30,35 +30,34 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
describe('on success', () => { describe('on success', () => {
it('hook runs', function() { it('hook runs', async function() {
let beforeHook = false; let beforeHook = false;
this.User.beforeCount(() => { this.User.beforeCount(() => {
beforeHook = true; beforeHook = true;
}); });
return this.User.count().then(count => { const count = await this.User.count();
expect(count).to.equal(3); expect(count).to.equal(3);
expect(beforeHook).to.be.true; expect(beforeHook).to.be.true;
});
}); });
it('beforeCount hook can change options', function() { it('beforeCount hook can change options', async function() {
this.User.beforeCount(options => { this.User.beforeCount(options => {
options.where.username = 'adam'; options.where.username = 'adam';
}); });
return expect(this.User.count({ where: { username: 'joe' } })).to.eventually.equal(1); await expect(this.User.count({ where: { username: 'joe' } })).to.eventually.equal(1);
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('in beforeCount hook returns error', function() { it('in beforeCount hook returns error', async function() {
this.User.beforeCount(() => { this.User.beforeCount(() => {
throw new Error('Oops!'); throw new Error('Oops!');
}); });
return expect(this.User.count({ where: { username: 'adam' } })).to.be.rejectedWith('Oops!'); await expect(this.User.count({ where: { username: 'adam' } })).to.be.rejectedWith('Oops!');
}); });
}); });
}); });
......
...@@ -8,7 +8,7 @@ const chai = require('chai'), ...@@ -8,7 +8,7 @@ const chai = require('chai'),
sinon = require('sinon'); sinon = require('sinon');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -19,12 +19,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -19,12 +19,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
values: ['happy', 'sad', 'neutral'] values: ['happy', 'sad', 'neutral']
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#create', () => { describe('#create', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
beforeSave = sinon.spy(), beforeSave = sinon.spy(),
...@@ -35,17 +35,16 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -35,17 +35,16 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.beforeSave(beforeSave); this.User.beforeSave(beforeSave);
this.User.afterSave(afterSave); this.User.afterSave(afterSave);
return this.User.create({ username: 'Toni', mood: 'happy' }).then(() => { await this.User.create({ username: 'Toni', mood: 'happy' });
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
expect(beforeSave).to.have.been.calledOnce; expect(beforeSave).to.have.been.calledOnce;
expect(afterSave).to.have.been.calledOnce; expect(afterSave).to.have.been.calledOnce;
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
beforeSave = sinon.spy(), beforeSave = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
...@@ -59,15 +58,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -59,15 +58,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.beforeSave(beforeSave); this.User.beforeSave(beforeSave);
this.User.afterSave(afterSave); this.User.afterSave(afterSave);
return expect(this.User.create({ username: 'Toni', mood: 'happy' })).to.be.rejected.then(() => { await expect(this.User.create({ username: 'Toni', mood: 'happy' })).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
expect(beforeSave).not.to.have.been.called; expect(beforeSave).not.to.have.been.called;
expect(afterSave).not.to.have.been.called; expect(afterSave).not.to.have.been.called;
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
beforeSave = sinon.spy(), beforeSave = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
...@@ -82,16 +80,15 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -82,16 +80,15 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.beforeSave(beforeSave); this.User.beforeSave(beforeSave);
this.User.afterSave(afterSave); this.User.afterSave(afterSave);
return expect(this.User.create({ username: 'Toni', mood: 'happy' })).to.be.rejected.then(() => { await expect(this.User.create({ username: 'Toni', mood: 'happy' })).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
expect(beforeSave).to.have.been.calledOnce; expect(beforeSave).to.have.been.calledOnce;
expect(afterSave).not.to.have.been.called; expect(afterSave).not.to.have.been.called;
});
}); });
}); });
it('should not trigger hooks on parent when using N:M association setters', function() { it('should not trigger hooks on parent when using N:M association setters', async function() {
const A = this.sequelize.define('A', { const A = this.sequelize.define('A', {
name: Sequelize.STRING name: Sequelize.STRING
}); });
...@@ -101,28 +98,26 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -101,28 +98,26 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
let hookCalled = 0; let hookCalled = 0;
A.addHook('afterCreate', () => { A.addHook('afterCreate', async () => {
hookCalled++; hookCalled++;
return Promise.resolve();
}); });
B.belongsToMany(A, { through: 'a_b' }); B.belongsToMany(A, { through: 'a_b' });
A.belongsToMany(B, { through: 'a_b' }); A.belongsToMany(B, { through: 'a_b' });
return this.sequelize.sync({ force: true }).then(() => { await this.sequelize.sync({ force: true });
return Promise.all([
A.create({ name: 'a' }), const [a, b] = await Promise.all([
B.create({ name: 'b' }) A.create({ name: 'a' }),
]).then(([a, b]) => { B.create({ name: 'b' })
return a.addB(b).then(() => { ]);
expect(hookCalled).to.equal(1);
}); await a.addB(b);
}); expect(hookCalled).to.equal(1);
});
}); });
describe('preserves changes to instance', () => { describe('preserves changes to instance', () => {
it('beforeValidate', function() { it('beforeValidate', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.beforeValidate(user => { this.User.beforeValidate(user => {
...@@ -130,14 +125,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -130,14 +125,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ mood: 'sad', username: 'leafninja' }).then(user => { const user = await this.User.create({ mood: 'sad', username: 'leafninja' });
expect(user.mood).to.equal('happy'); expect(user.mood).to.equal('happy');
expect(user.username).to.equal('leafninja'); expect(user.username).to.equal('leafninja');
expect(hookCalled).to.equal(1); expect(hookCalled).to.equal(1);
});
}); });
it('afterValidate', function() { it('afterValidate', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.afterValidate(user => { this.User.afterValidate(user => {
...@@ -145,14 +139,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -145,14 +139,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ mood: 'sad', username: 'fireninja' }).then(user => { const user = await this.User.create({ mood: 'sad', username: 'fireninja' });
expect(user.mood).to.equal('neutral'); expect(user.mood).to.equal('neutral');
expect(user.username).to.equal('fireninja'); expect(user.username).to.equal('fireninja');
expect(hookCalled).to.equal(1); expect(hookCalled).to.equal(1);
});
}); });
it('beforeCreate', function() { it('beforeCreate', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.beforeCreate(user => { this.User.beforeCreate(user => {
...@@ -160,14 +153,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -160,14 +153,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ username: 'akira' }).then(user => { const user = await this.User.create({ username: 'akira' });
expect(user.mood).to.equal('happy'); expect(user.mood).to.equal('happy');
expect(user.username).to.equal('akira'); expect(user.username).to.equal('akira');
expect(hookCalled).to.equal(1); expect(hookCalled).to.equal(1);
});
}); });
it('beforeSave', function() { it('beforeSave', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.beforeSave(user => { this.User.beforeSave(user => {
...@@ -175,14 +167,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -175,14 +167,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ username: 'akira' }).then(user => { const user = await this.User.create({ username: 'akira' });
expect(user.mood).to.equal('happy'); expect(user.mood).to.equal('happy');
expect(user.username).to.equal('akira'); expect(user.username).to.equal('akira');
expect(hookCalled).to.equal(1); expect(hookCalled).to.equal(1);
});
}); });
it('beforeSave with beforeCreate', function() { it('beforeSave with beforeCreate', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.beforeCreate(user => { this.User.beforeCreate(user => {
...@@ -195,11 +186,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -195,11 +186,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ username: 'akira' }).then(user => { const user = await this.User.create({ username: 'akira' });
expect(user.mood).to.equal('happy'); expect(user.mood).to.equal('happy');
expect(user.username).to.equal('akira'); expect(user.username).to.equal('akira');
expect(hookCalled).to.equal(2); expect(hookCalled).to.equal(2);
});
}); });
}); });
}); });
......
...@@ -7,7 +7,7 @@ const chai = require('chai'), ...@@ -7,7 +7,7 @@ const chai = require('chai'),
sinon = require('sinon'); sinon = require('sinon');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -18,29 +18,27 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -18,29 +18,27 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
values: ['happy', 'sad', 'neutral'] values: ['happy', 'sad', 'neutral']
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#destroy', () => { describe('#destroy', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.User.beforeDestroy(beforeHook); this.User.beforeDestroy(beforeHook);
this.User.afterDestroy(afterHook); this.User.afterDestroy(afterHook);
return this.User.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.User.create({ username: 'Toni', mood: 'happy' });
return user.destroy().then(() => { await user.destroy();
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -50,15 +48,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -50,15 +48,13 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
this.User.afterDestroy(afterHook); this.User.afterDestroy(afterHook);
return this.User.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.User.create({ username: 'Toni', mood: 'happy' });
return expect(user.destroy()).to.be.rejected.then(() => { await expect(user.destroy()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
});
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -68,12 +64,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -68,12 +64,10 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return this.User.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.User.create({ username: 'Toni', mood: 'happy' });
return expect(user.destroy()).to.be.rejected.then(() => { await expect(user.destroy()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
});
}); });
}); });
...@@ -96,26 +90,22 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -96,26 +90,22 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
}); });
it('sets other changed values when soft deleting and a beforeDestroy hooks kicks in', function() { it('sets other changed values when soft deleting and a beforeDestroy hooks kicks in', async function() {
return this.ParanoidUser.sync({ force: true }) await this.ParanoidUser.sync({ force: true });
.then(() => this.ParanoidUser.create({ username: 'user1' })) const user0 = await this.ParanoidUser.create({ username: 'user1' });
.then(user => user.destroy()) await user0.destroy();
.then(() => this.ParanoidUser.findOne({ paranoid: false })) const user = await this.ParanoidUser.findOne({ paranoid: false });
.then(user => { expect(user.updatedBy).to.equal(1);
expect(user.updatedBy).to.equal(1);
});
}); });
it('should not throw error when a beforeDestroy hook changes a virtual column', function() { it('should not throw error when a beforeDestroy hook changes a virtual column', async function() {
this.ParanoidUser.beforeDestroy(instance => instance.virtualField = 2); this.ParanoidUser.beforeDestroy(instance => instance.virtualField = 2);
return this.ParanoidUser.sync({ force: true }) await this.ParanoidUser.sync({ force: true });
.then(() => this.ParanoidUser.create({ username: 'user1' })) const user0 = await this.ParanoidUser.create({ username: 'user1' });
.then(user => user.destroy()) await user0.destroy();
.then(() => this.ParanoidUser.findOne({ paranoid: false })) const user = await this.ParanoidUser.findOne({ paranoid: false });
.then(user => { expect(user.virtualField).to.equal(0);
expect(user.virtualField).to.equal(0);
});
}); });
}); });
}); });
......
...@@ -6,7 +6,7 @@ const chai = require('chai'), ...@@ -6,7 +6,7 @@ const chai = require('chai'),
DataTypes = require('../../../lib/data-types'); DataTypes = require('../../../lib/data-types');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -18,28 +18,28 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -18,28 +18,28 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#find', () => { describe('#find', () => {
beforeEach(function() { beforeEach(async function() {
return this.User.bulkCreate([ await this.User.bulkCreate([
{ username: 'adam', mood: 'happy' }, { username: 'adam', mood: 'happy' },
{ username: 'joe', mood: 'sad' } { username: 'joe', mood: 'sad' }
]); ]);
}); });
it('allow changing attributes via beforeFind #5675', function() { it('allow changing attributes via beforeFind #5675', async function() {
this.User.beforeFind(options => { this.User.beforeFind(options => {
options.attributes = { options.attributes = {
include: [['id', 'my_id']] include: [['id', 'my_id']]
}; };
}); });
return this.User.findAll({}); await this.User.findAll({});
}); });
describe('on success', () => { describe('on success', () => {
it('all hooks run', function() { it('all hooks run', async function() {
let beforeHook = false, let beforeHook = false,
beforeHook2 = false, beforeHook2 = false,
beforeHook3 = false, beforeHook3 = false,
...@@ -61,95 +61,98 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -61,95 +61,98 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
afterHook = true; afterHook = true;
}); });
return this.User.findOne({ where: { username: 'adam' } }).then(user => { const user = await this.User.findOne({ where: { username: 'adam' } });
expect(user.mood).to.equal('happy'); expect(user.mood).to.equal('happy');
expect(beforeHook).to.be.true; expect(beforeHook).to.be.true;
expect(beforeHook2).to.be.true; expect(beforeHook2).to.be.true;
expect(beforeHook3).to.be.true; expect(beforeHook3).to.be.true;
expect(afterHook).to.be.true; expect(afterHook).to.be.true;
});
}); });
it('beforeFind hook can change options', function() { it('beforeFind hook can change options', async function() {
this.User.beforeFind(options => { this.User.beforeFind(options => {
options.where.username = 'joe'; options.where.username = 'joe';
}); });
return this.User.findOne({ where: { username: 'adam' } }).then(user => { const user = await this.User.findOne({ where: { username: 'adam' } });
expect(user.mood).to.equal('sad'); expect(user.mood).to.equal('sad');
});
}); });
it('beforeFindAfterExpandIncludeAll hook can change options', function() { it('beforeFindAfterExpandIncludeAll hook can change options', async function() {
this.User.beforeFindAfterExpandIncludeAll(options => { this.User.beforeFindAfterExpandIncludeAll(options => {
options.where.username = 'joe'; options.where.username = 'joe';
}); });
return this.User.findOne({ where: { username: 'adam' } }).then(user => { const user = await this.User.findOne({ where: { username: 'adam' } });
expect(user.mood).to.equal('sad'); expect(user.mood).to.equal('sad');
});
}); });
it('beforeFindAfterOptions hook can change options', function() { it('beforeFindAfterOptions hook can change options', async function() {
this.User.beforeFindAfterOptions(options => { this.User.beforeFindAfterOptions(options => {
options.where.username = 'joe'; options.where.username = 'joe';
}); });
return this.User.findOne({ where: { username: 'adam' } }).then(user => { const user = await this.User.findOne({ where: { username: 'adam' } });
expect(user.mood).to.equal('sad'); expect(user.mood).to.equal('sad');
});
}); });
it('afterFind hook can change results', function() { it('afterFind hook can change results', async function() {
this.User.afterFind(user => { this.User.afterFind(user => {
user.mood = 'sad'; user.mood = 'sad';
}); });
return this.User.findOne({ where: { username: 'adam' } }).then(user => { const user = await this.User.findOne({ where: { username: 'adam' } });
expect(user.mood).to.equal('sad'); expect(user.mood).to.equal('sad');
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('in beforeFind hook returns error', function() { it('in beforeFind hook returns error', async function() {
this.User.beforeFind(() => { this.User.beforeFind(() => {
throw new Error('Oops!'); throw new Error('Oops!');
}); });
return this.User.findOne({ where: { username: 'adam' } }).catch(err => { try {
await this.User.findOne({ where: { username: 'adam' } });
} catch (err) {
expect(err.message).to.equal('Oops!'); expect(err.message).to.equal('Oops!');
}); }
}); });
it('in beforeFindAfterExpandIncludeAll hook returns error', function() { it('in beforeFindAfterExpandIncludeAll hook returns error', async function() {
this.User.beforeFindAfterExpandIncludeAll(() => { this.User.beforeFindAfterExpandIncludeAll(() => {
throw new Error('Oops!'); throw new Error('Oops!');
}); });
return this.User.findOne({ where: { username: 'adam' } }).catch(err => { try {
await this.User.findOne({ where: { username: 'adam' } });
} catch (err) {
expect(err.message).to.equal('Oops!'); expect(err.message).to.equal('Oops!');
}); }
}); });
it('in beforeFindAfterOptions hook returns error', function() { it('in beforeFindAfterOptions hook returns error', async function() {
this.User.beforeFindAfterOptions(() => { this.User.beforeFindAfterOptions(() => {
throw new Error('Oops!'); throw new Error('Oops!');
}); });
return this.User.findOne({ where: { username: 'adam' } }).catch(err => { try {
await this.User.findOne({ where: { username: 'adam' } });
} catch (err) {
expect(err.message).to.equal('Oops!'); expect(err.message).to.equal('Oops!');
}); }
}); });
it('in afterFind hook returns error', function() { it('in afterFind hook returns error', async function() {
this.User.afterFind(() => { this.User.afterFind(() => {
throw new Error('Oops!'); throw new Error('Oops!');
}); });
return this.User.findOne({ where: { username: 'adam' } }).catch(err => { try {
await this.User.findOne({ where: { username: 'adam' } });
} catch (err) {
expect(err.message).to.equal('Oops!'); expect(err.message).to.equal('Oops!');
}); }
}); });
}); });
}); });
......
...@@ -9,7 +9,7 @@ const chai = require('chai'), ...@@ -9,7 +9,7 @@ const chai = require('chai'),
sinon = require('sinon'); sinon = require('sinon');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -31,7 +31,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -31,7 +31,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
paranoid: true paranoid: true
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#define', () => { describe('#define', () => {
...@@ -104,163 +104,143 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -104,163 +104,143 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
describe('passing DAO instances', () => { describe('passing DAO instances', () => {
describe('beforeValidate / afterValidate', () => { describe('beforeValidate / afterValidate', () => {
it('should pass a DAO instance to the hook', function() { it('should pass a DAO instance to the hook', async function() {
let beforeHooked = false; let beforeHooked = false;
let afterHooked = false; let afterHooked = false;
const User = this.sequelize.define('User', { const User = this.sequelize.define('User', {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeValidate(user) { async beforeValidate(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
return Promise.resolve();
}, },
afterValidate(user) { async afterValidate(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
return Promise.resolve();
} }
} }
}); });
return User.sync({ force: true }).then(() => { await User.sync({ force: true });
return User.create({ username: 'bob' }).then(() => { await User.create({ username: 'bob' });
expect(beforeHooked).to.be.true; expect(beforeHooked).to.be.true;
expect(afterHooked).to.be.true; expect(afterHooked).to.be.true;
});
});
}); });
}); });
describe('beforeCreate / afterCreate', () => { describe('beforeCreate / afterCreate', () => {
it('should pass a DAO instance to the hook', function() { it('should pass a DAO instance to the hook', async function() {
let beforeHooked = false; let beforeHooked = false;
let afterHooked = false; let afterHooked = false;
const User = this.sequelize.define('User', { const User = this.sequelize.define('User', {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeCreate(user) { async beforeCreate(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
return Promise.resolve();
}, },
afterCreate(user) { async afterCreate(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
return Promise.resolve();
} }
} }
}); });
return User.sync({ force: true }).then(() => { await User.sync({ force: true });
return User.create({ username: 'bob' }).then(() => { await User.create({ username: 'bob' });
expect(beforeHooked).to.be.true; expect(beforeHooked).to.be.true;
expect(afterHooked).to.be.true; expect(afterHooked).to.be.true;
});
});
}); });
}); });
describe('beforeDestroy / afterDestroy', () => { describe('beforeDestroy / afterDestroy', () => {
it('should pass a DAO instance to the hook', function() { it('should pass a DAO instance to the hook', async function() {
let beforeHooked = false; let beforeHooked = false;
let afterHooked = false; let afterHooked = false;
const User = this.sequelize.define('User', { const User = this.sequelize.define('User', {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeDestroy(user) { async beforeDestroy(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
return Promise.resolve();
}, },
afterDestroy(user) { async afterDestroy(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
return Promise.resolve();
} }
} }
}); });
return User.sync({ force: true }).then(() => { await User.sync({ force: true });
return User.create({ username: 'bob' }).then(user => { const user = await User.create({ username: 'bob' });
return user.destroy().then(() => { await user.destroy();
expect(beforeHooked).to.be.true; expect(beforeHooked).to.be.true;
expect(afterHooked).to.be.true; expect(afterHooked).to.be.true;
});
});
});
}); });
}); });
describe('beforeUpdate / afterUpdate', () => { describe('beforeUpdate / afterUpdate', () => {
it('should pass a DAO instance to the hook', function() { it('should pass a DAO instance to the hook', async function() {
let beforeHooked = false; let beforeHooked = false;
let afterHooked = false; let afterHooked = false;
const User = this.sequelize.define('User', { const User = this.sequelize.define('User', {
username: DataTypes.STRING username: DataTypes.STRING
}, { }, {
hooks: { hooks: {
beforeUpdate(user) { async beforeUpdate(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
beforeHooked = true; beforeHooked = true;
return Promise.resolve();
}, },
afterUpdate(user) { async afterUpdate(user) {
expect(user).to.be.instanceof(User); expect(user).to.be.instanceof(User);
afterHooked = true; afterHooked = true;
return Promise.resolve();
} }
} }
}); });
return User.sync({ force: true }).then(() => { await User.sync({ force: true });
return User.create({ username: 'bob' }).then(user => { const user = await User.create({ username: 'bob' });
user.username = 'bawb'; user.username = 'bawb';
return user.save({ fields: ['username'] }).then(() => { await user.save({ fields: ['username'] });
expect(beforeHooked).to.be.true; expect(beforeHooked).to.be.true;
expect(afterHooked).to.be.true; expect(afterHooked).to.be.true;
});
});
});
}); });
}); });
}); });
describe('Model#sync', () => { describe('Model#sync', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.User.beforeSync(beforeHook); this.User.beforeSync(beforeHook);
this.User.afterSync(afterHook); this.User.afterSync(afterHook);
return this.User.sync().then(() => { await this.User.sync();
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
}); });
it('should not run hooks when "hooks = false" option passed', function() { it('should not run hooks when "hooks = false" option passed', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.User.beforeSync(beforeHook); this.User.beforeSync(beforeHook);
this.User.afterSync(afterHook); this.User.afterSync(afterHook);
return this.User.sync({ hooks: false }).then(() => { await this.User.sync({ hooks: false });
expect(beforeHook).to.not.have.been.called; expect(beforeHook).to.not.have.been.called;
expect(afterHook).to.not.have.been.called; expect(afterHook).to.not.have.been.called;
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -270,13 +250,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -270,13 +250,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
this.User.afterSync(afterHook); this.User.afterSync(afterHook);
return expect(this.User.sync()).to.be.rejected.then(() => { await expect(this.User.sync()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -286,17 +265,16 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -286,17 +265,16 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.User.sync()).to.be.rejected.then(() => { await expect(this.User.sync()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
}); });
}); });
}); });
describe('sequelize#sync', () => { describe('sequelize#sync', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
modelBeforeHook = sinon.spy(), modelBeforeHook = sinon.spy(),
...@@ -307,15 +285,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -307,15 +285,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.afterSync(modelAfterHook); this.User.afterSync(modelAfterHook);
this.sequelize.afterBulkSync(afterHook); this.sequelize.afterBulkSync(afterHook);
return this.sequelize.sync().then(() => { await this.sequelize.sync();
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(modelBeforeHook).to.have.been.calledOnce; expect(modelBeforeHook).to.have.been.calledOnce;
expect(modelAfterHook).to.have.been.calledOnce; expect(modelAfterHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
}); });
it('should not run hooks if "hooks = false" option passed', function() { it('should not run hooks if "hooks = false" option passed', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
modelBeforeHook = sinon.spy(), modelBeforeHook = sinon.spy(),
...@@ -326,12 +303,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -326,12 +303,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.afterSync(modelAfterHook); this.User.afterSync(modelAfterHook);
this.sequelize.afterBulkSync(afterHook); this.sequelize.afterBulkSync(afterHook);
return this.sequelize.sync({ hooks: false }).then(() => { await this.sequelize.sync({ hooks: false });
expect(beforeHook).to.not.have.been.called; expect(beforeHook).to.not.have.been.called;
expect(modelBeforeHook).to.not.have.been.called; expect(modelBeforeHook).to.not.have.been.called;
expect(modelAfterHook).to.not.have.been.called; expect(modelAfterHook).to.not.have.been.called;
expect(afterHook).to.not.have.been.called; expect(afterHook).to.not.have.been.called;
});
}); });
afterEach(function() { afterEach(function() {
...@@ -342,7 +318,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -342,7 +318,7 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.sequelize.beforeBulkSync(() => { this.sequelize.beforeBulkSync(() => {
...@@ -351,13 +327,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -351,13 +327,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
this.sequelize.afterBulkSync(afterHook); this.sequelize.afterBulkSync(afterHook);
return expect(this.sequelize.sync()).to.be.rejected.then(() => { await expect(this.sequelize.sync()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -367,10 +342,9 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -367,10 +342,9 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.sequelize.sync()).to.be.rejected.then(() => { await expect(this.sequelize.sync()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
}); });
afterEach(function() { afterEach(function() {
...@@ -381,58 +355,52 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -381,58 +355,52 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
describe('#removal', () => { describe('#removal', () => {
it('should be able to remove by name', function() { it('should be able to remove by name', async function() {
const sasukeHook = sinon.spy(), const sasukeHook = sinon.spy(),
narutoHook = sinon.spy(); narutoHook = sinon.spy();
this.User.addHook('beforeCreate', 'sasuke', sasukeHook); this.User.addHook('beforeCreate', 'sasuke', sasukeHook);
this.User.addHook('beforeCreate', 'naruto', narutoHook); this.User.addHook('beforeCreate', 'naruto', narutoHook);
return this.User.create({ username: 'makunouchi' }).then(() => { await this.User.create({ username: 'makunouchi' });
expect(sasukeHook).to.have.been.calledOnce; expect(sasukeHook).to.have.been.calledOnce;
expect(narutoHook).to.have.been.calledOnce; expect(narutoHook).to.have.been.calledOnce;
this.User.removeHook('beforeCreate', 'sasuke'); this.User.removeHook('beforeCreate', 'sasuke');
return this.User.create({ username: 'sendo' }); await this.User.create({ username: 'sendo' });
}).then(() => { expect(sasukeHook).to.have.been.calledOnce;
expect(sasukeHook).to.have.been.calledOnce; expect(narutoHook).to.have.been.calledTwice;
expect(narutoHook).to.have.been.calledTwice;
});
}); });
it('should be able to remove by reference', function() { it('should be able to remove by reference', async function() {
const sasukeHook = sinon.spy(), const sasukeHook = sinon.spy(),
narutoHook = sinon.spy(); narutoHook = sinon.spy();
this.User.addHook('beforeCreate', sasukeHook); this.User.addHook('beforeCreate', sasukeHook);
this.User.addHook('beforeCreate', narutoHook); this.User.addHook('beforeCreate', narutoHook);
return this.User.create({ username: 'makunouchi' }).then(() => { await this.User.create({ username: 'makunouchi' });
expect(sasukeHook).to.have.been.calledOnce; expect(sasukeHook).to.have.been.calledOnce;
expect(narutoHook).to.have.been.calledOnce; expect(narutoHook).to.have.been.calledOnce;
this.User.removeHook('beforeCreate', sasukeHook); this.User.removeHook('beforeCreate', sasukeHook);
return this.User.create({ username: 'sendo' }); await this.User.create({ username: 'sendo' });
}).then(() => { expect(sasukeHook).to.have.been.calledOnce;
expect(sasukeHook).to.have.been.calledOnce; expect(narutoHook).to.have.been.calledTwice;
expect(narutoHook).to.have.been.calledTwice;
});
}); });
it('should be able to remove proxies', function() { it('should be able to remove proxies', async function() {
const sasukeHook = sinon.spy(), const sasukeHook = sinon.spy(),
narutoHook = sinon.spy(); narutoHook = sinon.spy();
this.User.addHook('beforeSave', sasukeHook); this.User.addHook('beforeSave', sasukeHook);
this.User.addHook('beforeSave', narutoHook); this.User.addHook('beforeSave', narutoHook);
return this.User.create({ username: 'makunouchi' }).then(user => { const user = await this.User.create({ username: 'makunouchi' });
expect(sasukeHook).to.have.been.calledOnce; expect(sasukeHook).to.have.been.calledOnce;
expect(narutoHook).to.have.been.calledOnce; expect(narutoHook).to.have.been.calledOnce;
this.User.removeHook('beforeSave', sasukeHook); this.User.removeHook('beforeSave', sasukeHook);
return user.update({ username: 'sendo' }); await user.update({ username: 'sendo' });
}).then(() => { expect(sasukeHook).to.have.been.calledOnce;
expect(sasukeHook).to.have.been.calledOnce; expect(narutoHook).to.have.been.calledTwice;
expect(narutoHook).to.have.been.calledTwice;
});
}); });
}); });
}); });
...@@ -7,7 +7,7 @@ const chai = require('chai'), ...@@ -7,7 +7,7 @@ const chai = require('chai'),
sinon = require('sinon'); sinon = require('sinon');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -29,31 +29,28 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -29,31 +29,28 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
paranoid: true paranoid: true
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#restore', () => { describe('#restore', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.ParanoidUser.beforeRestore(beforeHook); this.ParanoidUser.beforeRestore(beforeHook);
this.ParanoidUser.afterRestore(afterHook); this.ParanoidUser.afterRestore(afterHook);
return this.ParanoidUser.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.ParanoidUser.create({ username: 'Toni', mood: 'happy' });
return user.destroy().then(() => { await user.destroy();
return user.restore().then(() => { await user.restore();
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
});
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -63,17 +60,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -63,17 +60,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
this.ParanoidUser.afterRestore(afterHook); this.ParanoidUser.afterRestore(afterHook);
return this.ParanoidUser.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.ParanoidUser.create({ username: 'Toni', mood: 'happy' });
return user.destroy().then(() => { await user.destroy();
return expect(user.restore()).to.be.rejected.then(() => { await expect(user.restore()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
});
});
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -83,14 +77,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -83,14 +77,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return this.ParanoidUser.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.ParanoidUser.create({ username: 'Toni', mood: 'happy' });
return user.destroy().then(() => { await user.destroy();
return expect(user.restore()).to.be.rejected.then(() => { await expect(user.restore()).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
});
});
}); });
}); });
}); });
......
...@@ -7,7 +7,7 @@ const chai = require('chai'), ...@@ -7,7 +7,7 @@ const chai = require('chai'),
sinon = require('sinon'); sinon = require('sinon');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -18,12 +18,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -18,12 +18,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
values: ['happy', 'sad', 'neutral'] values: ['happy', 'sad', 'neutral']
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#update', () => { describe('#update', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
beforeSave = sinon.spy(), beforeSave = sinon.spy(),
...@@ -34,20 +34,18 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -34,20 +34,18 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.beforeSave(beforeSave); this.User.beforeSave(beforeSave);
this.User.afterSave(afterSave); this.User.afterSave(afterSave);
return this.User.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.User.create({ username: 'Toni', mood: 'happy' });
return user.update({ username: 'Chong' }).then(user => { const user0 = await user.update({ username: 'Chong' });
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
expect(beforeSave).to.have.been.calledTwice; expect(beforeSave).to.have.been.calledTwice;
expect(afterSave).to.have.been.calledTwice; expect(afterSave).to.have.been.calledTwice;
expect(user.username).to.equal('Chong'); expect(user0.username).to.equal('Chong');
});
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
beforeSave = sinon.spy(), beforeSave = sinon.spy(),
...@@ -61,17 +59,15 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -61,17 +59,15 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.beforeSave(beforeSave); this.User.beforeSave(beforeSave);
this.User.afterSave(afterSave); this.User.afterSave(afterSave);
return this.User.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.User.create({ username: 'Toni', mood: 'happy' });
return expect(user.update({ username: 'Chong' })).to.be.rejected.then(() => { await expect(user.update({ username: 'Chong' })).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(beforeSave).to.have.been.calledOnce; expect(beforeSave).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
expect(afterSave).to.have.been.calledOnce; expect(afterSave).to.have.been.calledOnce;
});
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(), afterHook = sinon.spy(),
beforeSave = sinon.spy(), beforeSave = sinon.spy(),
...@@ -85,47 +81,39 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -85,47 +81,39 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
this.User.beforeSave(beforeSave); this.User.beforeSave(beforeSave);
this.User.afterSave(afterSave); this.User.afterSave(afterSave);
return this.User.create({ username: 'Toni', mood: 'happy' }).then(user => { const user = await this.User.create({ username: 'Toni', mood: 'happy' });
return expect(user.update({ username: 'Chong' })).to.be.rejected.then(() => { await expect(user.update({ username: 'Chong' })).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
expect(beforeSave).to.have.been.calledTwice; expect(beforeSave).to.have.been.calledTwice;
expect(afterSave).to.have.been.calledOnce; expect(afterSave).to.have.been.calledOnce;
});
});
}); });
}); });
describe('preserves changes to instance', () => { describe('preserves changes to instance', () => {
it('beforeValidate', function() { it('beforeValidate', async function() {
this.User.beforeValidate(user => { this.User.beforeValidate(user => {
user.mood = 'happy'; user.mood = 'happy';
}); });
return this.User.create({ username: 'fireninja', mood: 'invalid' }).then(user => { const user0 = await this.User.create({ username: 'fireninja', mood: 'invalid' });
return user.update({ username: 'hero' }); const user = await user0.update({ username: 'hero' });
}).then(user => { expect(user.username).to.equal('hero');
expect(user.username).to.equal('hero'); expect(user.mood).to.equal('happy');
expect(user.mood).to.equal('happy');
});
}); });
it('afterValidate', function() { it('afterValidate', async function() {
this.User.afterValidate(user => { this.User.afterValidate(user => {
user.mood = 'sad'; user.mood = 'sad';
}); });
return this.User.create({ username: 'fireninja', mood: 'nuetral' }).then(user => { const user0 = await this.User.create({ username: 'fireninja', mood: 'nuetral' });
return user.update({ username: 'spider' }); const user = await user0.update({ username: 'spider' });
}).then(user => { expect(user.username).to.equal('spider');
expect(user.username).to.equal('spider'); expect(user.mood).to.equal('sad');
expect(user.mood).to.equal('sad');
});
}); });
it('beforeSave', function() { it('beforeSave', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.beforeSave(user => { this.User.beforeSave(user => {
...@@ -133,16 +121,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -133,16 +121,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ username: 'fireninja', mood: 'nuetral' }).then(user => { const user0 = await this.User.create({ username: 'fireninja', mood: 'nuetral' });
return user.update({ username: 'spider', mood: 'sad' }); const user = await user0.update({ username: 'spider', mood: 'sad' });
}).then(user => { expect(user.username).to.equal('spider');
expect(user.username).to.equal('spider'); expect(user.mood).to.equal('happy');
expect(user.mood).to.equal('happy'); expect(hookCalled).to.equal(2);
expect(hookCalled).to.equal(2);
});
}); });
it('beforeSave with beforeUpdate', function() { it('beforeSave with beforeUpdate', async function() {
let hookCalled = 0; let hookCalled = 0;
this.User.beforeUpdate(user => { this.User.beforeUpdate(user => {
...@@ -155,13 +141,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -155,13 +141,11 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
hookCalled++; hookCalled++;
}); });
return this.User.create({ username: 'akira' }).then(user => { const user0 = await this.User.create({ username: 'akira' });
return user.update({ username: 'spider', mood: 'sad' }); const user = await user0.update({ username: 'spider', mood: 'sad' });
}).then(user => { expect(user.mood).to.equal('happy');
expect(user.mood).to.equal('happy'); expect(user.username).to.equal('spider');
expect(user.username).to.equal('spider'); expect(hookCalled).to.equal(3);
expect(hookCalled).to.equal(3);
});
}); });
}); });
}); });
......
...@@ -8,7 +8,7 @@ const chai = require('chai'), ...@@ -8,7 +8,7 @@ const chai = require('chai'),
if (Support.sequelize.dialect.supports.upserts) { if (Support.sequelize.dialect.supports.upserts) {
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -20,27 +20,26 @@ if (Support.sequelize.dialect.supports.upserts) { ...@@ -20,27 +20,26 @@ if (Support.sequelize.dialect.supports.upserts) {
values: ['happy', 'sad', 'neutral'] values: ['happy', 'sad', 'neutral']
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#upsert', () => { describe('#upsert', () => {
describe('on success', () => { describe('on success', () => {
it('should run hooks', function() { it('should run hooks', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
this.User.beforeUpsert(beforeHook); this.User.beforeUpsert(beforeHook);
this.User.afterUpsert(afterHook); this.User.afterUpsert(afterHook);
return this.User.upsert({ username: 'Toni', mood: 'happy' }).then(() => { await this.User.upsert({ username: 'Toni', mood: 'happy' });
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should return an error from before', function() { it('should return an error from before', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -50,13 +49,12 @@ if (Support.sequelize.dialect.supports.upserts) { ...@@ -50,13 +49,12 @@ if (Support.sequelize.dialect.supports.upserts) {
}); });
this.User.afterUpsert(afterHook); this.User.afterUpsert(afterHook);
return expect(this.User.upsert({ username: 'Toni', mood: 'happy' })).to.be.rejected.then(() => { await expect(this.User.upsert({ username: 'Toni', mood: 'happy' })).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).not.to.have.been.called; expect(afterHook).not.to.have.been.called;
});
}); });
it('should return an error from after', function() { it('should return an error from after', async function() {
const beforeHook = sinon.spy(), const beforeHook = sinon.spy(),
afterHook = sinon.spy(); afterHook = sinon.spy();
...@@ -66,15 +64,14 @@ if (Support.sequelize.dialect.supports.upserts) { ...@@ -66,15 +64,14 @@ if (Support.sequelize.dialect.supports.upserts) {
throw new Error('Whoops!'); throw new Error('Whoops!');
}); });
return expect(this.User.upsert({ username: 'Toni', mood: 'happy' })).to.be.rejected.then(() => { await expect(this.User.upsert({ username: 'Toni', mood: 'happy' })).to.be.rejected;
expect(beforeHook).to.have.been.calledOnce; expect(beforeHook).to.have.been.calledOnce;
expect(afterHook).to.have.been.calledOnce; expect(afterHook).to.have.been.calledOnce;
});
}); });
}); });
describe('preserves changes to values', () => { describe('preserves changes to values', () => {
it('beforeUpsert', function() { it('beforeUpsert', async function() {
let hookCalled = 0; let hookCalled = 0;
const valuesOriginal = { mood: 'sad', username: 'leafninja' }; const valuesOriginal = { mood: 'sad', username: 'leafninja' };
...@@ -83,10 +80,9 @@ if (Support.sequelize.dialect.supports.upserts) { ...@@ -83,10 +80,9 @@ if (Support.sequelize.dialect.supports.upserts) {
hookCalled++; hookCalled++;
}); });
return this.User.upsert(valuesOriginal).then(() => { await this.User.upsert(valuesOriginal);
expect(valuesOriginal.mood).to.equal('happy'); expect(valuesOriginal.mood).to.equal('happy');
expect(hookCalled).to.equal(1); expect(hookCalled).to.equal(1);
});
}); });
}); });
}); });
......
...@@ -7,7 +7,7 @@ const Support = require('../support'); ...@@ -7,7 +7,7 @@ const Support = require('../support');
const DataTypes = require('../../../lib/data-types'); const DataTypes = require('../../../lib/data-types');
describe(Support.getTestDialectTeaser('Hooks'), () => { describe(Support.getTestDialectTeaser('Hooks'), () => {
beforeEach(function() { beforeEach(async function() {
this.User = this.sequelize.define('User', { this.User = this.sequelize.define('User', {
username: { username: {
type: DataTypes.STRING, type: DataTypes.STRING,
...@@ -18,12 +18,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -18,12 +18,12 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
values: ['happy', 'sad', 'neutral'] values: ['happy', 'sad', 'neutral']
} }
}); });
return this.sequelize.sync({ force: true }); await this.sequelize.sync({ force: true });
}); });
describe('#validate', () => { describe('#validate', () => {
describe('#create', () => { describe('#create', () => {
it('should return the user', function() { it('should return the user', async function() {
this.User.beforeValidate(user => { this.User.beforeValidate(user => {
user.username = 'Bob'; user.username = 'Bob';
user.mood = 'happy'; user.mood = 'happy';
...@@ -33,15 +33,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -33,15 +33,14 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
user.username = 'Toni'; user.username = 'Toni';
}); });
return this.User.create({ mood: 'ecstatic' }).then(user => { const user = await this.User.create({ mood: 'ecstatic' });
expect(user.mood).to.equal('happy'); expect(user.mood).to.equal('happy');
expect(user.username).to.equal('Toni'); expect(user.username).to.equal('Toni');
});
}); });
}); });
describe('#3534, hooks modifications', () => { describe('#3534, hooks modifications', () => {
it('fields modified in hooks are saved', function() { it('fields modified in hooks are saved', async function() {
this.User.afterValidate(user => { this.User.afterValidate(user => {
//if username is defined and has more than 5 char //if username is defined and has more than 5 char
user.username = user.username user.username = user.username
...@@ -56,94 +55,84 @@ describe(Support.getTestDialectTeaser('Hooks'), () => { ...@@ -56,94 +55,84 @@ describe(Support.getTestDialectTeaser('Hooks'), () => {
}); });
return this.User.create({ username: 'T', mood: 'neutral' }).then(user => { const user = await this.User.create({ username: 'T', mood: 'neutral' });
expect(user.mood).to.equal('neutral'); expect(user.mood).to.equal('neutral');
expect(user.username).to.equal('Samorost 3'); expect(user.username).to.equal('Samorost 3');
//change attributes //change attributes
user.mood = 'sad'; user.mood = 'sad';
user.username = 'Samorost Good One'; user.username = 'Samorost Good One';
return user.save(); const uSaved0 = await user.save();
}).then(uSaved => { expect(uSaved0.mood).to.equal('sad');
expect(uSaved.mood).to.equal('sad'); expect(uSaved0.username).to.equal('Samorost Good One');
expect(uSaved.username).to.equal('Samorost Good One');
//change attributes, expect to be replaced by hooks
//change attributes, expect to be replaced by hooks uSaved0.username = 'One';
uSaved.username = 'One';
const uSaved = await uSaved0.save();
return uSaved.save(); //attributes were replaced by hooks ?
}).then(uSaved => { expect(uSaved.mood).to.equal('sad');
//attributes were replaced by hooks ? expect(uSaved.username).to.equal('Samorost 3');
expect(uSaved.mood).to.equal('sad'); const uFetched0 = await this.User.findByPk(uSaved.id);
expect(uSaved.username).to.equal('Samorost 3'); expect(uFetched0.mood).to.equal('sad');
return this.User.findByPk(uSaved.id); expect(uFetched0.username).to.equal('Samorost 3');
}).then(uFetched => {
expect(uFetched.mood).to.equal('sad'); uFetched0.mood = null;
expect(uFetched.username).to.equal('Samorost 3'); uFetched0.username = 'New Game is Needed';
uFetched.mood = null; const uFetchedSaved0 = await uFetched0.save();
uFetched.username = 'New Game is Needed'; expect(uFetchedSaved0.mood).to.equal('neutral');
expect(uFetchedSaved0.username).to.equal('New Game is Needed');
return uFetched.save();
}).then(uFetchedSaved => { const uFetched = await this.User.findByPk(uFetchedSaved0.id);
expect(uFetchedSaved.mood).to.equal('neutral'); expect(uFetched.mood).to.equal('neutral');
expect(uFetchedSaved.username).to.equal('New Game is Needed'); expect(uFetched.username).to.equal('New Game is Needed');
return this.User.findByPk(uFetchedSaved.id); //expect to be replaced by hooks
}).then(uFetched => { uFetched.username = 'New';
expect(uFetched.mood).to.equal('neutral'); uFetched.mood = 'happy';
expect(uFetched.username).to.equal('New Game is Needed'); const uFetchedSaved = await uFetched.save();
expect(uFetchedSaved.mood).to.equal('happy');
//expect to be replaced by hooks expect(uFetchedSaved.username).to.equal('Samorost 3');
uFetched.username = 'New';
uFetched.mood = 'happy';
return uFetched.save();
}).then(uFetchedSaved => {
expect(uFetchedSaved.mood).to.equal('happy');
expect(uFetchedSaved.username).to.equal('Samorost 3');
});
}); });
}); });
describe('on error', () => { describe('on error', () => {
it('should emit an error from after hook', function() { it('should emit an error from after hook', async function() {
this.User.afterValidate(user => { this.User.afterValidate(user => {
user.mood = 'ecstatic'; user.mood = 'ecstatic';
throw new Error('Whoops! Changed user.mood!'); throw new Error('Whoops! Changed user.mood!');
}); });
return expect(this.User.create({ username: 'Toni', mood: 'happy' })).to.be.rejectedWith('Whoops! Changed user.mood!'); await expect(this.User.create({ username: 'Toni', mood: 'happy' })).to.be.rejectedWith('Whoops! Changed user.mood!');
}); });
it('should call validationFailed hook', function() { it('should call validationFailed hook', async function() {
const validationFailedHook = sinon.spy(); const validationFailedHook = sinon.spy();
this.User.validationFailed(validationFailedHook); this.User.validationFailed(validationFailedHook);
return expect(this.User.create({ mood: 'happy' })).to.be.rejected.then(() => { await expect(this.User.create({ mood: 'happy' })).to.be.rejected;
expect(validationFailedHook).to.have.been.calledOnce; expect(validationFailedHook).to.have.been.calledOnce;
});
}); });
it('should not replace the validation error in validationFailed hook by default', function() { it('should not replace the validation error in validationFailed hook by default', async function() {
const validationFailedHook = sinon.stub(); const validationFailedHook = sinon.stub();
this.User.validationFailed(validationFailedHook); this.User.validationFailed(validationFailedHook);
return expect(this.User.create({ mood: 'happy' })).to.be.rejected.then(err => { const err = await expect(this.User.create({ mood: 'happy' })).to.be.rejected;
expect(err.name).to.equal('SequelizeValidationError'); expect(err.name).to.equal('SequelizeValidationError');
});
}); });
it('should replace the validation error if validationFailed hook creates a new error', function() { it('should replace the validation error if validationFailed hook creates a new error', async function() {
const validationFailedHook = sinon.stub().throws(new Error('Whoops!')); const validationFailedHook = sinon.stub().throws(new Error('Whoops!'));
this.User.validationFailed(validationFailedHook); this.User.validationFailed(validationFailedHook);
return expect(this.User.create({ mood: 'happy' })).to.be.rejected.then(err => { const err = await expect(this.User.create({ mood: 'happy' })).to.be.rejected;
expect(err.message).to.equal('Whoops!'); expect(err.message).to.equal('Whoops!');
});
}); });
}); });
}); });
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!