Skip to content

Commit 5fbc55e

Browse files
authored
fix: Use equality check to filter ENUMs
Co-authored-by: Grant Bakker <grant@bakker.pw>, fixes #19
1 parent d1dca50 commit 5fbc55e

File tree

3 files changed

+55
-1
lines changed

3 files changed

+55
-1
lines changed

migrations/20181211174223-create-user.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
GENDER_CHOICES = {
2+
MALE: "male",
3+
FEMALE: "female",
4+
}
5+
16
module.exports = {
27
up: (queryInterface, Sequelize) => {
38
return queryInterface.createTable('Users', {
@@ -14,7 +19,9 @@ module.exports = {
1419
type: Sequelize.STRING,
1520
},
1621
gender: {
17-
type: Sequelize.STRING,
22+
type: Sequelize.ENUM({
23+
values: Object.values(GENDER_CHOICES),
24+
}),
1825
},
1926
email: {
2027
type: Sequelize.STRING,

spec/resource.spec.js

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,47 @@ describe('Resource', function () {
7272
})
7373
})
7474

75+
describe('#find with filter', function () {
76+
beforeEach(async function () {
77+
this.params = {
78+
gender: 'male',
79+
email: 'john.doe@softwarebrothers.co',
80+
}
81+
this.record = await this.resource.create(this.params)
82+
})
83+
84+
it('returns 1 BaseRecord when filtering on ENUMS', async function () {
85+
const filter = new Filter({
86+
gender: 'male',
87+
}, this.resource)
88+
const records = await this.resource.find(filter, { limit: 20, offset: 0, sort: { direction: 'asc', sortBy: 'id' } })
89+
90+
expect(records).to.have.lengthOf(1)
91+
expect(records[0]).to.be.instanceOf(BaseRecord)
92+
expect(records[0].params.gender).to.equal('male')
93+
})
94+
95+
it('returns 0 BaseRecord when filtering on ENUMS', async function () {
96+
const filter = new Filter({
97+
gender: 'female',
98+
}, this.resource)
99+
const records = await this.resource.find(filter, { limit: 20, offset: 0, sort: { direction: 'asc', sortBy: 'id' } })
100+
101+
expect(records).to.have.lengthOf(0)
102+
})
103+
104+
it('returns error when filtering on ENUMS with invalid value', async function () {
105+
const filter = new Filter({
106+
gender: 'XXX',
107+
}, this.resource)
108+
try {
109+
await this.resource.find(filter, { limit: 20, offset: 0, sort: { direction: 'asc', sortBy: 'id' } })
110+
} catch (error) {
111+
expect(error).to.be.an.instanceOf(db.sequelize.DatabaseError)
112+
}
113+
})
114+
})
115+
75116
describe('#count', function () {
76117
it('returns 0 when there are none elements', async function () {
77118
const count = await this.resource.count(new Filter({}))

src/utils/convert-filter.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@ const convertFilter = (filter) => {
99
const { property, value } = filterProperty
1010
switch (property.type()) {
1111
case 'string':
12+
if (property.sequelizePath.values) {
13+
return {
14+
[property.name()]: { [Op.eq]: `${escape(value)}` },
15+
...memo,
16+
}
17+
}
1218
return {
1319
[property.name()]: { [Op.like]: `%${escape(value)}%` },
1420
...memo,

0 commit comments

Comments
 (0)