UNPKG

fly-json-odm

Version:

An Object Document Mapper to handle JSON on the fly for NodeJS or Browser

1,454 lines (1,311 loc) 66.9 kB
/* global describe it */ 'use strict'; const assert = require('assert'); const FlyJson = require('../src/flyjson.js'); const data1 = [ { user_id: 1, name: 'budi', age: 10 }, { user_id: 5, name: 'wawan', age: 20 }, { user_id: 3, name: 'tono', age: 30 } ]; const data2 = [ { id: 1, address: 'bandung', email: 'a@b.com' }, { id: 2, address: 'jakarta', email: 'c@d.com' }, { id: 3, address: 'solo', email: 'e@f.com' }, { id: 4, address: 'solo, balapan', email: 'g@h.com' }, { id: 5, address: 'surabaya', email: 'i@j.com' } ]; const data2insert = [ { id: 6, address: 'madiun', email: 'madiun@yahoo.com' }, { id: 7, address: 'malang', email: 'malang@gmail.com' } ]; const data2update = [ { id: 3, address: 'solo', email: 'solo@yahoo.com' }, { id: 4, address: 'solo, balapan', email: 'balapan@gmail.com' } ]; const data2updatereverse = [ { id: 4, address: 'solo, balapan', email: 'balapan@gmail.com' }, { id: 3, address: 'solo', email: 'solo@yahoo.com' } ]; // const data2modify = [ // { id: 3, email: 'solo@yahoo.com', about: 'I was born in solo' }, // { id: 4, email: 'balapan@gmail.com', about: 'Balapan city is the best', located: 'Central Java' } // ]; const data2modifyreverse = [ { id: 4, email: 'balapan@gmail.com', about: 'Balapan city is the best', located: 'Central Java' }, { id: 3, email: 'solo@yahoo.com', about: 'I was born in solo' } ]; const data3 = [ { id: 1, bio: 'I was born in bandung', phone: 'a@b.com' }, { id: 2, bio: 'I was born in jakarta', phone: 'c@d.com' }, { id: 3, bio: 'I was born in solo', phone: 'e@f.com' }, { id: 4, bio: 'I was born in semarang', phone: 'g@h.com' }, { id: 5, bio: 'I was born in surabaya', phone: 'i@j.com' } ]; const data4 = [ { brand: 'Audi', color: 'black', stock: 32 }, { brand: 'Audi', color: 'white', stock: 76 }, { brand: 'Ferarri', color: 'red', stock: 8 }, { brand: 'Ford', color: 'white', stock: 49 }, { brand: 'Peugot', color: 'white', stock: 23 } ]; const data5 = [ { id: 1, title: 'this is my first post', tags: ['News', 'nodejs', 'tech', 224, null, { type: 'hi' }] }, { id: 2, title: 'this is my second post', tags: ['tutorial', 'linux', 'tech', 234, null, { type: 'moderate' }] }, { id: 3, title: 'this is my third post', tags: ['News', 'info', 'tech', 244, null, { type: 'low' }] } ]; const data6 = [ { id: 1, title: 'this is my first post', category: { id: 1, name: 'news' } }, { id: 2, title: 'this is my second post', category: { id: 4, name: 'Tutorial' } }, { id: 3, title: 'this is my third post', category: { id: 2, name: 'tech' } } ]; const data7 = [ { id: 1, name: 'AAA', created: '2019-10-01 00:02:33' }, { id: 2, name: 'BBB', created: '2019-10-02 01:52:53' }, { id: 3, name: 'CCC', created: '2019-10-03 02:42:43' }, { id: 4, name: 'DDD', created: '2019-10-04 03:32:13' }, { id: 5, name: 'EEE', created: '2019-10-05 04:22:13' }, { id: 6, name: 'FFF', created: '2019-10-06 05:12:33' }, { id: 7, name: 'GGG', created: '2019-10-07 06:02:03' } ]; const data8 = [ { id: 1, name: 'AAA', created: '2019-10-01 00:02:33' }, { id: 1, name: 'AAA', created: '2019-10-01 00:02:33' }, { id: 1, name: 'BBB', created: '2019-10-01 00:02:33' }, { id: 4, name: 'DDD', created: '2019-10-04 03:32:13' }, { id: 4, name: 'DDD', created: '2019-10-04 03:32:13' }, { id: 7, name: 'GGG', created: '2019-10-07 06:02:03' }, { id: 7, name: 'GGG', created: '2019-10-07 06:02:03' } ]; const data9 = [ { id: 1, title: 'this is my first post', tags: null }, { id: 2, title: 'this is my second post', tags: ['tutorial', 'linux', 'tech', 234, null, { type: 'moderate' }] }, { id: 3, title: 'this is my third post', tags: ['News', 'info', 'tech', 244, null, { type: 'low' }] } ]; const data10 = [ { id: 1, title: 'this is my first post', category: { id: 1, name: null } }, { id: 2, title: 'this is my second post', category: { id: 4, name: 'Tutorial' } }, { id: 3, title: 'this is my third post', category: { id: 2, name: 'tech' } } ]; const data11 = [ { name: 'budi', address: 'jakarta' }, { name: 'tono', address: 'solo' } ]; const data12 = [ { state: 'kampung tengah', address: 'jakarta' }, { state: 'kramat jati', address: 'jakarta' }, { state: 'kampung gedong', address: 'Jakarta' }, { state: 'manahan', address: 'solo' } ]; const data13 = [ { name: 'budi', group: 1 }, { name: 'tono', group: 2 } ]; const data14 = [ { group: 1, state: 'kampung tengah', address: 'jakarta' }, { group: 1, state: 'kramat jati', address: 'jakarta' }, { group: '1', state: 'kampung gedong', address: 'Jakarta' }, { group: 2, state: 'manahan', address: 'solo' } ]; const data15 = [ { id: 1, level: 'medium', group: [{ category: 'Arcade' }] }, { id: 3, level: 'hard', group: [] }, { id: 5, level: 'easy', group: [{ category: 'Strategy' }] } ]; const data16 = [ { id: 1, level: 'medium', group: { category: 'Arcade' } }, { id: 3, level: 'hard', group: {} }, { id: 5, level: 'easy', group: { category: 'Strategy' } } ]; const advancedsearch = [ { id: 1, level: 'medium', team: [{ name: 'Giant' }, { name: 'suneo' }, { name: 'nobita' }] }, { id: 3, level: 'hard', team: [{ name: 'giant2' }, { name: 'shizuka' }, { name: 'nobita' }] }, { id: 5, level: 'easy', team: [{ name: 'nobita' }, { name: '2suneo' }] } ]; describe('normal / synchronous CRUD test', function () { this.timeout(10000); it('insert data', function () { const nosql = new FlyJson(); const data = nosql.set(data2).insert({ id: 6, address: 'madiun', email: 'i@j.com' }).exec(); assert.strictEqual(data.length, 6); assert.strictEqual(data[5].id, 6); assert.strictEqual(data[5].address, 'madiun'); assert.strictEqual(data[5].email, 'i@j.com'); }); it('insert data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2).insert({ id: 6, address: 'madiun', email: 'i@j.com' }).exec(); assert.strictEqual(data.length, 6); assert.strictEqual(data[5].id, 6); assert.strictEqual(data[5].address, 'madiun'); assert.strictEqual(data[5].email, 'i@j.com'); }); it('multiple insert data', function () { const nosql = new FlyJson(); const data = nosql.set(data2); for (let i = 6; i < 9; i++) { data.insert({ id: i, address: 'madiun', email: 'i@j.com' }); } const result = data.exec(); assert.strictEqual(result.length, 8); for (let x = 5, y = 6; x < 8; x++, y++) { assert.strictEqual(result[x].id, y); assert.strictEqual(result[x].address, 'madiun'); assert.strictEqual(result[x].email, 'i@j.com'); } }); it('multiple insert data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2); for (let i = 6; i < 9; i++) { data.insert({ id: i, address: 'madiun', email: 'i@j.com' }); } const result = data.exec(); assert.strictEqual(result.length, 8); for (let x = 5, y = 6; x < 8; x++, y++) { assert.strictEqual(result[x].id, y); assert.strictEqual(result[x].address, 'madiun'); assert.strictEqual(result[x].email, 'i@j.com'); } }); it('insert many data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .insertMany(data2insert).exec(); assert.strictEqual(data.length, 7); assert.strictEqual(data[5].id, 6); assert.strictEqual(data[5].address, 'madiun'); assert.strictEqual(data[5].email, 'madiun@yahoo.com'); assert.strictEqual(data[6].id, 7); assert.strictEqual(data[6].address, 'malang'); assert.strictEqual(data[6].email, 'malang@gmail.com'); }); it('insert many data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .insertMany(data2insert).exec(); assert.strictEqual(data.length, 7); assert.strictEqual(data[5].id, 6); assert.strictEqual(data[5].address, 'madiun'); assert.strictEqual(data[5].email, 'madiun@yahoo.com'); assert.strictEqual(data[6].id, 7); assert.strictEqual(data[6].address, 'malang'); assert.strictEqual(data[6].email, 'malang@gmail.com'); }); it('update data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .update('id', 5, { address: 'ponorogo', email: 'xxx@gmail.com' }) .exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[4].id, 5); assert.strictEqual(data[4].address, 'ponorogo'); assert.strictEqual(data[4].email, 'xxx@gmail.com'); }); it('update data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .update('id', 5, { address: 'ponorogo', email: 'xxx@gmail.com' }) .exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[4].id, 5); assert.strictEqual(data[4].address, 'ponorogo'); assert.strictEqual(data[4].email, 'xxx@gmail.com'); }); it('multiple update data', function () { const nosql = new FlyJson(); const data = nosql.set(data2); for (let i = 0; i < 3; i++) { data.update('id', i, { address: 'ponorogo', email: 'xxx@gmail.com' }); } const result = data.exec(); assert.strictEqual(result.length, 5); assert.strictEqual(result[3].id, 1); assert.strictEqual(result[3].address, 'ponorogo'); assert.strictEqual(result[3].email, 'xxx@gmail.com'); assert.strictEqual(result[4].id, 2); assert.strictEqual(result[4].address, 'ponorogo'); assert.strictEqual(result[4].email, 'xxx@gmail.com'); }); it('multiple update data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2); for (let i = 0; i < 3; i++) { data.update('id', i, { address: 'ponorogo', email: 'xxx@gmail.com' }); } const result = data.exec(); assert.strictEqual(result.length, 5); assert.strictEqual(result[3].id, 1); assert.strictEqual(result[3].address, 'ponorogo'); assert.strictEqual(result[3].email, 'xxx@gmail.com'); assert.strictEqual(result[4].id, 2); assert.strictEqual(result[4].address, 'ponorogo'); assert.strictEqual(result[4].email, 'xxx@gmail.com'); }); it('update many data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .updateMany('id', data2update).exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[2].email, 'solo@yahoo.com'); assert.strictEqual(data[3].email, 'balapan@gmail.com'); }); it('update many data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .updateMany('id', data2update).exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[2].email, 'solo@yahoo.com'); assert.strictEqual(data[3].email, 'balapan@gmail.com'); }); it('update many data reverse', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .updateMany('id', data2updatereverse).exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[2].email, 'solo@yahoo.com'); assert.strictEqual(data[3].email, 'balapan@gmail.com'); }); it('update many data reverse [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .updateMany('id', data2updatereverse).exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[2].email, 'solo@yahoo.com'); assert.strictEqual(data[3].email, 'balapan@gmail.com'); }); it('modify data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .modify('id', 5, { address: 'ponorogo', email: 'xxx@gmail.com', about: 'Just ordinary programmer' }) .exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[4].id, 5); assert.strictEqual(data[4].address, 'ponorogo'); assert.strictEqual(data[4].email, 'xxx@gmail.com'); }); it('modify data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .modify('id', 5, { address: 'ponorogo', email: 'xxx@gmail.com', about: 'Just ordinary programmer' }) .exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[4].id, 5); assert.strictEqual(data[4].address, 'ponorogo'); assert.strictEqual(data[4].email, 'xxx@gmail.com'); }); it('multiple modify data', function () { const nosql = new FlyJson(); const data = nosql.set(data2); for (let i = 0; i < 3; i++) { data.modify('id', i, { address: 'ponorogo', email: 'xxx@gmail.com', about: 'Just ordinary programmer' }); } const result = data.exec(); assert.strictEqual(result.length, 5); assert.strictEqual(result[3].id, 1); assert.strictEqual(result[3].address, 'ponorogo'); assert.strictEqual(result[3].email, 'xxx@gmail.com'); assert.strictEqual(result[4].id, 2); assert.strictEqual(result[4].address, 'ponorogo'); assert.strictEqual(result[4].email, 'xxx@gmail.com'); }); it('multiple modify data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2); for (let i = 0; i < 3; i++) { data.modify('id', i, { address: 'ponorogo', email: 'xxx@gmail.com', about: 'Just ordinary programmer' }); } const result = data.exec(); assert.strictEqual(result.length, 5); assert.strictEqual(result[3].id, 1); assert.strictEqual(result[3].address, 'ponorogo'); assert.strictEqual(result[3].email, 'xxx@gmail.com'); assert.strictEqual(result[4].id, 2); assert.strictEqual(result[4].address, 'ponorogo'); assert.strictEqual(result[4].email, 'xxx@gmail.com'); }); it('modify many data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .modifyMany('id', data2modifyreverse).exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[2].about, 'I was born in solo'); assert.strictEqual(data[3].about, 'Balapan city is the best'); assert.strictEqual(data[3].located, 'Central Java'); }); it('modify many data [shallow is not allowed]', function () { const nosql = new FlyJson(); assert.throws(() => { nosql.setMode('shallow').set(data2) .modifyMany('id', data2modifyreverse).exec(); }, Error); }); it('modify many data reverse', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .modifyMany('id', data2modifyreverse).exec(); assert.strictEqual(data.length, 5); assert.strictEqual(data[2].about, 'I was born in solo'); assert.strictEqual(data[3].about, 'Balapan city is the best'); assert.strictEqual(data[3].located, 'Central Java'); }); it('modify many data reverse [shallow is not allowed]', function () { const nosql = new FlyJson(); assert.throws(() => { nosql.setMode('shallow').set(data2) .modifyMany('id', data2modifyreverse).exec(); }, Error); }); it('delete data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .delete('id', 5) .exec(); assert.strictEqual(data.length, 4); assert.strictEqual(data[3].id, 4); assert.strictEqual(data[3].address, 'solo, balapan'); assert.strictEqual(data[3].email, 'g@h.com'); }); it('delete data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .delete('id', 5) .exec(); assert.strictEqual(data.length, 4); assert.strictEqual(data[3].id, 4); assert.strictEqual(data[3].address, 'solo, balapan'); assert.strictEqual(data[3].email, 'g@h.com'); }); it('multiple delete data', function () { const nosql = new FlyJson(); const data = nosql.set(data2); for (let i = 1; i < 4; i++) { data.delete('id', i); } const result = data.exec(); assert.strictEqual(result.length, 2); assert.strictEqual(result[0].id, 4); assert.strictEqual(result[0].address, 'solo, balapan'); assert.strictEqual(result[0].email, 'g@h.com'); assert.strictEqual(result[1].id, 5); assert.strictEqual(result[1].address, 'surabaya'); assert.strictEqual(result[1].email, 'i@j.com'); }); it('multiple delete data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2); for (let i = 1; i < 4; i++) { data.delete('id', i); } const result = data.exec(); assert.strictEqual(result.length, 2); assert.strictEqual(result[0].id, 4); assert.strictEqual(result[0].address, 'solo, balapan'); assert.strictEqual(result[0].email, 'g@h.com'); assert.strictEqual(result[1].id, 5); assert.strictEqual(result[1].address, 'surabaya'); assert.strictEqual(result[1].email, 'i@j.com'); }); it('delete many data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .deleteMany('id', [2, 5]) .exec(); assert.strictEqual(data.length, 3); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[2].id, 4); }); it('delete many data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .deleteMany('id', [2, 5]) .exec(); assert.strictEqual(data.length, 3); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[2].id, 4); }); it('delete many data reverse', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .deleteMany('id', [5, 2]) .exec(); assert.strictEqual(data.length, 3); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[2].id, 4); }); it('delete many data reverse [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .deleteMany('id', [5, 2]) .exec(); assert.strictEqual(data.length, 3); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[2].id, 4); }); }); describe('normal / synchronous Query test', function () { this.timeout(10000); it('select data', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .select(['id', 'address']) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 2); assert.strictEqual(data[2].id, 3); assert.strictEqual(data[3].id, 4); assert.strictEqual(data[4].id, 5); }); it('select data + distinct', function () { const nosql = new FlyJson(); const data = nosql.set(data8) .select(['id', 'name', 'created']) .distinct() .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 1); assert.strictEqual(data[2].id, 4); assert.strictEqual(data[3].id, 7); }); it('select data + distinct by fieldname', function () { const nosql = new FlyJson(); const data = nosql.set(data8) .select(['id', 'name', 'created']) .distinct('id') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 4); assert.strictEqual(data[2].id, 7); }); it('select data + distinct by wrong fieldname', function () { const nosql = new FlyJson(); const data = nosql.set(data8) .select(['id', 'name', 'created']) .distinct('omg') .exec(); assert.strictEqual(data.length, 0); }); it('select data [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .select(['id', 'address']) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 2); assert.strictEqual(data[2].id, 3); assert.strictEqual(data[3].id, 4); assert.strictEqual(data[4].id, 5); }); it('select + where', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .select(['id', 'address']) .where('address', 'jakarta') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].address, 'jakarta'); }); it('select + where [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .select(['id', 'address']) .where('address', 'jakarta') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].address, 'jakarta'); }); it('select + where (case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data4) .select(['brand', 'color', 'stock']) .where('brand', '==', 'audi', false) .exec(); assert.strictEqual(data[0].brand, 'Audi'); assert.strictEqual(data[1].brand, 'Audi'); }); it('select + where (case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data4) .select(['brand', 'color', 'stock']) .where('brand', '==', 'audi', false) .exec(); assert.strictEqual(data[0].brand, 'Audi'); assert.strictEqual(data[1].brand, 'Audi'); }); it('select + where + =', function () { const nosql = new FlyJson(); const data = nosql.set(data4) .select(['brand', 'color', 'stock']) .where('brand', '=', 'Audi') .exec(); assert.strictEqual(data[0].brand, 'Audi'); assert.strictEqual(data[1].brand, 'Audi'); }); it('select + where + = [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data4) .select(['brand', 'color', 'stock']) .where('brand', '=', 'Audi') .exec(); assert.strictEqual(data[0].brand, 'Audi'); assert.strictEqual(data[1].brand, 'Audi'); }); it('select + where (in array)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN', 'News') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in array) with null array', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'IN', 'News') .exec(); assert.strictEqual(data[0].id, 3); assert.strictEqual(data[0].tags[0], 'News'); }); it('select + where + remove any value with empty array', function () { const nosql = new FlyJson(); const data = nosql.set(data15) .select(['id', 'level', 'group']) .where('group', 'FUNCTION', function (value) { return !nosql.isEmptyArray(value); }) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 5); }); it('select + where + remove any value with empty object', function () { const nosql = new FlyJson(); const data = nosql.set(data16) .select(['id', 'level', 'group']) .where('group', 'FUNCTION', function (value) { return !nosql.isEmptyObject(value); }) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 5); }); it('select + where (in array) with null array case insensitive', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'IN', 'News', false) .exec(); assert.strictEqual(data[0].id, 3); assert.strictEqual(data[0].tags[0], 'News'); }); it('select + where (in array) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN', 'News') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in array case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN', 'news', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in array case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN', 'news', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in object)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'IN', 'Tutorial') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in object) with null object', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'IN', 'Tutorial') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in object) with null object case insenstive', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'IN', 'Tutorial', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in object) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'IN', 'Tutorial') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in object case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'IN', 'tutorial', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in object case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'IN', 'tutorial', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in like array) with null array case insensitive', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'IN like', 'New', false) .exec(); assert.strictEqual(data[0].id, 3); assert.strictEqual(data[0].tags[0], 'News'); }); it('select + where (in like array) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN LIKE', 'New') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in like array case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN LIKE', 'new', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in like array case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'IN LIKE', 'new', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].tags[0], 'News'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].tags[0], 'News'); }); it('select + where (in like object)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'IN LIKE', 'Tutor') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in like object) with null object', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'IN LIKE', 'Tutor') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in like object) with null object case insenstive', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'IN LIKE', 'tutor', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in like object) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'IN LIKE', 'Tutor') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in like object case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'IN LIKE', 'tutor', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (in like object case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'IN LIKE', 'tutor', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data[0].category.id, 4); assert.strictEqual(data[0].category.name, 'Tutorial'); }); it('select + where (not in array)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'News') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in array) with null array', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'News') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in array) with null array case insensitive', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'News', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in array) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'News') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in array case sensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'news') .exec(); assert.strictEqual(data.length, 3); }); it('select + where (not in array case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'news', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in array case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN', 'news', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in object)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'Tutorial') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in object) with null object', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'Tutorial') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in object) with null object case insensitive', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'Tutorial', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in object) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'Tutorial') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in object case sensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'tutorial') .exec(); assert.strictEqual(data.length, 3); }); it('select + where (not in object case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'tutorial', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in object case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN', 'tutorial', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in like array)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'New') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in like array) with null array', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'New') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in like array) with null array case insensitive', function () { const nosql = new FlyJson(); const data = nosql.set(data9) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'New', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in like array) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'New') .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in like array case sensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'new') .exec(); assert.strictEqual(data.length, 3); }); it('select + where (not in like array case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'new', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in like array case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data5) .select(['id', 'title', 'tags']) .where('tags', 'NOT IN LIKE', 'new', false) .exec(); assert.strictEqual(data[0].id, 2); assert.strictEqual(data.length, 1); }); it('select + where (not in like object)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'Tutor') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in like object) with null object', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'Tutor') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in like object) with null object case insensitive', function () { const nosql = new FlyJson(); const data = nosql.set(data10) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'Tutor', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in like object) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'Tutor') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in like object case sensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'tutor') .exec(); assert.strictEqual(data.length, 3); }); it('select + where (not in like object case insensitive)', function () { const nosql = new FlyJson(); const data = nosql.set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'tutor', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('select + where (not in like object case insensitive) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data6) .select(['id', 'title', 'category']) .where('category', 'NOT IN LIKE', 'tutor', false) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 3); }); it('advanced search', function () { const nosql = new FlyJson(); const search = 'giant'; const data = nosql.set(advancedsearch) .where('team', 'FUNC', function (value) { let found = false; for (let i = 0; i < value.length; i++) { if (value[i].name.toString().toLowerCase().indexOf(search) !== -1) { found = true; } } return found; }) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].level, 'medium'); assert.strictEqual(data[1].id, 3); assert.strictEqual(data[1].level, 'hard'); assert.strictEqual(data.length, 2); }); it('select + where (not)', function () { const nosql = new FlyJson(); const data = nosql.set(data4) .select(['brand', 'color', 'stock']) .where('brand', 'NOT', 'audi', false) .exec(); assert.strictEqual(data[0].brand, 'Ferarri'); assert.strictEqual(data[1].brand, 'Ford'); assert.strictEqual(data[2].brand, 'Peugot'); }); it('select + where (not) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data4) .select(['brand', 'color', 'stock']) .where('brand', 'NOT', 'audi', false) .exec(); assert.strictEqual(data[0].brand, 'Ferarri'); assert.strictEqual(data[1].brand, 'Ford'); assert.strictEqual(data[2].brand, 'Peugot'); }); it('select + where (not like)', function () { const nosql = new FlyJson(); const data = nosql.set(data4) .select(['brand', 'color', 'stock']) .where('brand', 'NOT LIKE', 'audi', false) .exec(); assert.strictEqual(data[0].brand, 'Ferarri'); assert.strictEqual(data[1].brand, 'Ford'); assert.strictEqual(data[2].brand, 'Peugot'); }); it('select + where (not like) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data4) .select(['brand', 'color', 'stock']) .where('brand', 'NOT LIKE', 'audi', false) .exec(); assert.strictEqual(data[0].brand, 'Ferarri'); assert.strictEqual(data[1].brand, 'Ford'); assert.strictEqual(data[2].brand, 'Peugot'); }); it('select + where (regex)', function () { const nosql = new FlyJson(); const data = nosql.set(data4) .select(['brand', 'color', 'stock']) .where('brand', 'regex', /[A-F]/) .exec(); assert.strictEqual(data[0].brand, 'Audi'); assert.strictEqual(data[1].brand, 'Audi'); assert.strictEqual(data[2].brand, 'Ferarri'); assert.strictEqual(data[3].brand, 'Ford'); }); it('select + where (regex) [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data4) .select(['brand', 'color', 'stock']) .where('brand', 'regex', /[A-F]/) .exec(); assert.strictEqual(data[0].brand, 'Audi'); assert.strictEqual(data[1].brand, 'Audi'); assert.strictEqual(data[2].brand, 'Ferarri'); assert.strictEqual(data[3].brand, 'Ford'); }); it('select + where + function for between date', function () { // Date should be set in full timestamp, to prevent using local timezone const startDate = new Date('2019-10-01 00:00:00').getTime(); const endDate = new Date('2019-10-03 23:59:59').getTime(); const nosql = new FlyJson(); const data = nosql.set(data7) .select(['id', 'name', 'created']) .where('created', 'function', value => { const aDate = new Date(value).getTime(); return (aDate >= startDate && aDate <= endDate); }) .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[1].id, 2); assert.strictEqual(data[2].id, 3); assert.strictEqual(data.length, 3); }); it('select + where + <=', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '<=', 20) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data[1].age, 20); assert.strictEqual(data.length, 2); }); it('select + where + <= [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '<=', 20) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data[1].age, 20); assert.strictEqual(data.length, 2); }); it('select + where + <', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '<', 20) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data.length, 1); }); it('select + where + < [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '<', 20) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data.length, 1); }); it('select + where + >', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '>', 10) .exec(); assert.strictEqual(data[0].age, 20); assert.strictEqual(data[1].age, 30); assert.strictEqual(data.length, 2); }); it('select + where + > [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '>', 10) .exec(); assert.strictEqual(data[0].age, 20); assert.strictEqual(data[1].age, 30); assert.strictEqual(data.length, 2); }); it('select + where + >=', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '>=', 10) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data[1].age, 20); assert.strictEqual(data[2].age, 30); assert.strictEqual(data.length, 3); }); it('select + where + >= [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '>=', 10) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data[1].age, 20); assert.strictEqual(data[2].age, 30); assert.strictEqual(data.length, 3); }); it('select + where + !=', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '!=', 10) .exec(); assert.strictEqual(data[0].age, 20); assert.strictEqual(data[1].age, 30); assert.strictEqual(data.length, 2); }); it('select + where + != [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '!=', 10) .exec(); assert.strictEqual(data[0].age, 20); assert.strictEqual(data[1].age, 30); assert.strictEqual(data.length, 2); }); it('select + where + ==', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '==', 10) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data.length, 1); }); it('select + where + == [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '==', 10) .exec(); assert.strictEqual(data[0].age, 10); assert.strictEqual(data.length, 1); }); it('select + where + !==', function () { const nosql = new FlyJson(); const data = nosql.set(data1) .select(['user_id', 'name', 'age']) .where('age', '!==', 10) .exec(); assert.strictEqual(data[0].age, 20); assert.strictEqual(data[1].age, 30); assert.strictEqual(data.length, 2); }); it('select + where + !== [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data1) .select(['user_id', 'name', 'age']) .where('age', '!==', 10) .exec(); assert.strictEqual(data[0].age, 20); assert.strictEqual(data[1].age, 30); assert.strictEqual(data.length, 2); }); it('select + where + and', function () { const nosql = new FlyJson(); const data = nosql.set(data2) .select(['id', 'address']) .where('address', 'like', 'a') .where('address', 'like', 'ba') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].address, 'bandung'); assert.strictEqual(data[1].id, 4); assert.strictEqual(data[1].address, 'solo, balapan'); assert.strictEqual(data[2].id, 5); assert.strictEqual(data[2].address, 'surabaya'); }); it('select + where + and [shallow]', function () { const nosql = new FlyJson(); const data = nosql.setMode('shallow').set(data2) .select(['id', 'address']) .where('address', 'like', 'a') .where('address', 'like', 'ba') .exec(); assert.strictEqual(data[0].id, 1); assert.strictEqual(data[0].address, 'bandung'); assert.strictEqual(data[1].id, 4); assert.strictEqual(data[1].address, 'solo, bal