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 8e1c9142
authored
Jan 05, 2014
by
Mick Hansen
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
include new test file
1 parent
7df710b8
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
1146 additions
and
0 deletions
test/include/findAll.test.js
test/include/findAll.test.js
0 → 100644
View file @
8e1c914
/* jshint camelcase: false */
/* jshint expr: true */
var
chai
=
require
(
'chai'
)
,
Sequelize
=
require
(
'../../index'
)
,
expect
=
chai
.
expect
,
Support
=
require
(
__dirname
+
'/../support'
)
,
DataTypes
=
require
(
__dirname
+
"/../../lib/data-types"
)
,
dialect
=
Support
.
getTestDialect
()
,
config
=
require
(
__dirname
+
"/../config/config"
)
,
sinon
=
require
(
'sinon'
)
,
datetime
=
require
(
'chai-datetime'
)
,
_
=
require
(
'lodash'
)
,
moment
=
require
(
'moment'
)
,
async
=
require
(
'async'
)
chai
.
use
(
datetime
)
chai
.
Assertion
.
includeStack
=
true
var
sortById
=
function
(
a
,
b
)
{
return
a
.
id
<
b
.
id
?
-
1
:
1
}
describe
(
Support
.
getTestDialectTeaser
(
"Include"
),
function
()
{
describe
(
'findAll'
,
function
()
{
beforeEach
(
function
()
{
this
.
fixtureA
=
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Company
=
this
.
sequelize
.
define
(
'Company'
,
{
name
:
DataTypes
.
STRING
})
,
Product
=
this
.
sequelize
.
define
(
'Product'
,
{
title
:
DataTypes
.
STRING
})
,
Tag
=
this
.
sequelize
.
define
(
'Tag'
,
{
name
:
DataTypes
.
STRING
})
,
Price
=
this
.
sequelize
.
define
(
'Price'
,
{
value
:
DataTypes
.
FLOAT
})
,
Customer
=
this
.
sequelize
.
define
(
'Customer'
,
{
name
:
DataTypes
.
STRING
})
,
Group
=
this
.
sequelize
.
define
(
'Group'
,
{
name
:
DataTypes
.
STRING
})
,
GroupMember
=
this
.
sequelize
.
define
(
'GroupMember'
,
{
})
,
Rank
=
this
.
sequelize
.
define
(
'Rank'
,
{
name
:
DataTypes
.
STRING
,
canInvite
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
},
canRemove
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
},
canPost
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
}
})
this
.
models
=
{
User
:
User
,
Company
:
Company
,
Product
:
Product
,
Tag
:
Tag
,
Price
:
Price
,
Customer
:
Customer
,
Group
:
Group
,
GroupMember
:
GroupMember
,
Rank
:
Rank
}
User
.
hasMany
(
Product
)
Product
.
belongsTo
(
User
)
Product
.
hasMany
(
Tag
)
Tag
.
hasMany
(
Product
)
Product
.
belongsTo
(
Tag
,
{
as
:
'Category'
})
Product
.
belongsTo
(
Company
)
Product
.
hasMany
(
Price
)
Price
.
belongsTo
(
Product
)
User
.
hasMany
(
GroupMember
,
{
as
:
'Memberships'
})
GroupMember
.
belongsTo
(
User
)
GroupMember
.
belongsTo
(
Rank
)
GroupMember
.
belongsTo
(
Group
)
Group
.
hasMany
(
GroupMember
,
{
as
:
'Memberships'
})
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
var
count
=
4
,
i
=
-
1
async
.
auto
({
groups
:
function
(
callback
)
{
Group
.
bulkCreate
([
{
name
:
'Developers'
},
{
name
:
'Designers'
},
{
name
:
'Managers'
}
]).
done
(
function
()
{
Group
.
findAll
().
done
(
callback
)
})
},
companies
:
function
(
callback
)
{
Company
.
bulkCreate
([
{
name
:
'Sequelize'
},
{
name
:
'Coca Cola'
},
{
name
:
'Bonanza'
},
{
name
:
'NYSE'
},
{
name
:
'Coshopr'
}
]).
done
(
function
()
{
Company
.
findAll
().
done
(
callback
)
})
},
ranks
:
function
(
callback
)
{
Rank
.
bulkCreate
([
{
name
:
'Admin'
,
canInvite
:
1
,
canRemove
:
1
,
canPost
:
1
},
{
name
:
'Trustee'
,
canInvite
:
1
,
canRemove
:
0
,
canPost
:
1
},
{
name
:
'Member'
,
canInvite
:
1
,
canRemove
:
0
,
canPost
:
0
}
]).
done
(
function
(
err
)
{
Rank
.
findAll
().
done
(
callback
)
})
},
tags
:
function
(
callback
)
{
Tag
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
},
{
name
:
'C'
},
{
name
:
'D'
},
{
name
:
'E'
}
]).
done
(
function
()
{
Tag
.
findAll
().
done
(
callback
)
})
},
loop
:
[
'groups'
,
'ranks'
,
'tags'
,
function
(
done
,
results
)
{
var
groups
=
results
.
groups
,
ranks
=
results
.
ranks
,
tags
=
results
.
tags
,
companies
=
results
.
companies
async
.
whilst
(
function
()
{
return
i
<
count
;
},
function
(
callback
)
{
i
++
async
.
auto
({
user
:
function
(
callback
)
{
User
.
create
().
done
(
callback
)
},
memberships
:
[
'user'
,
function
(
callback
,
results
)
{
var
groupMembers
=
[
{
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
0
].
id
,
RankId
:
ranks
[
0
].
id
},
{
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
1
].
id
,
RankId
:
ranks
[
2
].
id
}
]
if
(
i
<
3
)
{
groupMembers
.
push
({
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
2
].
id
,
RankId
:
ranks
[
1
].
id
})
}
GroupMember
.
bulkCreate
(
groupMembers
).
done
(
callback
)
}],
products
:
function
(
callback
)
{
Product
.
bulkCreate
([
{
title
:
'Chair'
},
{
title
:
'Desk'
},
{
title
:
'Bed'
},
{
title
:
'Pen'
},
{
title
:
'Monitor'
}
]).
done
(
function
()
{
Product
.
findAll
().
done
(
callback
)
})
},
userProducts
:
[
'user'
,
'products'
,
function
(
callback
,
results
)
{
results
.
user
.
setProducts
([
results
.
products
[(
i
*
5
)
+
0
],
results
.
products
[(
i
*
5
)
+
1
],
results
.
products
[(
i
*
5
)
+
3
]
]).
done
(
callback
)
}],
productTags
:
[
'products'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
products
[(
i
*
5
)
+
0
].
setTags
([
tags
[
0
],
tags
[
2
]
]))
chainer
.
add
(
results
.
products
[(
i
*
5
)
+
1
].
setTags
([
tags
[
1
]
]))
chainer
.
add
(
results
.
products
[(
i
*
5
)
+
0
].
setCategory
(
tags
[
1
]))
chainer
.
add
(
results
.
products
[(
i
*
5
)
+
2
].
setTags
([
tags
[
0
]
]))
chainer
.
add
(
results
.
products
[(
i
*
5
)
+
3
].
setTags
([
tags
[
0
]
]))
chainer
.
run
().
done
(
callback
)
}],
companies
:
[
'products'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
results
.
products
[(
i
*
5
)
+
0
].
setCompany
(
companies
[
4
])
results
.
products
[(
i
*
5
)
+
1
].
setCompany
(
companies
[
3
])
results
.
products
[(
i
*
5
)
+
2
].
setCompany
(
companies
[
2
])
results
.
products
[(
i
*
5
)
+
3
].
setCompany
(
companies
[
1
])
results
.
products
[(
i
*
5
)
+
4
].
setCompany
(
companies
[
0
])
chainer
.
run
().
done
(
callback
)
}],
prices
:
[
'products'
,
function
(
callback
,
results
)
{
Price
.
bulkCreate
([
{
ProductId
:
results
.
products
[(
i
*
5
)
+
0
].
id
,
value
:
5
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
0
].
id
,
value
:
10
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
1
].
id
,
value
:
5
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
1
].
id
,
value
:
10
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
1
].
id
,
value
:
15
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
1
].
id
,
value
:
20
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
2
].
id
,
value
:
20
},
{
ProductId
:
results
.
products
[(
i
*
5
)
+
3
].
id
,
value
:
20
}
]).
done
(
callback
)
}]
},
callback
)
},
function
(
err
)
{
expect
(
err
).
not
.
to
.
be
.
ok
done
()
}
)
}]
},
done
.
bind
(
this
))
})
}
})
it
(
'should support an include with multiple different association types'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Product
=
this
.
sequelize
.
define
(
'Product'
,
{
title
:
DataTypes
.
STRING
})
,
Tag
=
this
.
sequelize
.
define
(
'Tag'
,
{
name
:
DataTypes
.
STRING
})
,
Price
=
this
.
sequelize
.
define
(
'Price'
,
{
value
:
DataTypes
.
FLOAT
})
,
Customer
=
this
.
sequelize
.
define
(
'Customer'
,
{
name
:
DataTypes
.
STRING
})
,
Group
=
this
.
sequelize
.
define
(
'Group'
,
{
name
:
DataTypes
.
STRING
})
,
GroupMember
=
this
.
sequelize
.
define
(
'GroupMember'
,
{
})
,
Rank
=
this
.
sequelize
.
define
(
'Rank'
,
{
name
:
DataTypes
.
STRING
,
canInvite
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
},
canRemove
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
}
})
User
.
hasMany
(
Product
)
Product
.
belongsTo
(
User
)
Product
.
hasMany
(
Tag
)
Tag
.
hasMany
(
Product
)
Product
.
belongsTo
(
Tag
,
{
as
:
'Category'
})
Product
.
hasMany
(
Price
)
Price
.
belongsTo
(
Product
)
User
.
hasMany
(
GroupMember
,
{
as
:
'Memberships'
})
GroupMember
.
belongsTo
(
User
)
GroupMember
.
belongsTo
(
Rank
)
GroupMember
.
belongsTo
(
Group
)
Group
.
hasMany
(
GroupMember
,
{
as
:
'Memberships'
})
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
var
count
=
4
,
i
=
-
1
async
.
auto
({
groups
:
function
(
callback
)
{
Group
.
bulkCreate
([
{
name
:
'Developers'
},
{
name
:
'Designers'
}
]).
done
(
function
()
{
Group
.
findAll
().
done
(
callback
)
})
},
ranks
:
function
(
callback
)
{
Rank
.
bulkCreate
([
{
name
:
'Admin'
,
canInvite
:
1
,
canRemove
:
1
},
{
name
:
'Member'
,
canInvite
:
1
,
canRemove
:
0
}
]).
done
(
function
()
{
Rank
.
findAll
().
done
(
callback
)
})
},
tags
:
function
(
callback
)
{
Tag
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
},
{
name
:
'C'
}
]).
done
(
function
()
{
Tag
.
findAll
().
done
(
callback
)
})
},
loop
:
[
'groups'
,
'ranks'
,
'tags'
,
function
(
done
,
results
)
{
var
groups
=
results
.
groups
,
ranks
=
results
.
ranks
,
tags
=
results
.
tags
async
.
whilst
(
function
()
{
return
i
<
count
;
},
function
(
callback
)
{
i
++
async
.
auto
({
user
:
function
(
callback
)
{
User
.
create
().
done
(
callback
)
},
memberships
:
[
'user'
,
function
(
callback
,
results
)
{
GroupMember
.
bulkCreate
([
{
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
0
].
id
,
RankId
:
ranks
[
0
].
id
},
{
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
1
].
id
,
RankId
:
ranks
[
1
].
id
}
]).
done
(
callback
)
}],
products
:
function
(
callback
)
{
Product
.
bulkCreate
([
{
title
:
'Chair'
},
{
title
:
'Desk'
}
]).
done
(
function
()
{
Product
.
findAll
().
done
(
callback
)
})
},
userProducts
:
[
'user'
,
'products'
,
function
(
callback
,
results
)
{
results
.
user
.
setProducts
([
results
.
products
[(
i
*
2
)
+
0
],
results
.
products
[(
i
*
2
)
+
1
]
]).
done
(
callback
)
}],
productTags
:
[
'products'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
products
[(
i
*
2
)
+
0
].
setTags
([
tags
[
0
],
tags
[
2
]
]))
chainer
.
add
(
results
.
products
[(
i
*
2
)
+
1
].
setTags
([
tags
[
1
]
]))
chainer
.
add
(
results
.
products
[(
i
*
2
)
+
0
].
setCategory
(
tags
[
1
]))
chainer
.
run
().
done
(
callback
)
}],
prices
:
[
'products'
,
function
(
callback
,
results
)
{
Price
.
bulkCreate
([
{
ProductId
:
results
.
products
[(
i
*
2
)
+
0
].
id
,
value
:
5
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
0
].
id
,
value
:
10
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
5
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
10
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
15
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
20
}
]).
done
(
callback
)
}]
},
callback
)
},
function
(
err
)
{
expect
(
err
).
not
.
to
.
be
.
ok
User
.
findAll
({
include
:
[
{
model
:
GroupMember
,
as
:
'Memberships'
,
include
:
[
Group
,
Rank
]},
{
model
:
Product
,
include
:
[
Tag
,
{
model
:
Tag
,
as
:
'Category'
},
Price
]}
],
order
:
'id ASC'
}).
done
(
function
(
err
,
users
)
{
expect
(
err
).
not
.
to
.
be
.
ok
users
.
forEach
(
function
(
user
,
i
)
{
user
.
memberships
.
sort
(
sortById
)
expect
(
user
.
memberships
.
length
).
to
.
equal
(
2
)
expect
(
user
.
memberships
[
0
].
group
.
name
).
to
.
equal
(
'Developers'
)
expect
(
user
.
memberships
[
0
].
rank
.
canRemove
).
to
.
equal
(
1
)
expect
(
user
.
memberships
[
1
].
group
.
name
).
to
.
equal
(
'Designers'
)
expect
(
user
.
memberships
[
1
].
rank
.
canRemove
).
to
.
equal
(
0
)
user
.
products
.
sort
(
sortById
)
expect
(
user
.
products
.
length
).
to
.
equal
(
2
)
expect
(
user
.
products
[
0
].
tags
.
length
).
to
.
equal
(
2
)
expect
(
user
.
products
[
1
].
tags
.
length
).
to
.
equal
(
1
)
expect
(
user
.
products
[
0
].
category
).
to
.
be
.
ok
expect
(
user
.
products
[
1
].
category
).
not
.
to
.
be
.
ok
expect
(
user
.
products
[
0
].
prices
.
length
).
to
.
equal
(
2
)
expect
(
user
.
products
[
1
].
prices
.
length
).
to
.
equal
(
4
)
done
()
})
})
}
)
}]
},
done
)
})
})
it
(
'should support many levels of belongsTo'
,
function
(
done
)
{
var
A
=
this
.
sequelize
.
define
(
'A'
,
{})
,
B
=
this
.
sequelize
.
define
(
'B'
,
{})
,
C
=
this
.
sequelize
.
define
(
'C'
,
{})
,
D
=
this
.
sequelize
.
define
(
'D'
,
{})
,
E
=
this
.
sequelize
.
define
(
'E'
,
{})
,
F
=
this
.
sequelize
.
define
(
'F'
,
{})
,
G
=
this
.
sequelize
.
define
(
'G'
,
{})
,
H
=
this
.
sequelize
.
define
(
'H'
,
{})
A
.
belongsTo
(
B
)
B
.
belongsTo
(
C
)
C
.
belongsTo
(
D
)
D
.
belongsTo
(
E
)
E
.
belongsTo
(
F
)
F
.
belongsTo
(
G
)
G
.
belongsTo
(
H
)
var
b
,
singles
=
[
B
,
C
,
D
,
E
,
F
,
G
,
H
]
this
.
sequelize
.
sync
().
done
(
function
()
{
async
.
auto
({
as
:
function
(
callback
)
{
A
.
bulkCreate
([
{},
{},
{},
{},
{},
{},
{},
{}
]).
done
(
function
()
{
A
.
findAll
().
done
(
callback
)
})
},
singleChain
:
function
(
callback
)
{
var
previousInstance
,
previousModel
async
.
eachSeries
(
singles
,
function
(
model
,
callback
,
i
)
{
model
.
create
({}).
done
(
function
(
err
,
instance
)
{
if
(
previousInstance
)
{
previousInstance
[
"set"
+
model
.
name
](
instance
).
done
(
function
()
{
previousInstance
=
instance
callback
()
})
}
else
{
previousInstance
=
b
=
instance
callback
()
}
})
},
callback
)
},
abs
:
[
'as'
,
'singleChain'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
results
.
as
.
forEach
(
function
(
a
)
{
chainer
.
add
(
a
.
setB
(
b
))
})
chainer
.
run
().
done
(
callback
)
}]
},
function
()
{
A
.
findAll
({
include
:
[
{
model
:
B
,
include
:
[
{
model
:
C
,
include
:
[
{
model
:
D
,
include
:
[
{
model
:
E
,
include
:
[
{
model
:
F
,
include
:
[
{
model
:
G
,
include
:
[
{
model
:
H
}
]}
]}
]}
]}
]}
]}
]
}).
done
(
function
(
err
,
as
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
as
.
length
).
to
.
be
.
ok
as
.
forEach
(
function
(
a
)
{
expect
(
a
.
b
.
c
.
d
.
e
.
f
.
g
.
h
).
to
.
be
.
ok
})
done
()
})
})
})
})
it
(
'should support ordering with only belongsTo includes'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Item
=
this
.
sequelize
.
define
(
'Item'
,
{
'test'
:
DataTypes
.
STRING
})
,
Order
=
this
.
sequelize
.
define
(
'Order'
,
{
'position'
:
DataTypes
.
INTEGER
})
User
.
belongsTo
(
Item
,
{
'as'
:
'itemA'
,
foreignKey
:
'itemA_id'
})
User
.
belongsTo
(
Item
,
{
'as'
:
'itemB'
,
foreignKey
:
'itemB_id'
})
User
.
belongsTo
(
Order
)
this
.
sequelize
.
sync
().
done
(
function
()
{
async
.
auto
({
users
:
function
(
callback
)
{
User
.
bulkCreate
([{},
{},
{}]).
done
(
function
()
{
User
.
findAll
().
done
(
callback
)
})
},
items
:
function
(
callback
)
{
Item
.
bulkCreate
([
{
'test'
:
'abc'
},
{
'test'
:
'def'
},
{
'test'
:
'ghi'
},
{
'test'
:
'jkl'
}
]).
done
(
function
()
{
Item
.
findAll
({
order
:
[
'id'
]}).
done
(
callback
)
})
},
orders
:
function
(
callback
)
{
Order
.
bulkCreate
([
{
'position'
:
2
},
{
'position'
:
3
},
{
'position'
:
1
}
]).
done
(
function
()
{
Order
.
findAll
({
order
:
[
'id'
]}).
done
(
callback
)
})
},
associate
:
[
'users'
,
'items'
,
'orders'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
var
user1
=
results
.
users
[
0
]
var
user2
=
results
.
users
[
1
]
var
user3
=
results
.
users
[
2
]
var
item1
=
results
.
items
[
0
]
var
item2
=
results
.
items
[
1
]
var
item3
=
results
.
items
[
2
]
var
item4
=
results
.
items
[
3
]
var
order1
=
results
.
orders
[
0
]
var
order2
=
results
.
orders
[
1
]
var
order3
=
results
.
orders
[
2
]
chainer
.
add
(
user1
.
setItemA
(
item1
))
chainer
.
add
(
user1
.
setItemB
(
item2
))
chainer
.
add
(
user1
.
setOrder
(
order3
))
chainer
.
add
(
user2
.
setItemA
(
item3
))
chainer
.
add
(
user2
.
setItemB
(
item4
))
chainer
.
add
(
user2
.
setOrder
(
order2
))
chainer
.
add
(
user3
.
setItemA
(
item1
))
chainer
.
add
(
user3
.
setItemB
(
item4
))
chainer
.
add
(
user3
.
setOrder
(
order1
))
chainer
.
run
().
done
(
callback
)
}]
},
function
()
{
User
.
findAll
({
'where'
:
{
'itemA.test'
:
'abc'
},
'include'
:
[
{
'model'
:
Item
,
'as'
:
'itemA'
},
{
'model'
:
Item
,
'as'
:
'itemB'
},
Order
],
'order'
:
[
'Order.position'
]
}).
done
(
function
(
err
,
as
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
as
.
length
).
to
.
eql
(
2
)
expect
(
as
[
0
].
itemA
.
test
).
to
.
eql
(
'abc'
)
expect
(
as
[
1
].
itemA
.
test
).
to
.
eql
(
'abc'
)
expect
(
as
[
0
].
order
.
position
).
to
.
eql
(
1
)
expect
(
as
[
1
].
order
.
position
).
to
.
eql
(
2
)
done
()
})
})
})
})
it
(
'should include attributes from through models'
,
function
(
done
)
{
var
Product
=
this
.
sequelize
.
define
(
'Product'
,
{
title
:
DataTypes
.
STRING
})
,
Tag
=
this
.
sequelize
.
define
(
'Tag'
,
{
name
:
DataTypes
.
STRING
})
,
ProductTag
=
this
.
sequelize
.
define
(
'ProductTag'
,
{
priority
:
DataTypes
.
INTEGER
})
Product
.
hasMany
(
Tag
,
{
through
:
ProductTag
})
Tag
.
hasMany
(
Product
,
{
through
:
ProductTag
})
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
async
.
auto
({
products
:
function
(
callback
)
{
Product
.
bulkCreate
([
{
title
:
'Chair'
},
{
title
:
'Desk'
},
{
title
:
'Dress'
}
]).
done
(
function
()
{
Product
.
findAll
().
done
(
callback
)
})
},
tags
:
function
(
callback
)
{
Tag
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
},
{
name
:
'C'
}
]).
done
(
function
()
{
Tag
.
findAll
().
done
(
callback
)
})
},
productTags
:
[
'products'
,
'tags'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
products
[
0
].
addTag
(
results
.
tags
[
0
],
{
priority
:
1
}))
chainer
.
add
(
results
.
products
[
0
].
addTag
(
results
.
tags
[
1
],
{
priority
:
2
}))
chainer
.
add
(
results
.
products
[
1
].
addTag
(
results
.
tags
[
1
],
{
priority
:
1
}))
chainer
.
add
(
results
.
products
[
2
].
addTag
(
results
.
tags
[
0
],
{
priority
:
3
}))
chainer
.
add
(
results
.
products
[
2
].
addTag
(
results
.
tags
[
1
],
{
priority
:
1
}))
chainer
.
add
(
results
.
products
[
2
].
addTag
(
results
.
tags
[
2
],
{
priority
:
2
}))
chainer
.
run
().
done
(
callback
)
}]
},
function
(
err
,
results
)
{
expect
(
err
).
not
.
to
.
be
.
ok
Product
.
findAll
({
include
:
[
{
model
:
Tag
}
],
order
:
[
[
'id'
,
'ASC'
],
[
'Tags.id'
,
'ASC'
]
]
}).
done
(
function
(
err
,
products
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
products
[
0
].
tags
[
0
].
productTag
.
priority
).
to
.
equal
(
1
)
expect
(
products
[
0
].
tags
[
1
].
productTag
.
priority
).
to
.
equal
(
2
)
expect
(
products
[
1
].
tags
[
0
].
productTag
.
priority
).
to
.
equal
(
1
)
expect
(
products
[
2
].
tags
[
0
].
productTag
.
priority
).
to
.
equal
(
3
)
expect
(
products
[
2
].
tags
[
1
].
productTag
.
priority
).
to
.
equal
(
1
)
expect
(
products
[
2
].
tags
[
2
].
productTag
.
priority
).
to
.
equal
(
2
)
done
()
})
})
})
})
it
(
'should support a required belongsTo include'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Group
=
this
.
sequelize
.
define
(
'Group'
,
{})
User
.
belongsTo
(
Group
)
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
async
.
auto
({
groups
:
function
(
callback
)
{
Group
.
bulkCreate
([{},
{}]).
done
(
function
()
{
Group
.
findAll
().
done
(
callback
)
})
},
users
:
function
(
callback
)
{
User
.
bulkCreate
([{},
{},
{}]).
done
(
function
()
{
User
.
findAll
().
done
(
callback
)
})
},
userGroups
:
[
'users'
,
'groups'
,
function
(
callback
,
results
)
{
results
.
users
[
2
].
setGroup
(
results
.
groups
[
1
]).
done
(
callback
)
}]
},
function
(
err
,
results
)
{
expect
(
err
).
not
.
to
.
be
.
ok
User
.
findAll
({
include
:
[
{
model
:
Group
,
required
:
true
}
]
}).
done
(
function
(
err
,
users
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
users
.
length
).
to
.
equal
(
1
)
expect
(
users
[
0
].
group
).
to
.
be
.
ok
done
()
})
})
})
})
it
(
'should be possible to extend the on clause with a where option on a belongsTo include'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Group
=
this
.
sequelize
.
define
(
'Group'
,
{
name
:
DataTypes
.
STRING
})
User
.
belongsTo
(
Group
)
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
async
.
auto
({
groups
:
function
(
callback
)
{
Group
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
}
]).
done
(
function
()
{
Group
.
findAll
().
done
(
callback
)
})
},
users
:
function
(
callback
)
{
User
.
bulkCreate
([{},
{}]).
done
(
function
()
{
User
.
findAll
().
done
(
callback
)
})
},
userGroups
:
[
'users'
,
'groups'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
users
[
0
].
setGroup
(
results
.
groups
[
1
]))
chainer
.
add
(
results
.
users
[
1
].
setGroup
(
results
.
groups
[
0
]))
chainer
.
run
().
done
(
callback
)
}]
},
function
(
err
,
results
)
{
expect
(
err
).
not
.
to
.
be
.
ok
User
.
findAll
({
include
:
[
{
model
:
Group
,
where
:
{
name
:
'A'
}}
]
}).
done
(
function
(
err
,
users
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
users
.
length
).
to
.
equal
(
1
)
expect
(
users
[
0
].
group
).
to
.
be
.
ok
expect
(
users
[
0
].
group
.
name
).
to
.
equal
(
'A'
)
done
()
})
})
})
})
it
(
'should be possible to extend the on clause with a where option on a hasOne include'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Project
=
this
.
sequelize
.
define
(
'Project'
,
{
title
:
DataTypes
.
STRING
})
User
.
hasOne
(
Project
,
{
as
:
'LeaderOf'
})
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
async
.
auto
({
projects
:
function
(
callback
)
{
Project
.
bulkCreate
([
{
title
:
'Alpha'
},
{
title
:
'Beta'
}
]).
done
(
function
()
{
Project
.
findAll
().
done
(
callback
)
})
},
users
:
function
(
callback
)
{
User
.
bulkCreate
([{},
{}]).
done
(
function
()
{
User
.
findAll
().
done
(
callback
)
})
},
userProjects
:
[
'users'
,
'projects'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
users
[
1
].
setLeaderOf
(
results
.
projects
[
1
]))
chainer
.
add
(
results
.
users
[
0
].
setLeaderOf
(
results
.
projects
[
0
]))
chainer
.
run
().
done
(
callback
)
}]
},
function
(
err
,
results
)
{
expect
(
err
).
not
.
to
.
be
.
ok
User
.
findAll
({
include
:
[
{
model
:
Project
,
as
:
'LeaderOf'
,
where
:
{
title
:
'Beta'
}}
]
}).
done
(
function
(
err
,
users
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
users
.
length
).
to
.
equal
(
1
)
expect
(
users
[
0
].
leaderOf
).
to
.
be
.
ok
expect
(
users
[
0
].
leaderOf
.
title
).
to
.
equal
(
'Beta'
)
done
()
})
})
})
})
it
(
'should be possible to extend the on clause with a where option on a hasMany include with a through model'
,
function
(
done
)
{
var
Product
=
this
.
sequelize
.
define
(
'Product'
,
{
title
:
DataTypes
.
STRING
})
,
Tag
=
this
.
sequelize
.
define
(
'Tag'
,
{
name
:
DataTypes
.
STRING
})
,
ProductTag
=
this
.
sequelize
.
define
(
'ProductTag'
,
{
priority
:
DataTypes
.
INTEGER
})
Product
.
hasMany
(
Tag
,
{
through
:
ProductTag
})
Tag
.
hasMany
(
Product
,
{
through
:
ProductTag
})
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
async
.
auto
({
products
:
function
(
callback
)
{
Product
.
bulkCreate
([
{
title
:
'Chair'
},
{
title
:
'Desk'
},
{
title
:
'Dress'
}
]).
done
(
function
()
{
Product
.
findAll
().
done
(
callback
)
})
},
tags
:
function
(
callback
)
{
Tag
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
},
{
name
:
'C'
}
]).
done
(
function
()
{
Tag
.
findAll
().
done
(
callback
)
})
},
productTags
:
[
'products'
,
'tags'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
products
[
0
].
addTag
(
results
.
tags
[
0
],
{
priority
:
1
}))
chainer
.
add
(
results
.
products
[
0
].
addTag
(
results
.
tags
[
1
],
{
priority
:
2
}))
chainer
.
add
(
results
.
products
[
1
].
addTag
(
results
.
tags
[
1
],
{
priority
:
1
}))
chainer
.
add
(
results
.
products
[
2
].
addTag
(
results
.
tags
[
0
],
{
priority
:
3
}))
chainer
.
add
(
results
.
products
[
2
].
addTag
(
results
.
tags
[
1
],
{
priority
:
1
}))
chainer
.
add
(
results
.
products
[
2
].
addTag
(
results
.
tags
[
2
],
{
priority
:
2
}))
chainer
.
run
().
done
(
callback
)
}]
},
function
(
err
,
results
)
{
expect
(
err
).
not
.
to
.
be
.
ok
Product
.
findAll
({
include
:
[
{
model
:
Tag
,
where
:
{
name
:
'C'
}}
]
}).
done
(
function
(
err
,
products
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
products
.
length
).
to
.
equal
(
1
)
expect
(
products
[
0
].
tags
.
length
).
to
.
equal
(
1
)
done
()
})
})
})
})
it
.
only
(
'should be possible to extend the on clause with a where option on nested includes'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Product
=
this
.
sequelize
.
define
(
'Product'
,
{
title
:
DataTypes
.
STRING
})
,
Tag
=
this
.
sequelize
.
define
(
'Tag'
,
{
name
:
DataTypes
.
STRING
})
,
Price
=
this
.
sequelize
.
define
(
'Price'
,
{
value
:
DataTypes
.
FLOAT
})
,
Customer
=
this
.
sequelize
.
define
(
'Customer'
,
{
name
:
DataTypes
.
STRING
})
,
Group
=
this
.
sequelize
.
define
(
'Group'
,
{
name
:
DataTypes
.
STRING
})
,
GroupMember
=
this
.
sequelize
.
define
(
'GroupMember'
,
{
})
,
Rank
=
this
.
sequelize
.
define
(
'Rank'
,
{
name
:
DataTypes
.
STRING
,
canInvite
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
},
canRemove
:
{
type
:
DataTypes
.
INTEGER
,
defaultValue
:
0
}
})
User
.
hasMany
(
Product
)
Product
.
belongsTo
(
User
)
Product
.
hasMany
(
Tag
)
Tag
.
hasMany
(
Product
)
Product
.
belongsTo
(
Tag
,
{
as
:
'Category'
})
Product
.
hasMany
(
Price
)
Price
.
belongsTo
(
Product
)
User
.
hasMany
(
GroupMember
,
{
as
:
'Memberships'
})
GroupMember
.
belongsTo
(
User
)
GroupMember
.
belongsTo
(
Rank
)
GroupMember
.
belongsTo
(
Group
)
Group
.
hasMany
(
GroupMember
,
{
as
:
'Memberships'
})
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
var
count
=
4
,
i
=
-
1
async
.
auto
({
groups
:
function
(
callback
)
{
Group
.
bulkCreate
([
{
name
:
'Developers'
},
{
name
:
'Designers'
}
]).
done
(
function
()
{
Group
.
findAll
().
done
(
callback
)
})
},
ranks
:
function
(
callback
)
{
Rank
.
bulkCreate
([
{
name
:
'Admin'
,
canInvite
:
1
,
canRemove
:
1
},
{
name
:
'Member'
,
canInvite
:
1
,
canRemove
:
0
}
]).
done
(
function
()
{
Rank
.
findAll
().
done
(
callback
)
})
},
tags
:
function
(
callback
)
{
Tag
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
},
{
name
:
'C'
}
]).
done
(
function
()
{
Tag
.
findAll
().
done
(
callback
)
})
},
loop
:
[
'groups'
,
'ranks'
,
'tags'
,
function
(
done
,
results
)
{
var
groups
=
results
.
groups
,
ranks
=
results
.
ranks
,
tags
=
results
.
tags
async
.
whilst
(
function
()
{
return
i
<
count
;
},
function
(
callback
)
{
i
++
async
.
auto
({
user
:
function
(
callback
)
{
User
.
create
().
done
(
callback
)
},
memberships
:
[
'user'
,
function
(
callback
,
results
)
{
GroupMember
.
bulkCreate
([
{
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
0
].
id
,
RankId
:
ranks
[
0
].
id
},
{
UserId
:
results
.
user
.
id
,
GroupId
:
groups
[
1
].
id
,
RankId
:
ranks
[
1
].
id
}
]).
done
(
callback
)
}],
products
:
function
(
callback
)
{
Product
.
bulkCreate
([
{
title
:
'Chair'
},
{
title
:
'Desk'
}
]).
done
(
function
()
{
Product
.
findAll
().
done
(
callback
)
})
},
userProducts
:
[
'user'
,
'products'
,
function
(
callback
,
results
)
{
results
.
user
.
setProducts
([
results
.
products
[(
i
*
2
)
+
0
],
results
.
products
[(
i
*
2
)
+
1
]
]).
done
(
callback
)
}],
productTags
:
[
'products'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
products
[(
i
*
2
)
+
0
].
setTags
([
tags
[
0
],
tags
[
2
]
]))
chainer
.
add
(
results
.
products
[(
i
*
2
)
+
1
].
setTags
([
tags
[
1
]
]))
chainer
.
add
(
results
.
products
[(
i
*
2
)
+
0
].
setCategory
(
tags
[
1
]))
chainer
.
run
().
done
(
callback
)
}],
prices
:
[
'products'
,
function
(
callback
,
results
)
{
Price
.
bulkCreate
([
{
ProductId
:
results
.
products
[(
i
*
2
)
+
0
].
id
,
value
:
5
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
0
].
id
,
value
:
10
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
5
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
10
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
15
},
{
ProductId
:
results
.
products
[(
i
*
2
)
+
1
].
id
,
value
:
20
}
]).
done
(
callback
)
}]
},
callback
)
},
function
(
err
)
{
expect
(
err
).
not
.
to
.
be
.
ok
User
.
findAll
({
include
:
[
{
model
:
GroupMember
,
as
:
'Memberships'
,
include
:
[
Group
,
{
model
:
Rank
,
where
:
{
name
:
'Admin'
}}
]},
{
model
:
Product
,
include
:
[
Tag
,
{
model
:
Tag
,
as
:
'Category'
},
{
model
:
Price
,
where
:
{
value
:
{
gt
:
15
}
}}
]}
],
order
:
'id ASC'
}).
done
(
function
(
err
,
users
)
{
expect
(
err
).
not
.
to
.
be
.
ok
users
.
forEach
(
function
(
user
)
{
expect
(
user
.
memberships
.
length
).
to
.
equal
(
1
)
expect
(
user
.
memberships
[
0
].
rank
.
name
).
to
.
equal
(
'Admin'
)
expect
(
user
.
products
.
length
).
to
.
equal
(
1
)
expect
(
user
.
products
[
0
].
prices
.
length
).
to
.
equal
(
1
)
})
done
()
})
}
)
}]
},
done
)
})
})
it
(
'should be possible use limit and a where with a belongsTo include'
,
function
(
done
)
{
var
User
=
this
.
sequelize
.
define
(
'User'
,
{})
,
Group
=
this
.
sequelize
.
define
(
'Group'
,
{
name
:
DataTypes
.
STRING
})
User
.
belongsTo
(
Group
)
this
.
sequelize
.
sync
({
force
:
true
}).
done
(
function
()
{
async
.
auto
({
groups
:
function
(
callback
)
{
Group
.
bulkCreate
([
{
name
:
'A'
},
{
name
:
'B'
},
]).
done
(
function
()
{
Group
.
findAll
().
done
(
callback
)
})
},
users
:
function
(
callback
)
{
User
.
bulkCreate
([{},
{},
{},
{}]).
done
(
function
()
{
User
.
findAll
().
done
(
callback
)
})
},
userGroups
:
[
'users'
,
'groups'
,
function
(
callback
,
results
)
{
var
chainer
=
new
Sequelize
.
Utils
.
QueryChainer
()
chainer
.
add
(
results
.
users
[
0
].
setGroup
(
results
.
groups
[
0
]))
chainer
.
add
(
results
.
users
[
1
].
setGroup
(
results
.
groups
[
0
]))
chainer
.
add
(
results
.
users
[
2
].
setGroup
(
results
.
groups
[
0
]))
chainer
.
add
(
results
.
users
[
3
].
setGroup
(
results
.
groups
[
1
]))
chainer
.
run
().
done
(
callback
)
}]
},
function
(
err
,
results
)
{
expect
(
err
).
not
.
to
.
be
.
ok
User
.
findAll
({
include
:
[
{
model
:
Group
,
where
:
{
name
:
'A'
}}
],
limit
:
2
}).
done
(
function
(
err
,
users
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
users
.
length
).
to
.
equal
(
2
)
users
.
forEach
(
function
(
user
)
{
expect
(
user
.
group
.
name
).
to
.
equal
(
'A'
)
})
done
()
})
})
})
})
it
(
'should be possible use limit and a where on a belongsTo with additional hasMany includes'
,
function
(
done
)
{
var
self
=
this
this
.
fixtureA
(
function
()
{
self
.
models
.
Product
.
findAll
({
include
:
[
{
model
:
self
.
models
.
Company
,
where
:
{
name
:
'NYSE'
}},
{
model
:
self
.
models
.
Tag
},
{
model
:
self
.
models
.
Price
}
],
limit
:
3
,
order
:
'id ASC'
}).
done
(
function
(
err
,
products
)
{
expect
(
err
).
not
.
to
.
be
.
ok
expect
(
products
.
length
).
to
.
equal
(
3
)
products
.
forEach
(
function
(
product
)
{
expect
(
product
.
tags
.
length
).
to
.
be
.
ok
expect
(
product
.
prices
.
length
).
to
.
be
.
ok
})
done
()
})
})
})
})
})
\ No newline at end of file
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