UNPKG

fly-json-odm

Version:

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

234 lines (209 loc) 7.91 kB
/* global describe it */ // The reason we allow new constructor for boolean is just for test case only /* eslint no-new-wrappers:0 */ 'use strict'; const assert = require('assert'); const FlyJson = require('../src/flyjson.js'); describe('helper function test', function () { const nosql = new FlyJson(); it('is string', function () { assert.strictEqual(nosql.isString('abc'), true); assert.strictEqual(nosql.isString(''), true); assert.strictEqual(nosql.isString(1), false); assert.strictEqual(nosql.isString([]), false); assert.strictEqual(nosql.isString({}), false); }); it('is integer', function () { assert.strictEqual(nosql.isInteger(1), true); assert.strictEqual(nosql.isInteger(0), true); assert.strictEqual(nosql.isInteger(-1), true); assert.strictEqual(nosql.isInteger(-1.56), false); assert.strictEqual(nosql.isInteger(1.56), false); assert.strictEqual(nosql.isInteger('2'), false); assert.strictEqual(nosql.isInteger('-2'), false); assert.strictEqual(nosql.isInteger('02'), false); assert.strictEqual(nosql.isInteger('2.56'), false); assert.strictEqual(nosql.isInteger('-2.56'), false); assert.strictEqual(nosql.isInteger([1, 2, 3]), false); assert.strictEqual(nosql.isInteger([]), false); assert.strictEqual(nosql.isInteger({}), false); assert.strictEqual(nosql.isInteger(''), false); }); it('is boolean', function () { assert.strictEqual(nosql.isBoolean(true), true); assert.strictEqual(nosql.isBoolean(false), true); assert.strictEqual(nosql.isBoolean(new Boolean(true)), true); // with new wrappers assert.strictEqual(nosql.isBoolean(new Boolean(false)), true); // with new wrappers assert.strictEqual(nosql.isBoolean(Boolean(true)), true); assert.strictEqual(nosql.isBoolean(Boolean(false)), true); assert.strictEqual(nosql.isBoolean(undefined), false); assert.strictEqual(nosql.isBoolean(null), false); assert.strictEqual(nosql.isBoolean(1), false); assert.strictEqual(nosql.isBoolean(0), false); assert.strictEqual(nosql.isBoolean('true'), false); assert.strictEqual(nosql.isBoolean('false'), false); }); it('is array', function () { assert.strictEqual(nosql.isArray([1, 2, 3]), true); assert.strictEqual(nosql.isArray([]), true); assert.strictEqual(nosql.isArray({}), false); assert.strictEqual(nosql.isArray(1), false); assert.strictEqual(nosql.isArray(''), false); }); it('is object', function () { assert.strictEqual(nosql.isObject({ id: 1, name: 'abc' }), true); assert.strictEqual(nosql.isObject({}), true); assert.strictEqual(nosql.isObject([]), false); assert.strictEqual(nosql.isObject(''), false); assert.strictEqual(nosql.isObject(1), false); }); it('is empty string', function () { assert.strictEqual(nosql.isEmpty(undefined), true); assert.strictEqual(nosql.isEmpty(null), true); assert.strictEqual(nosql.isEmpty(''), true); assert.strictEqual(nosql.isEmpty('abc'), false); assert.strictEqual(nosql.isEmpty(1), false); assert.strictEqual(nosql.isEmpty([]), false); assert.strictEqual(nosql.isEmpty({}), false); }); it('is empty array', function () { assert.strictEqual(nosql.isEmptyArray(undefined), true); assert.strictEqual(nosql.isEmptyArray(null), true); assert.strictEqual(nosql.isEmptyArray([]), true); assert.strictEqual(nosql.isEmptyArray({}), false); assert.strictEqual(nosql.isEmptyArray({ id: 1 }), false); assert.strictEqual(nosql.isEmptyArray('1'), false); assert.strictEqual(nosql.isEmptyArray(1), false); assert.strictEqual(nosql.isEmptyArray([1, 2, 3]), false); }); it('is empty object', function () { assert.strictEqual(nosql.isEmptyObject(undefined), true); assert.strictEqual(nosql.isEmptyObject(null), true); assert.strictEqual(nosql.isEmptyObject({}), true); assert.strictEqual(nosql.isEmptyObject([]), false); assert.strictEqual(nosql.isEmptyObject(1), false); assert.strictEqual(nosql.isEmptyObject({ id: 1 }), false); assert.strictEqual(nosql.isEmptyObject('1'), false); assert.strictEqual(nosql.isEmptyObject([1, 2, 3]), false); }); it('is empty object parameter value must hasOwnProperty', function () { const obj = Object.create({ name: 'inherited' }); assert.strictEqual(true, nosql.isEmptyObject(obj)); }); it('safeStringify success to avoid type error converting circular', function () { const o = {}; o.o = o; o.o.o = null; const result = JSON.parse(nosql.safeStringify(o)); assert.strictEqual(true, nosql.isObject(result)); }); it('safeStringify success to avoid type error converting circular in vue.js', function () { const o = {}; o.o = o; o._ = '1234'; const result = JSON.parse(nosql.safeStringify(o)); assert.strictEqual(true, nosql.isObject(result)); }); it('object circular is not empty and is object', function () { const o = {}; o.o = o; assert.strictEqual(true, (!nosql.isEmpty(o) && nosql.isObject(o))); }); it('shallow clone array is not reflect to original', function () { const array1 = [1, 2, 3]; let array2 = [6, 7, 8]; array2 = nosql.shallowClone(array1); array2[0] = 10; assert.strictEqual(array1[0], 1); }); it('shallow clone with deep array is reflect to original', function () { const array1 = [[1], [2], [3]]; let array2 = [[6], [7], [8]]; array2 = nosql.shallowClone(array1); array2[0].push(10); assert.deepStrictEqual(array1[0], [1, 10]); }); it('deep clone array is not reflect to original', function () { const array1 = [1, 2, 3]; let array2 = [6, 7, 8]; array2 = nosql.deepClone(array1); array2[0] = 10; assert.strictEqual(array1[0], 1); }); it('deep clone without hasOwnProperty will not copied', function () { const obj = Object.create({ name: 'inherited' }); assert.deepStrictEqual(nosql.deepClone(obj), {}); }); it('deep clone with deep array is not reflect to original', function () { const array1 = [[1], [2], [3]]; let array2 = [[6], [7], [8]]; array2 = nosql.deepClone(array1); array2[0].push(10); assert.deepStrictEqual(array1[0], [1]); }); it('foreach an array', function () { const array1 = [1, 2, 3]; const result = []; nosql.foreach(array1, function (value) { result.push(value); }); assert.deepStrictEqual(result, [1, 2, 3]); }); it('foreach an object', function () { const obj = { id: 1, name: 'john', age: 20 }; const result = []; nosql.foreach(obj, function (value) { result.push(value); }); assert.deepStrictEqual(result, [1, 'john', 20]); }); it('foreach except an array or object will throw Error', function () { const name = 'my name is john'; assert.throws(() => { nosql.foreach(name, function (value) { console.log(value); }); }, Error); }); it('should allow for deep key search', function () { const object = { level1: { level2: [ { level3: 'NL' }, { level3: 'EN' } ] } }; assert.deepStrictEqual(['NL', 'EN'], nosql.getDescendantProperty(object, 'level1.level2.level3')); }); it('should skip for deep key search if there is remaining child level and parent key is null or undefined', function () { const object = { level1: { level2: [ { level3: 'NL' }, { level3: 'EN' }, { level3: { sub: ['District'] } }, { null: 'deleted' }, { undefined: 'deleted' } ] } }; assert.deepStrictEqual(['NL', 'EN'], nosql.getDescendantProperty(object, 'level1.level2.level3')); }); });