|
const Knex = require('knex')({ client: 'sqlite3', useNullAsDefault: true }) |
|
const Akh = require('../lib/ahk') |
|
|
|
describe('Akh Instance', () => { |
|
test('Should return error when the knex instance not found', () => { |
|
expect(Akh).toThrowError('Knex not found') |
|
}) |
|
}) |
|
|
|
describe('Filter Implementation', () => { |
|
test('Should not add condition when the filter is not passed', () => { |
|
const query = Knex('profiles').modify(builder => Akh(builder)) |
|
expect(query.toString()).toBe('select * from `profiles`') |
|
}) |
|
|
|
test('Should not add condition when the filter empty is passed', () => { |
|
const query = Knex('profiles').modify(builder => Akh(builder, {})) |
|
expect(query.toString()).toBe('select * from `profiles`') |
|
}) |
|
|
|
test('Should build simple query', () => { |
|
const filter = { |
|
id: 1, |
|
name: 'avza', |
|
surname: null, |
|
hobbies: ['soccer', 'volleyball'] |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where `id` = 1 and `name` = \'avza\' and `surname` is null and `hobbies` in (\'soccer\', \'volleyball\')') |
|
}) |
|
|
|
test('Should build query with operator "equal"', () => { |
|
const filter = { id: { eq: 1 } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` = 1)') |
|
}) |
|
|
|
test('Should build query with operator "not equal"', () => { |
|
const filter = { id: { neq: 1 } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (not `id` = 1)') |
|
}) |
|
|
|
test('Should build query with operator "like"', () => { |
|
const filter = { |
|
name: { lk: '%av' }, |
|
surname: { lk: 'za%' }, |
|
login: { lk: '%avza%' } |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`name` like \'%av\') and (`surname` like \'za%\') and (`login` like \'%avza%\')') |
|
}) |
|
|
|
test('Should build query with operator "not like"', () => { |
|
const filter = { name: { nlk: '%av' } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`name` not like \'%av\')') |
|
}) |
|
|
|
test('Should build query with operator "in"', () => { |
|
const filter = { id: { in: [1, 2] } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` in (1, 2))') |
|
}) |
|
|
|
test('Should build query with operator "not in"', () => { |
|
const filter = { id: { nin: [1, 2] } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` not in (1, 2))') |
|
}) |
|
|
|
test('Should build query with operator "between"', () => { |
|
const filter = { id: { btw: [1, 2] } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` between 1 and 2)') |
|
}) |
|
|
|
test('Should build query with operator "not between"', () => { |
|
const filter = { id: { nbtw: [1, 2] } } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` not between 1 and 2)') |
|
}) |
|
|
|
test('Should build query with operators "gte" and "lte"', () => { |
|
const filter = { |
|
id: { |
|
gte: 1, |
|
lte: 5 |
|
} |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` >= 1 and `id` <= 5)') |
|
}) |
|
|
|
test('Should build query with operators "gt" and "lt"', () => { |
|
const filter = { |
|
id: { |
|
gt: 1, |
|
lt: 5 |
|
} |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` > 1 and `id` < 5)') |
|
}) |
|
|
|
test('Should build query with operators "isnull"', () => { |
|
const filter = { |
|
name: { |
|
isnull: false |
|
}, |
|
surname: { |
|
isnull: true |
|
} |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`name` is not null) and (`surname` is null)') |
|
}) |
|
|
|
test('Should build query with connector OR', () => { |
|
const filter = { |
|
name: 'avza', |
|
or: { |
|
surname: 'avza' |
|
} |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where `name` = \'avza\' or (`surname` = \'avza\')') |
|
}) |
|
|
|
test('Should build query with connector OR inside another OR', () => { |
|
const filter = { |
|
id: 1, |
|
or: { |
|
name: 'avza', |
|
or: { |
|
surname: 'avza' |
|
} |
|
} |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where `id` = 1 or (`name` = \'avza\' or (`surname` = \'avza\'))') |
|
}) |
|
|
|
test('Should build complex query', () => { |
|
const filter = { |
|
id: { |
|
in: [1, 2] |
|
}, |
|
or: { |
|
id: { |
|
gte: 5, |
|
lte: 9 |
|
} |
|
}, |
|
name: 'avza', |
|
surname: { |
|
lk: 'za%' |
|
} |
|
} |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` where (`id` in (1, 2)) or ((`id` >= 5 and `id` <= 9)) and `name` = \'avza\' and (`surname` like \'za%\')') |
|
}) |
|
|
|
test('Should build query with custom name', () => { |
|
const filter = { |
|
id: 1, |
|
name: { lk: '%avza%' }, |
|
or: { age: 22 } |
|
} |
|
|
|
const columnNames = { id: 'profile_id', name: 'fullname' } |
|
|
|
const query = Knex('profiles').modify(builder => Akh(builder, filter, columnNames)) |
|
expect(query.toString()).toBe('select * from `profiles` where `profile_id` = 1 and (`fullname` like \'%avza%\') or (`age` = 22)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "eq" and "neq"', () => { |
|
const filter = { |
|
id: 1, |
|
name: { |
|
neq: 'avza' |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on `id` = 1 and (`name` <> `avza`)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "gte" and "lte"', () => { |
|
const filter = { |
|
id: { |
|
gte: 1, |
|
lte: 8 |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on (`id` >= 1 and `id` <= 8)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "gt" and "lt"', () => { |
|
const filter = { |
|
id: { |
|
gt: 1, |
|
lt: 8 |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on (`id` > 1 and `id` < 8)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "in" and "nin"', () => { |
|
const filter = { |
|
id: { |
|
in: [1, 2, 3] |
|
}, |
|
type_id: { |
|
nin: [1, 2, 3, 4, 5] |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on (`id` in (1, 2, 3)) and (`type_id` not in (1, 2, 3, 4, 5))') |
|
}) |
|
|
|
test('Should build simple query with join and operator "lk" and "nlk"', () => { |
|
const filter = { |
|
name: { |
|
lk: 'za%' |
|
}, |
|
surname: { |
|
nlk: '%tb' |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on (`name` like `za%`) and (`surname` not like `%tb`)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "in" and "nin"', () => { |
|
const filter = { |
|
id: { |
|
btw: [1, 10] |
|
}, |
|
type_id: { |
|
nbtw: [1, 5] |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on (`id` between 1 and 10) and (`type_id` not between 1 and 5)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "is null"', () => { |
|
const filter = { |
|
id: { |
|
isnull: false |
|
}, |
|
type_id: { |
|
isnull: true |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on (`id` is not null) and (`type_id` is null)') |
|
}) |
|
|
|
test('Should build simple query with join and operator "OR"', () => { |
|
const filter = { |
|
name: 'avza', |
|
or: { |
|
surname: { |
|
isnull: true |
|
} |
|
} |
|
} |
|
|
|
const query = Knex('profiles').innerJoin({ g: 'games' }, builder => Akh(builder, filter)) |
|
expect(query.toString()).toBe('select * from `profiles` inner join `games` as `g` on `name` = `avza` or ((`surname` is null))') |
|
}) |
|
}) |
|
|