UNPKG

think-model-abstract

Version:
1,275 lines (1,118 loc) 35.9 kB
const ava = require('ava'); const helper = require('think-helper'); const Parser = require('../../lib/parser'); const getParserInstance = config => { const instance = new Parser(config); instance.parseKey = function parseKey(key = '') { key = key.trim(); if (helper.isEmpty(key)) return ''; if (helper.isNumberString(key)) return key; if (!(/[,'"*()`.\s]/.test(key))) { key = '`' + key + '`'; } return key; }; return instance; }; ava.test('init', ('init', t => { t.plan(2); const instance = getParserInstance(); // const keys = Object.keys(instance.comparison).sort(); // t.deepEqual(keys, [ '<>', 'EGT', 'ELT', 'EQ', 'GT', 'ILIKE', 'IN', 'LIKE', 'LT', 'NEQ', 'NOTILIKE', 'NOTIN', 'NOTLIKE' ]); t.is(instance.selectSql, undefined); t.is(instance.comparison, undefined); })); ava.test('parseExplain', t => { const instance = getParserInstance(); const data = instance.parseExplain(); t.is(data, ''); }); ava.test('parseExplain true', t => { const instance = getParserInstance(); const data = instance.parseExplain(true); t.is(data, 'EXPLAIN '); }); ava.test('parseSet', t => { const instance = getParserInstance(); const data = instance.parseSet({ name: 'lizheming' }); t.is(data, " SET `name`='lizheming'"); }); ava.test('parseSet, has extra value', t => { const instance = getParserInstance(); const data = instance.parseSet({ name: 'lizheming', value: ['array'] }); t.is(data, " SET `name`='lizheming'"); }); ava.test('parseSet, empty', t => { const instance = getParserInstance(); const data = instance.parseSet(); t.is(data, ''); }); ava.test('parseKey is function', t => { const instance = getParserInstance(); const key = instance.parseKey('key'); t.is(key, '`key`'); }); ava.test('parseKey is function 2', t => { const instance = getParserInstance(); const key = instance.parseKey('key()'); t.is(key, 'key()'); }); ava.test('parseValue, string', t => { const instance = getParserInstance(); const key = instance.parseValue('key'); t.is(key, "'key'"); }); ava.test('parseValue, array, exp', t => { const instance = getParserInstance(); const key = instance.parseValue(['exp', 'lizheming']); t.is(key, 'lizheming'); }); ava.test('parseValue, array, exp', t => { const instance = getParserInstance(); const key = instance.parseValue(['exp', 'lizhemi()ng']); t.is(key, 'lizhemi()ng'); }); ava.test('parseValue, null', t => { const instance = getParserInstance(); const key = instance.parseValue(null); t.is(key, 'null'); }); ava.test('parseValue, boolean, true', t => { const instance = getParserInstance(); const key = instance.parseValue(true); t.is(key, '1'); }); ava.test('parseValue, boolean, false', t => { const instance = getParserInstance(); const key = instance.parseValue(false); t.is(key, '0'); }); ava.test('parseValue, object', t => { const instance = getParserInstance(); const key = instance.parseValue({}); t.deepEqual(key, {}); }); ava.test('parseValue, buffer', t => { const instance = getParserInstance(); const key = instance.parseValue(Buffer.from([1, 2, 3, 4, 255])); t.is(key, "X'01020304ff'"); }); ava.test('parseField, empty', t => { const instance = getParserInstance(); const key = instance.parseField(); t.deepEqual(key, '*'); }); ava.test('parseField, empty array', t => { const instance = getParserInstance(); const key = instance.parseField([]); t.deepEqual(key, '*'); }); ava.test('parseField, empty object', t => { const instance = getParserInstance(); const key = instance.parseField({}); t.deepEqual(key, '*'); }); ava.test('parseField, single field', t => { const instance = getParserInstance(); const key = instance.parseField('name'); t.deepEqual(key, '`name`'); }); ava.test('parseField, string field with alias', t => { const instance = getParserInstance(); const key = instance.parseField('name', { alias: 'u' }); t.deepEqual(key, '`u`.`name`'); }); ava.test('parseField, single field with ()', t => { const instance = getParserInstance(); const key = instance.parseField('(name)'); t.deepEqual(key, '(name)'); }); ava.test('parseField, multi field', t => { const instance = getParserInstance(); const key = instance.parseField('name,title'); t.deepEqual(key, '`name`,`title`'); }); ava.test('parseField, multi field', t => { const instance = getParserInstance(); const key = instance.parseField('name, title'); t.deepEqual(key, '`name`,`title`'); }); ava.test('parseField, array', t => { const instance = getParserInstance(); const key = instance.parseField(['name', 'title'], { alias: 'u' }); t.deepEqual(key, '`u`.`name`,`u`.`title`'); }); ava.test('parseField, object', t => { const instance = getParserInstance(); const key = instance.parseField({ name: 'name', title1: 'title' }); t.deepEqual(key, '`name` AS `name`,`title1` AS `title`'); }); ava.test('parseTable, empty', t => { const instance = getParserInstance(); const key = instance.parseTable(); t.deepEqual(key, ''); }); ava.test('parseTable, string', t => { const instance = getParserInstance(); const key = instance.parseTable('user'); t.deepEqual(key, '`user`'); }); ava.test('parseTable, string with alias', t => { const instance = getParserInstance(); const key = instance.parseTable('user', { alias: 'u' }); t.deepEqual(key, '`user` AS u'); }); ava.test('parseTable, string, multi', t => { const instance = getParserInstance(); const key = instance.parseTable('user, group'); t.deepEqual(key, '`user`,`group`'); }); ava.test('parseTable, object', t => { const instance = getParserInstance(); const key = instance.parseTable({ user: 'user1', group: 'group1' }); t.deepEqual(key, '`user` AS `user1`,`group` AS `group1`'); }); ava.test('getLogic', t => { const instance = getParserInstance(); const key = instance.getLogic({}); t.deepEqual(key, 'AND'); }); ava.test('getLogic, has _logic', t => { const instance = getParserInstance(); const key = instance.getLogic({ _logic: 'OR' }); t.deepEqual(key, 'OR'); }); ava.test('getLogic, has _logic, error', t => { const instance = getParserInstance(); const key = instance.getLogic({ _logic: 'test' }); t.deepEqual(key, 'AND'); }); ava.test('getLogic, default is OR', t => { const instance = getParserInstance(); const key = instance.getLogic({}, 'OR'); t.deepEqual(key, 'OR'); }); ava.test('getLogic, string', t => { const instance = getParserInstance(); const key = instance.getLogic('AND', 'OR'); t.deepEqual(key, 'AND'); }); ava.test('getLogic, string, lowercase', t => { const instance = getParserInstance(); const key = instance.getLogic('and', 'OR'); t.deepEqual(key, 'AND'); }); ava.test('escapeString is function', t => { const instance = getParserInstance(); t.true(helper.isFunction(instance.escapeString)); }); ava.test('parseLock, empty', t => { const instance = getParserInstance(); const data = instance.parseLock(); t.is(data, ''); }); ava.test('parseLock, true', t => { const instance = getParserInstance(); const data = instance.parseLock(true); t.is(data, ' FOR UPDATE '); }); ava.test('parseDistinct, empty', t => { const instance = getParserInstance(); const data = instance.parseDistinct(); t.is(data, ''); }); ava.test('parseDistinct, true', t => { const instance = getParserInstance(); const data = instance.parseDistinct(true); t.is(data, ' DISTINCT'); }); ava.test('parseComment, empty', t => { const instance = getParserInstance(); const data = instance.parseComment(); t.is(data, ''); }); ava.test('parseComment, lizheming test', t => { const instance = getParserInstance(); const data = instance.parseComment('lizheming test'); t.is(data, ' /*lizheming test*/'); }); ava.test('parseHaving, empty', t => { const instance = getParserInstance(); const data = instance.parseHaving(); t.is(data, ''); }); ava.test('parseHaving, SUM(area)>1000000', t => { const instance = getParserInstance(); const data = instance.parseHaving('SUM(area)>1000000'); t.is(data, ' HAVING SUM(area)>1000000'); }); ava.test('parseGroup, empty', t => { const instance = getParserInstance(); const data = instance.parseGroup(); t.is(data, ''); }); ava.test('parseGroup, name', t => { const instance = getParserInstance(); const data = instance.parseGroup('name'); t.is(data, ' GROUP BY `name`'); }); ava.test('parseGroup, name', t => { const instance = getParserInstance(); const data = instance.parseGroup("date_format(create_time,'%Y-%m-%d')"); t.is(data, " GROUP BY date_format(create_time,'%Y-%m-%d')"); }); ava.test('parseGroup, name,title', t => { const instance = getParserInstance(); const data = instance.parseGroup('name, title'); t.is(data, ' GROUP BY `name`,`title`'); }); ava.test('parseGroup, user.name,title', t => { const instance = getParserInstance(); const data = instance.parseGroup(['user.name', 'title']); t.is(data, ' GROUP BY user.`name`,`title`'); }); ava.test('parseOrder, empty', t => { const instance = getParserInstance(); const data = instance.parseOrder(); t.is(data, ''); }); ava.test('parseOrder, array', t => { const instance = getParserInstance(); const data = instance.parseOrder(['name ASC', 'title DESC']); t.is(data, ' ORDER BY name ASC,title DESC'); }); ava.test('parseOrder, string', t => { const instance = getParserInstance(); const data = instance.parseOrder('name ASC,title DESC'); t.is(data, ' ORDER BY name ASC,title DESC'); }); ava.test('parseOrder, object', t => { const instance = getParserInstance(); const data = instance.parseOrder({ name: 'ASC', 'title': 'DESC' }); t.is(data, ' ORDER BY `name` ASC,`title` DESC'); }); ava.test('parseLimit, empty', t => { const instance = getParserInstance(); const data = instance.parseLimit(); t.is(data, ''); }); ava.test('parseLimit, 10', t => { const instance = getParserInstance(); const data = instance.parseLimit('10'); t.is(data, ' LIMIT 10'); }); ava.test('parseLimit, number', t => { const instance = getParserInstance(); const data = instance.parseLimit(10); t.is(data, ' LIMIT 10'); }); ava.test('parseLimit, 10, 20', t => { const instance = getParserInstance(); const data = instance.parseLimit('10, 20'); t.is(data, ' LIMIT 10,20'); }); ava.test('parseLimit, 10, lizheming', t => { const instance = getParserInstance(); const data = instance.parseLimit('10, lizheming'); t.is(data, ' LIMIT 10,0'); }); ava.test('parseLimit, [20, 10]', t => { const instance = getParserInstance(); const data = instance.parseLimit([20, 10]); t.is(data, ' LIMIT 20,10'); }); ava.test('parseJoin, empty', t => { const instance = getParserInstance(); const data = instance.parseJoin(); t.is(data, ''); }); ava.test('parseJoin, single string', t => { const instance = getParserInstance(); const data = instance.parseJoin('meinv_cate ON meinv_group.cate_id=meinv_cate.id'); t.is(data, ' LEFT JOIN meinv_cate ON meinv_group.cate_id=meinv_cate.id'); }); ava.test('parseJoin, multi string', t => { const instance = getParserInstance(); const data = instance.parseJoin(['meinv_cate ON meinv_group.cate_id=meinv_cate.id', 'RIGHT JOIN meinv_tag ON meinv_group.tag_id=meinv_tag.id']); t.is(data, ' LEFT JOIN meinv_cate ON meinv_group.cate_id=meinv_cate.id RIGHT JOIN meinv_tag ON meinv_group.tag_id=meinv_tag.id'); }); ava.test('parseJoin, array', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'cate', join: 'inner', as: 'c', on: ['cate_id', 'id'] }], { tablePrefix: '', table: 'user' }); t.is(data, ' INNER JOIN `cate` AS `c` ON `user`.`cate_id` = `c`.`id`'); }); ava.test('parseJoin, array', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'cate', join: 'inner', as: 'c', on: { 'user.cate_id': 'id', cate_id: ['EXP', ' > 100'] } }], { tablePrefix: '', table: 'user' }); t.is(data, ' INNER JOIN `cate` AS `c` ON (user.cate_id=`c`.`id` AND `user`.`cate_id` > 100)'); }); ava.test('parseJoin, array, no on', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'cate', join: 'inner', as: 'c' }], { tablePrefix: '', table: 'user' }); t.is(data, ' INNER JOIN `cate` AS `c`'); }); ava.test('parseJoin, array, no on table with .', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'db2.cate', join: 'inner', as: 'c' }], { tablePrefix: '', table: 'user' }); t.is(data, ' INNER JOIN db2.cate AS `c`'); }); ava.test('parseJoin, array, ignore not object', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'cate', join: 'inner', as: 'c' }, true], { tablePrefix: '', table: 'user' }); t.is(data, ' INNER JOIN `cate` AS `c`'); }); ava.test('parseJoin, array, multi', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'cate', join: 'left', as: 'c', on: ['cate_id', 'id'] }, { table: 'group_tag', join: 'left', as: 'd', on: ['id', 'group_id'] }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` AS `c` ON `user`.`cate_id` = `c`.`id` LEFT JOIN `group_tag` AS `d` ON `user`.`id` = `d`.`group_id`'); }); ava.test('parseJoin, array, multi 1', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ cate: { join: 'left', as: 'c', on: ['id', 'id'] }, group_tag: { join: 'left', as: 'd', on: ['id', 'group_id'] } }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` AS `c` ON `user`.`id` = `c`.`id` LEFT JOIN `group_tag` AS `d` ON `user`.`id` = `d`.`group_id`'); }); ava.test('parseJoin, array, multi 2', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ cate: { on: ['id', 'id'] }, group_tag: { on: ['id', 'group_id'] } }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` ON `user`.`id` = `cate`.`id` LEFT JOIN `group_tag` ON `user`.`id` = `group_tag`.`group_id`'); }); ava.test('parseJoin, array, multi 3', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ cate: { on: 'id, id' }, group_tag: { on: ['id', 'group_id'] }, tag: { on: { id: 'id', title: 'name' } } }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` ON `user`.`id` = `cate`.`id` LEFT JOIN `group_tag` ON `user`.`id` = `group_tag`.`group_id` LEFT JOIN `tag` ON (`user`.`id`=`tag`.`id` AND `user`.`title`=`tag`.`name`)'); }); ava.test('parseJoin, array, multi 4, on has table name', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ cate: { on: 'id, id' }, group_tag: { on: ['id', 'group_id'] }, tag: { on: { id: 'id', title: 'tag.name' } } }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` ON `user`.`id` = `cate`.`id` LEFT JOIN `group_tag` ON `user`.`id` = `group_tag`.`group_id` LEFT JOIN `tag` ON (`user`.`id`=`tag`.`id` AND `user`.`title`=tag.name)'); }); ava.test('parseJoin, array, multi 4, on has table name 1', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ cate: { on: 'id, id' }, group_tag: { on: ['id', 'group_id'] }, tag: { on: { id: 'id', title: '`tag`.`name`' } } }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` ON `user`.`id` = `cate`.`id` LEFT JOIN `group_tag` ON `user`.`id` = `group_tag`.`group_id` LEFT JOIN `tag` ON (`user`.`id`=`tag`.`id` AND `user`.`title`=`tag`.`name`)'); }); ava.test('parseJoin, array, multi 4', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ cate: { on: 'id, id' }, group_tag: { on: ['id', 'group_id'] }, tag: { on: { id: 'id', 'u1.title': 'tag.name' } } }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN `cate` ON `user`.`id` = `cate`.`id` LEFT JOIN `group_tag` ON `user`.`id` = `group_tag`.`group_id` LEFT JOIN `tag` ON (`user`.`id`=`tag`.`id` AND u1.title=tag.name)'); }); ava.test('parseJoin, array, table is sql', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'SELECT * FROM test WHERE 1=1', join: 'left', as: 'temp', on: ['id', 'temp.team_id'] }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN (SELECT * FROM test WHERE 1=1) AS `temp` ON `user`.`id` = temp.team_id'); }); ava.test('parseJoin, array, table is sql 1', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'SELECT * FROM test WHERE 1=1', join: 'left', as: 'temp', on: ['u.id', 'temp.team_id'] }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN (SELECT * FROM test WHERE 1=1) AS `temp` ON u.id = temp.team_id'); }); ava.test('parseJoin, array, table is sql 2', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: 'SELECT * FROM test WHERE 1=1', join: 'left', as: 'temp', on: ['id', 'team_id'] }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN (SELECT * FROM test WHERE 1=1) AS `temp` ON `user`.`id` = `temp`.`team_id`'); }); ava.test('parseJoin, array, table is sql 3', t => { const instance = getParserInstance(); const data = instance.parseJoin([{ table: '(SELECT * FROM test WHERE 1=1)', join: 'left', as: 'temp', on: ['id', 'team_id'] }], { tablePrefix: '', table: 'user' }); t.is(data, ' LEFT JOIN (SELECT * FROM test WHERE 1=1) AS `temp` ON `user`.`id` = `temp`.`team_id`'); }); ava.test('parseThinkWhere, key is empty, ignore valud', t => { const instance = getParserInstance(); const data = instance.parseThinkWhere('', 'SELECT * FROM user'); t.is(data, ''); }); ava.test('parseThinkWhere, _string', t => { const instance = getParserInstance(); const data = instance.parseThinkWhere('_string', 'SELECT * FROM user'); t.is(data, 'SELECT * FROM user'); }); ava.test('parseThinkWhere, _query', t => { const instance = getParserInstance(); const data = instance.parseThinkWhere('_query', 'name=lizheming&name1=suredy'); t.is(data, '`name` = \'lizheming\' AND `name1` = \'suredy\''); }); ava.test('parseThinkWhere, _query, with logic', t => { const instance = getParserInstance(); const data = instance.parseThinkWhere('_query', 'name=lizheming&name1=suredy&_logic=OR'); t.is(data, '`name` = \'lizheming\' OR `name1` = \'suredy\''); }); ava.test('parseThinkWhere, _query, object', t => { const instance = getParserInstance(); const data = instance.parseThinkWhere('_query', { name: 'lizheming', name1: 'suredy' }); t.is(data, '`name` = \'lizheming\' AND `name1` = \'suredy\''); }); ava.test('parseWhere, empty', t => { const instance = getParserInstance(); const data = instance.parseWhere(); t.is(data, ''); }); ava.test('parseWhere, empty 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ _logic: 'AND' }); t.is(data, ''); }); ava.test('parseWhere, 1=1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ 1: 1 }); t.is(data, ' WHERE ( 1 = 1 )'); }); ava.test('parseWhere, key is not valid', t => { const instance = getParserInstance(); try { instance.parseWhere({ '&*&*&*': 'title' }); t.fail('parseWhere fail without error when key is not valid'); } catch (e) { t.pass(); } }); ava.test('parseWhere, string & object', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: 'lizheming', _string: 'status=1' }); t.is(data, ' WHERE ( `title` = \'lizheming\' ) AND ( status=1 )'); }); ava.test('parseWhere, null', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: null }); t.is(data, ' WHERE ( `title` IS NULL )'); }); ava.test('parseWhere, null 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: { '=': null } }); t.is(data, ' WHERE ( `title` IS NULL )'); }); ava.test('parseWhere, null 2', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: ['=', null] }); t.is(data, ' WHERE ( `title` IS NULL )'); }); ava.test('parseWhere, not null', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: { '!=': null } }); t.is(data, ' WHERE ( `title` IS NOT NULL )'); }); ava.test('parseWhere, not null 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: ['!=', null] }); t.is(data, ' WHERE ( `title` IS NOT NULL )'); }); ava.test('parseWhere, object', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: 10 }); t.is(data, ' WHERE ( `id` = 10 )'); }); ava.test('parseWhere, object IN number', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: { IN: [1, 2, 3] } }); t.is(data, ' WHERE ( `id` IN (1, 2, 3) )'); }); ava.test('parseWhere, IN number string', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: [1, 2, 3] }); t.is(data, ' WHERE ( `id` IN ( 1, 2, 3 ) )'); }); ava.test('parseWhere, object 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: [1, 10, 'string'] }); t.is(data, ' WHERE ( (`id` = 1) AND (`id` = 10) AND (`id` = \'string\') )'); }); ava.test('parseWhere, IN number string', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['1', '2', '3'] }); t.is(data, ' WHERE ( `id` IN ( 1, 2, 3 ) )'); }); ava.test('parseWhere, object IN number string', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: { IN: ['1', '2', '3'] } }); t.is(data, ' WHERE ( `id` IN (\'1\', \'2\', \'3\') )'); }); ava.test('parseWhere, object 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['!=', 10] }); t.is(data, ' WHERE ( `id` != 10 )'); }); ava.test('parseWhere, string', t => { const instance = getParserInstance(); const data = instance.parseWhere('id = 10 OR id < 2'); t.is(data, ' WHERE id = 10 OR id < 2'); }); ava.test('parseWhere, EXP', t => { const instance = getParserInstance(); const data = instance.parseWhere({ name: ['EXP', "='name'"] }); t.is(data, ' WHERE ( (`name` =\'name\') )'); }); ava.test('parseWhere, EXP 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ view_nums: ['EXP', '=view_nums+1'] }); t.is(data, ' WHERE ( (`view_nums` =view_nums+1) )'); }); ava.test('parseWhere, LIKE', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: ['NOTLIKE', 'lizheming'] }); t.is(data, ' WHERE ( `title` NOT LIKE \'lizheming\' )'); }); ava.test('parseWhere, LIKE 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: ['like', '%lizheming%'] }); t.is(data, ' WHERE ( `title` LIKE \'%lizheming%\' )'); }); ava.test('parseWhere, LIKE 2', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: ['like', ['lizheming', 'suredy']] }); t.is(data, ' WHERE ( (`title` LIKE \'lizheming\' OR `title` LIKE \'suredy\') )'); }); ava.test('parseWhere, LIKE 3', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: ['like', ['lizheming', 'suredy'], 'AND'] }); t.is(data, ' WHERE ( (`title` LIKE \'lizheming\' AND `title` LIKE \'suredy\') )'); }); ava.test('parseWhere, key has |', t => { const instance = getParserInstance(); const data = instance.parseWhere({ 'title|content': ['like', '%lizheming%'] }); t.is(data, ' WHERE ( (`title` LIKE \'%lizheming%\') OR (`content` LIKE \'%lizheming%\') )'); }); ava.test('parseWhere, key has |, multi', t => { const instance = getParserInstance(); const data = instance.parseWhere({ 'title|content': [ ['like', '%title%'], ['=', '%content%'] ], _multi: true }); t.is(data, ' WHERE ( (`title` LIKE \'%title%\') OR (`content` = \'%content%\') )'); }); ava.test('parseWhere, key has |, multi', t => { const instance = getParserInstance(); const data = instance.parseWhere({ 'title|content': [ ['like', '%title%'], ['=', '%content%'] ], _multi: true }); t.is(data, ' WHERE ( (`title` LIKE \'%title%\') OR (`content` = \'%content%\') )'); }); ava.test('parseWhere, key has &', t => { const instance = getParserInstance(); const data = instance.parseWhere({ 'title&content': ['like', '%lizheming%'] }); t.is(data, ' WHERE ( (`title` LIKE \'%lizheming%\') AND (`content` LIKE \'%lizheming%\') )'); }); ava.test('parseWhere, key has &, multi', t => { const instance = getParserInstance(); const data = instance.parseWhere({ 'title&content': [ ['like', '%lizheming%'], ['!=', '%content%'] ], _multi: true }); t.is(data, ' WHERE ( (`title` LIKE \'%lizheming%\') AND (`content` != \'%content%\') )'); }); ava.test('parseWhere, IN', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['IN', '10,20'] }); t.is(data, ' WHERE ( `id` IN (\'10\',\'20\') )'); }); ava.test('parseWhere, IN 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['IN', [10, 20]] }); t.is(data, ' WHERE ( `id` IN (10,20) )'); }); ava.test('parseWhere, IN 2', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['NOTIN', [10, 20]] }); t.is(data, ' WHERE ( `id` NOT IN (10,20) )'); }); ava.test('parseWhere, NOT IN, only one', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['NOTIN', 10] }); t.is(data, ' WHERE ( `id` != 10 )'); }); ava.test('parseWhere, IN, only one', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['IN', 10] }); t.is(data, ' WHERE ( `id` = 10 )'); }); ava.test('parseWhere, IN, object', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: { IN: [1, 2, 3] } }); t.is(data, ' WHERE ( `id` IN (1, 2, 3) )'); }); ava.test('parseWhere, IN, has exp', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['NOTIN', '(10,20,30)', 'exp'] }); t.is(data, ' WHERE ( `id` NOT IN (10,20,30) )'); }); ava.test('parseWhere, multi fields', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: 10, title: 'www' }); t.is(data, ' WHERE ( `id` = 10 ) AND ( `title` = \'www\' )'); }); ava.test('parseWhere, multi fields 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: 10, title: 'www', _logic: 'OR' }); t.is(data, ' WHERE ( `id` = 10 ) OR ( `title` = \'www\' )'); }); ava.test('parseWhere, multi fields 2', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: 10, title: 'www', _logic: 'XOR' }); t.is(data, ' WHERE ( `id` = 10 ) XOR ( `title` = \'www\' )'); }); ava.test('parseWhere, BETWEEN', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['BETWEEN', 1, 2] }); t.is(data, ' WHERE ( (`id` BETWEEN 1 AND 2) )'); }); ava.test('parseWhere, BETWEEN', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['BETWEEN', '2017-04-13 00:00:00', '2017-04-19 00:00:00'] }); t.is(data, ' WHERE ( (`id` BETWEEN \'2017-04-13 00:00:00\' AND \'2017-04-19 00:00:00\') )'); }); ava.test('parseWhere, BETWEEN', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['between', '1,2'] }); t.is(data, ' WHERE ( (`id` BETWEEN \'1\' AND \'2\') )'); }); ava.test('parseWhere, error', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: ['not between', '1,2'] }); t.is(data, ' WHERE ( (`id` NOT BETWEEN \'1\' AND \'2\') )'); }); ava.test('parseWhere, complex', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: { '>': 10, '<': 20 } }); t.is(data, ' WHERE ( `id` > 10 AND `id` < 20 )'); }); ava.test('parseWhere, complex 1', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: { '>': 10, '<': 20, _logic: 'OR' } }); t.is(data, ' WHERE ( `id` > 10 OR `id` < 20 )'); }); ava.test('parseWhere, complex 2', t => { const instance = getParserInstance(); const data = instance.parseWhere({ id: { '>=': 10, '<=': 20 }, 'title': ['like', '%lizheming%'], date: ['>', '2014-08-12'], _logic: 'OR' }); t.is(data, ' WHERE ( `id` >= 10 AND `id` <= 20 ) OR ( `title` LIKE \'%lizheming%\' ) OR ( `date` > \'2014-08-12\' )'); }); ava.test('parseWhere, complex 3', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: 'test', _complex: { id: ['IN', [1, 2, 3]], content: 'www', _logic: 'or' } }); t.is(data, ' WHERE ( `title` = \'test\' ) AND ( ( `id` IN (1,2,3) ) OR ( `content` = \'www\' ) )'); }); ava.test('parseWhere, complex 4', t => { const instance = getParserInstance(); const data = instance.parseWhere({ _complex: [ { id: ['IN', [1, 2, 3]], content: 'www', _logic: 'or' }, { name: 'lizheming', email: 'lizheming@163.com', _logic: 'or', _complex: [ { admin: true, status: 0, _logic: 'and' }, { status: 1, ip: '127.0.0.1', _logic: 'or' } ] } ] }); t.is(data, ' WHERE ( ( `id` IN (1,2,3) ) OR ( `content` = \'www\' ) ) AND ( ( `name` = \'lizheming\' ) OR ( `email` = \'lizheming@163.com\' ) OR ( ( `admin` = 1 ) AND ( `status` = 0 ) ) OR ( ( `status` = 1 ) OR ( `ip` = \'127.0.0.1\' ) ) )'); }); ava.test('parseWhere, complex 5', t => { const instance = getParserInstance(); const data = instance.parseWhere({ _logic: 'or', _complex: [ { start_date: ['<=', '2017-01-01'], end_date: ['>=', '2017-01-01'] }, { start_date: ['<=', '2017-01-01'], end_date: ['>=', '2017-01-01'] } ] }); t.is(data, ' WHERE ( ( `start_date` <= \'2017-01-01\' ) AND ( `end_date` >= \'2017-01-01\' ) ) OR ( ( `start_date` <= \'2017-01-01\' ) AND ( `end_date` >= \'2017-01-01\' ) )'); }); ava.test('parseWhere, other', t => { const instance = getParserInstance(); try { instance.parseWhere({ title: ['OTHER', 'dd'] }); t.fail('parseWhere fail without error when other data'); } catch (e) { t.pass(); } }); ava.test('parseWhere, array', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: [ ['exp', '= \'lizheming\''] ] }); t.is(data, ' WHERE ( (`title` = \'lizheming\') )'); }); ava.test('parseWhere, array, multi', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: [ ['exp', '= \'lizheming\''], ['=', 'suredy'] ] }); t.is(data, ' WHERE ( (`title` = \'lizheming\') AND (`title` = \'suredy\') )'); }); ava.test('parseWhere, array, multi, or', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: [ ['exp', '= \'lizheming\''], ['=', 'suredy'], 'OR' ] }); t.is(data, ' WHERE ( (`title` = \'lizheming\') OR (`title` = \'suredy\') )'); }); ava.test('parseWhere, array, multi, or', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: [ ['exp', '= \'lizheming\''], ['!=', 'suredy'], 'OR' ] }); t.is(data, ' WHERE ( (`title` = \'lizheming\') OR (`title` != \'suredy\') )'); }); ava.test('parseWhere, array, multi, or', t => { const instance = getParserInstance(); const data = instance.parseWhere({ title: [ ['exp', '= \'lizheming\''], 'suredy', 'OR' ] }); t.is(data, ' WHERE ( (`title` = \'lizheming\') OR (`title` = \'suredy\') )'); }); ava.test('buildSelectSql', t => { const instance = getParserInstance(); const data = instance.buildSelectSql({ table: 'user', where: { id: 11, title: 'lizheming' }, group: 'name', field: 'name,title', order: 'name DESC', limit: '10, 20', distinct: true }); t.is(data, "SELECT DISTINCT `name`,`title` FROM `user` WHERE ( `id` = 11 ) AND ( `title` = 'lizheming' ) GROUP BY `name` ORDER BY name DESC LIMIT 10,20"); }); ava.test('parseSql', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseSql('SELECT * FROM __USER__ WHERE name=1'); t.is(data, 'SELECT * FROM `think_user` WHERE name=1'); }); ava.test('parseSql 1', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseSql('SELECT * FROM __USER__ WHERE name=\'%TEST%\''); t.is(data, 'SELECT * FROM `think_user` WHERE name=\'%TEST%\''); }); ava.test('parseUnion, empty', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseUnion(); t.is(data, ''); }); ava.test('parseUnion, string', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseUnion('SELECT * FROM meinv_pic2'); t.is(data, ' UNION (SELECT * FROM meinv_pic2)'); }); ava.test('parseUnion, object', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseUnion({ table: 'meinv_pic2' }); t.is(data, ' UNION (SELECT * FROM `meinv_pic2`)'); }); ava.test('parseUnion, object', t => { const instance = new Parser({ prefix: 'think_' }); const data = instance.parseUnion({ table: 'meinv_pic2' }); t.is(data, ' UNION (SELECT * FROM meinv_pic2)'); }); ava.test('parseUnion, array', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseUnion([{ union: { table: 'meinv_pic2' }, all: true }]); t.is(data, ' UNION ALL (SELECT * FROM `meinv_pic2`)'); }); ava.test('parseUnion, array', t => { const instance = getParserInstance({ prefix: 'think_' }); const data = instance.parseUnion([{ union: 'SELECT * FROM meinv_pic2' }]); t.is(data, ' UNION (SELECT * FROM meinv_pic2)'); }); ava.test('buildInsertSql', t => { const instance = getParserInstance(); const sql = instance.buildInsertSql({ table: 'user', values: '1,lizheming', fields: 'id,name', replace: true }); t.is(sql, 'REPLACE INTO `user` (id,name) VALUES (1,lizheming)'); }); ava.test('buildInsertSql 2', t => { const instance = getParserInstance(); const sql = instance.buildInsertSql({ table: 'user', values: '1,lizheming', fields: 'id,name', ignore: true }); t.is(sql, 'INSERT IGNORE INTO `user` (id,name) VALUES (1,lizheming)'); }); ava.test('buildInsertSql 3', t => { const instance = getParserInstance(); const sql = instance.buildInsertSql({ table: 'user', values: '1,lizheming', fields: 'id,name', replace: true, ignore: true }); t.is(sql, 'REPLACE INTO `user` (id,name) VALUES (1,lizheming)'); });