Skip to content
Toggle navigation
Projects
Groups
Snippets
Help
public
/
sequelize
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
不要怂,就是干,撸起袖子干!
Commit b49a24d4
authored
May 14, 2020
by
Andy Edwards
Committed by
GitHub
May 14, 2020
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
fix(test/integration/hooks): asyncify (#12251)
1 parent
4dbfb5d1
Hide whitespace changes
Inline
Side-by-side
Showing
11 changed files
with
816 additions
and
1000 deletions
test/integration/hooks/associations.test.js
test/integration/hooks/bulkOperation.test.js
test/integration/hooks/count.test.js
test/integration/hooks/create.test.js
test/integration/hooks/destroy.test.js
test/integration/hooks/find.test.js
test/integration/hooks/hooks.test.js
test/integration/hooks/restore.test.js
test/integration/hooks/updateAttributes.test.js
test/integration/hooks/upsert.test.js
test/integration/hooks/validate.test.js
test/integration/hooks/associations.test.js
View file @
b49a24d
...
@@ -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
.
fals
e
;
expect
(
beforeProject
).
to
.
be
.
tru
e
;
})
;
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
(
after
Project
).
to
.
be
.
true
;
expect
(
before
Project
).
to
.
be
.
true
;
expect
(
beforeTask
).
to
.
be
.
true
;
expect
(
afterProject
).
to
.
be
.
true
;
expect
(
after
Task
).
to
.
be
.
true
;
expect
(
before
Task
).
to
.
be
.
true
;
expect
(
beforeMini
Task
).
to
.
be
.
true
;
expect
(
after
Task
).
to
.
be
.
true
;
expect
(
after
MiniTask
).
to
.
be
.
true
;
expect
(
before
MiniTask
).
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
.
fals
e
;
expect
(
afterProject
).
to
.
be
.
tru
e
;
expect
(
beforeMiniTask
).
to
.
be
.
fals
e
;
expect
(
beforeTask
).
to
.
be
.
tru
e
;
expect
(
afterMini
Task
).
to
.
be
.
false
;
expect
(
after
Task
).
to
.
be
.
false
;
})
;
expect
(
beforeMiniTask
).
to
.
be
.
false
;
})
;
expect
(
afterMiniTask
).
to
.
be
.
false
;
});
});
});
});
});
});
...
...
test/integration/hooks/bulkOperation.test.js
View file @
b49a24d
...
@@ -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
(
after
Bulk
).
to
.
have
.
been
.
calledOnce
;
expect
(
before
Bulk
).
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
;
}
);
}
});
});
});
});
});
});
...
...
test/integration/hooks/count.test.js
View file @
b49a24d
...
@@ -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!'
);
});
});
});
});
});
});
...
...
test/integration/hooks/create.test.js
View file @
b49a24d
...
@@ -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
);
});
});
});
});
});
});
});
...
...
test/integration/hooks/destroy.test.js
View file @
b49a24d
...
@@ -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
);
});
});
});
});
});
});
});
...
...
test/integration/hooks/find.test.js
View file @
b49a24d
...
@@ -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!'
);
}
);
}
});
});
});
});
});
});
...
...
test/integration/hooks/hooks.test.js
View file @
b49a24d
...
@@ -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
)
{
a
sync
a
fterValidate
(
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
)
{
a
sync
a
fterCreate
(
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
)
{
a
sync
a
fterDestroy
(
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
)
{
a
sync
a
fterUpdate
(
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
;
});
});
});
});
});
});
});
test/integration/hooks/restore.test.js
View file @
b49a24d
...
@@ -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
;
});
});
});
});
});
});
});
});
});
...
...
test/integration/hooks/updateAttributes.test.js
View file @
b49a24d
...
@@ -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
);
});
});
});
});
});
});
});
...
...
test/integration/hooks/upsert.test.js
View file @
b49a24d
...
@@ -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
);
});
});
});
});
});
});
});
...
...
test/integration/hooks/validate.test.js
View file @
b49a24d
...
@@ -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!'
);
});
});
});
});
});
});
});
...
...
Write
Preview
Markdown
is supported
Attach a file
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to post a comment