From 787d2b611fcbeb1f0dce80b8d256468748cf4727 Mon Sep 17 00:00:00 2001 From: Junyi Date: Sat, 12 Dec 2020 22:10:44 +0800 Subject: [PATCH] fix: Symbol property could not be iterated in for-in (#39) --- .../src/__tests__/model/parseApiJson.test.ts | 19 ++++- .../src/__tests__/utils/toWhere.test.ts | 71 +++++++++++-------- packages/database/src/utils.ts | 2 +- 3 files changed, 62 insertions(+), 30 deletions(-) diff --git a/packages/database/src/__tests__/model/parseApiJson.test.ts b/packages/database/src/__tests__/model/parseApiJson.test.ts index 6de55d487..29bf384c9 100644 --- a/packages/database/src/__tests__/model/parseApiJson.test.ts +++ b/packages/database/src/__tests__/model/parseApiJson.test.ts @@ -1,4 +1,4 @@ -import { literal } from 'sequelize'; +import { literal, Op } from 'sequelize'; import { getDatabase } from '..'; import Database from '../../database'; import Model, { ModelCtor } from '../../model'; @@ -55,6 +55,10 @@ beforeAll(() => { db.table({ name: 'foos', fields: [ + { + type: 'int', + name: 'f_g61p' + }, { type: 'hasMany', name: 'bars', @@ -99,6 +103,19 @@ describe('parseApiJson', () => { }); expect(data).toEqual({ where: { col1: 'co2' } }); }); + + it('filter with condition operator', () => { + const data = Foo.parseApiJson({ + filter: {"and":[{"f_g61p.eq":23}]} + }); + expect(data).toEqual({ + where: { + [Op.and]: [ + { f_g61p: { [Op.eq]: 23 } } + ] + } + }); + }); it('fields', () => { const data = Foo.parseApiJson({ diff --git a/packages/database/src/__tests__/utils/toWhere.test.ts b/packages/database/src/__tests__/utils/toWhere.test.ts index 7114d1c54..ccb3f76e5 100644 --- a/packages/database/src/__tests__/utils/toWhere.test.ts +++ b/packages/database/src/__tests__/utils/toWhere.test.ts @@ -1,10 +1,40 @@ import { Op } from "sequelize"; import Database from "../../database"; -import Model, { ModelCtor } from '../../model'; import { toWhere } from "../../utils"; import { getDatabase } from ".."; describe('utils.toWhere', () => { + let db: Database; + beforeAll(() => { + db = getDatabase(); + db.table({ + name: 'users', + }); + db.table({ + name: 'posts', + fields: [ + { + type: 'string', + name: 'title' + }, + { + type: 'belongsTo', + name: 'user', + } + ] + }); + db.table({ + name: 'categories', + fields: [ + { + type: 'hasMany', + name: 'posts', + } + ], + }); + }); + afterAll(() => db.close()); + describe('single', () => { it('=', () => { const where = toWhere({ @@ -213,6 +243,18 @@ describe('utils.toWhere', () => { }); }); + it('logical and with condition operator in field', () => { + const Post = db.getModel('posts'); + const data = toWhere({"and":[{"title.eq": '23'}]}, { + model: Post + }); + expect(data).toEqual({ + [Op.and]: [ + { title: { [Op.eq]: '23' } } + ] + }); + }); + // TODO: bug it.skip('field as "or"', () => { expect(toWhere({ @@ -233,33 +275,6 @@ describe('utils.toWhere', () => { }); describe('association', () => { - let db: Database; - beforeAll(() => { - db = getDatabase(); - db.table({ - name: 'users', - }); - db.table({ - name: 'posts', - fields: [ - { - type: 'belongsTo', - name: 'user', - } - ] - }); - db.table({ - name: 'categories', - fields: [ - { - type: 'hasMany', - name: 'posts', - } - ], - }); - }); - afterAll(() => db.close()); - const toWhereExpect = (options: any) => { const Category = db.getModel('categories'); const where = toWhere(options, { diff --git a/packages/database/src/utils.ts b/packages/database/src/utils.ts index eddd1dbfc..a6b3c05a4 100644 --- a/packages/database/src/utils.ts +++ b/packages/database/src/utils.ts @@ -273,7 +273,7 @@ export function toInclude(options: any, context: ToIncludeContext = {}) { data.distinct = true; } - if (Object.keys(where).length > 0) { + if (Reflect.ownKeys(where).length > 0) { data.where = where; }