1liner
Version:
Query JSON with one line of code.
480 lines (392 loc) • 17.9 kB
JavaScript
const Oneliner = require('../index');
const { times, random } = require('lodash');
const quote = require('../__mocks__/quote.json');
const bigQuote = {};
times(1000, (i) => {
bigQuote[`quote_${i}`] = quote;
});
const L = new Oneliner(quote);
describe('1Liner', () => {
describe('Error states', () => {
it('FAIL - wrong path', async () => {
expect(() => {
L.query('incorrect.map(claims).map(code)');
}).toThrowError(/Path error/);
});
it('FAIL - null', async () => {
expect(() => {
L.query();
}).toThrowError(/Path error/);
});
it('FAIL - empty operator', async () => {
expect(() => {
L.query('proposer.claims.map()');
}).toThrowError(/Operator error/);
});
it('FAIL - unknown operator', async () => {
expect(() => {
L.query('proposer.claims.incorrect()');
}).toThrowError(/Operator error/);
});
it('FAIL - empty equator', async () => {
expect(() => {
L.query('proposer.claims.filter(code)');
}).toThrowError(/Equator error/);
});
it('FAIL - no object found', async () => {
expect(() => {
L.query('proposer.claims.bob');
}).toThrowError(/Path error/);
});
it('FAIL - Nested map does not exist', async () => {
expect(() => {
L.query('additional_drivers.map(conviction).map(code)');
}).toThrowError(/Path error/);
});
it('FAIL - Multi Query returns not a number (string)', async () => {
expect(() => {
L.query('max([additional_drivers.map(ncd).max(), vehicle.reg])');
}).toThrowError(/Multi query error/);
});
it('FAIL - Multi Query returns not a number (array)', async () => {
expect(() => {
L.query('min([additional_drivers.map(ncd).max(), proposer.convictions.map(points)])');
}).toThrowError(/Multi query error/);
});
});
describe('Object first', () => {
it('PASS - object pass through', async () => {
const result = L.query('proposer.employment');
expect(result).toEqual('E')
});
it('PASS - count', async () => {
const result = L.query('proposer.claims.count()');
expect(result).toEqual(1);
});
it('PASS - min', async () => {
const result = L.query('proposer.convictions.map(points).min()');
expect(result).toEqual(0);
});
it('PASS - max', async () => {
const result = L.query('proposer.convictions.map(points).max()');
expect(result).toEqual(10);
});
it('PASS - range', async () => {
const result = L.query('proposer.convictions.map(points).range()');
expect(result).toEqual(10);
});
it('PASS - sum', async () => {
const result = L.query('proposer.convictions.sum(points)');
expect(result).toEqual(11);
});
it('PASS - mean', async () => {
const result = L.query('proposer.convictions.map(points).mean()');
expect(result).toEqual(3.67);
});
it('PASS - filter (string not quotes) = ', async () => {
const result = L.query('proposer.claims.filter(code=A).map(code)');
expect(result).toEqual(['A'])
});
it('PASS - filter (string " quotes) =', async () => {
const result = L.query('proposer.claims.filter(code="A").map(code)');
expect(result).toEqual(['A'])
});
it(`PASS - filter (string ' quotes) =`, async () => {
const result = L.query(`proposer.claims.filter(code='A').map(code)`);
expect(result).toEqual(['A'])
});
it(`PASS - filter (!=)`, async () => {
const result = L.query(`proposer.claims.filter(code!=A).count()`);
expect(result).toEqual(0)
});
it('PASS - unique =', async () => {
const result = L.query('proposer.convictions.unique(code).count()');
expect(result).toEqual(1);
});
it('PASS - exists true', async () => {
const result = L.query('policy.address.line_3.exists()');
expect(result).toEqual('true');
});
it('PASS - exists false', async () => {
const result = L.query('policy.address.line_1.exists()');
expect(result).toEqual('false');
});
it('PASS - date YY', async () => {
const result = L.query('proposer.dob.date(YY)');
expect(result).toEqual(2000);
});
it('FAIL - bad date', async () => {
try {
const result = L.query('policy.error_date.date(YY)');
} catch(e) {
expect(e.message).toEqual('Date error: in policy.error_date.date(YY)) the value is not a valid date');
}
});
it('FAIL - date XX', async () => {
try {
const result = L.query('proposer.dob.date(XX)');
} catch(e) {
expect(e.message).toEqual('Date error: in proposer.dob.date(XX)) should be followed by eligible formatter i.e. YY, MM, DD, HH');
}
});
it('PASS - date MM', async () => {
const result = L.query('proposer.dob.date(MM)');
expect(result).toEqual(7);
});
it('PASS - date DD', async () => {
const result = L.query('proposer.dob.date(DD)');
expect(result).toEqual(29);
});
it('PASS - date HH', async () => {
const result = L.query('proposer.dob.date(HH)');
expect(result).toEqual(0);
});
it('PASS - age YY', async () => {
// This normalise the tests
const inception = L.query('created_at.age(YY)');
const age = L.query('proposer.dob.age(YY)');
const result = Math.floor(age - inception);
expect(result).toEqual(20);
});
it('PASS - age YY with top-level date pointer', async () => {
const result = L.query('proposer.dob.age(YY, created_at)');
expect(result).toEqual(19);
});
it('PASS - age MM', async () => {
const inception = L.query('created_at.age(MM)');
const age = L.query('proposer.dob.age(MM)');
const result = Math.floor(age - inception);
expect(result).toEqual(234);
});
it('PASS - age MM with top-level date pointer', async () => {
const result = L.query('proposer.dob.age(MM, created_at)');
expect(result).toEqual(233);
});
it('PASS - age DD', async () => {
const inception = L.query('created_at.age(DD)');
const age = L.query('proposer.dob.age(DD)');
const result = Math.floor(age - inception);
expect(result).toEqual(7095);
});
it('PASS - age DD with top-level date pointer', async () => {
const result = L.query('proposer.dob.age(DD, created_at)');
expect(result).toEqual(7095);
});
it('PASS - age HH', async () => {
const inception = L.query('created_at.age(HH)');
const age = L.query('proposer.dob.age(HH)');
const result = Math.floor(age - inception);
expect(result).toEqual(170280);
});
it('PASS - age HH with top-level date pointer', async () => {
const result = L.query('proposer.dob.age(HH, created_at)');
expect(result).toEqual(170280);
});
it('PASS - regex postcode', async () => {
const result = L.query('policy.address.postcode.regex(^[A-Za-z]{2}|^[A-Za-z]{1})');
expect(result).toEqual('AB');
});
it('FAIL - bad regex postcode', async () => {
const result = L.query('policy.address.postcode.regex(~~~~)');
expect(result).toEqual('');
});
it('FAIL - property not a string', async () => {
try {
const result = L.query('proposer.children.regex(^[A-Za-z]{2}|^[A-Za-z]{1})');
} catch(e) {
expect(e.message).toEqual('Type error: in proposer.children.regex(^[A-Za-z]{2}|^[A-Za-z]{1})) the value is not a string');
}
});
it('FAIL - property is an array', async () => {
try {
const result = L.query('proposer.claims.regex(^[A-Za-z]{2}|^[A-Za-z]{1})');
} catch(e) {
expect(e.message).toEqual('Type error: in proposer.claims.regex(^[A-Za-z]{2}|^[A-Za-z]{1})) the value is not a string');
}
});
});
describe('Array first', () => {
it('PASS - map', async () => {
const result = L.query('additional_drivers.map(claims).map(code)');
expect(result).toEqual(['W'])
});
it('PASS - count', async () => {
const result = L.query('additional_drivers.map(claims).count()');
expect(result).toEqual(1);
});
it('PASS - sum', async () => {
const result = L.query('additional_drivers.map(convictions).sum(points)');
expect(result).toEqual(7);
});
it('PASS - mean', async () => {
const result = L.query('additional_drivers.map(convictions).map(points).mean()');
expect(result).toEqual(7);
});
it('PASS - filter (string not quotes) =', async () => {
const result = L.query('additional_drivers.map(claims).filter(code=W).map(code)');
expect(result).toEqual(['W'])
});
it('PASS - filter (string " quotes) =', async () => {
const result = L.query('additional_drivers.map(claims).filter(code="W").map(code)');
expect(result).toEqual(['W'])
});
it(`PASS - filter filter (string ' quotes) =`, async () => {
const result = L.query(`additional_drivers.map(claims).filter(code='W').map(code)`);
expect(result).toEqual(['W'])
});
it('PASS - filter = boolean', async () => {
const result = L.query('additional_drivers.filter(medical_informed_dvla=true).count()');
expect(result).toEqual(1)
});
it('PASS - filter = boolean', async () => {
const result = L.query('additional_drivers.filter(medical_informed_dvla=false).count()');
expect(result).toEqual(1)
});
it('PASS - unique =', async () => {
const result = L.query('additional_drivers.map(convictions).unique(code).count()');
expect(result).toEqual(1);
});
it('PASS - max for [] is 0 with no default', async () => {
const result = L.query('additional_drivers.filter(title=MRS).map(ncd).max()');
expect(result).toEqual(0);
});
it('PASS - max for [] is 5 with default', async () => {
const result = L.query('additional_drivers.filter(title="MRS").map(ncd).max(5)');
expect(result).toEqual(5);
});
it('PASS - min for [] is 5 with default', async () => {
const result = L.query(`additional_drivers.filter(title='MRS').map(ncd).min(5)`);
expect(result).toEqual(5);
});
it('PASS - mean for [] is 5 with default', async () => {
const result = L.query('additional_drivers.filter(title=MRS).map(ncd).mean(5)');
expect(result).toEqual(5);
});
it('PASS - default is 5 if undefined', async () => {
const result = L.query('proposer.unknown.default(5)');
expect(result).toEqual(5);
});
it('PASS - default is "str" if undefined', async () => {
const result = L.query('proposer.unknown.default(str)');
expect(result).toEqual('str');
});
it('PASS - default is "str" if undefined', async () => {
const result = L.query('proposer.unknown.default("str")');
expect(result).toEqual('str');
});
it('PASS - default is ignored if defined', async () => {
const result = L.query('proposer.ncd.default(-1)');
expect(result).toEqual(5);
});
it('PASS - default works if result is 0 with min', async () => {
const result = L.query('additional_drivers.map(children).min(99)');
expect(result).toEqual(0);
});
it('PASS - default works if result is 0 with max', async () => {
const result = L.query('additional_drivers.map(children).max(99)');
expect(result).toEqual(0);
});
it('PASS - default works if result is 0 with default', async () => {
const result = L.query('proposer.children.default(99)');
expect(result).toEqual(0);
});
it('PASS - age MM with top-level date pointer', async () => {
const result = L.query('proposer.convictions.map(date).age(MM, created_at)');
expect(result).toEqual([ 53, 24, 17]);
});
it('PASS - date MM', async () => {
const result = L.query('proposer.convictions.map(date).date(MM)');
expect(result).toEqual([ 7, 12, 7]);
});
});
describe('Evaluate Multiple Querys', () => {
it('PASS - max([query1, query2])', async () => {
const result = L.query('max([additional_drivers.map(ncd).max(), proposer.ncd])');
expect(result).toEqual(16);
});
it('PASS - min([query1, 10])', async () => {
const result = L.query('max([10, proposer.ncd])');
expect(result).toEqual(10);
});
it('PASS - min([query1, query2])', async () => {
const result = L.query('min([additional_drivers.map(ncd).max(), proposer.ncd])');
expect(result).toEqual(5);
});
it('PASS - min([query1, 10])', async () => {
const result = L.query('min([10, proposer.ncd])');
expect(result).toEqual(5);
});
it('PASS - range(query1.max(), query2])', async () => {
const result = L.query('range([additional_drivers.map(licence_year).max(), proposer.licence_year])');
expect(result).toEqual(13);
});
it('PASS - range([query1.min(), query2])', async () => {
const result = L.query('range([additional_drivers.map(licence_year).min(), proposer.licence_year])');
expect(result).toEqual(16);
});
it('PASS - each.additional_drivers.map(claims).count()', async () => {
const result = L.query('each.additional_drivers.map(claims).count()');
expect(result).toEqual([1, 0]);
});
it('PASS - additional_drivers.map(claims).count()', async () => {
const result = L.query('additional_drivers.map(claims).count()');
expect(result).toEqual(1);
});
it('PASS - each.additional_drivers.map(claims).filter(code=W).map(code)', async () => {
const result = L.query('each.additional_drivers.map(claims).filter(code=W).map(code)');
expect(result).toEqual([['W'], []]);
});
it('PASS - additional_drivers.map(claims).filter(code=W).map(code)', async () => {
const result = L.query('additional_drivers.map(claims).filter(code=W).map(code)');
expect(result).toEqual(['W']);
});
});
describe('Load Test - Small 1 Quote (2.5KB) - 10000 executions in ms', () => {
it('get object', async () => {
const L = new Oneliner(quote);
const start = performance.now();
times(10000, () => {
L.query('proposer.ncd');
L.query('policy.address.postcode');
L.query('vehicle.rating');
});
const end = performance.now();
expect(end - start).toBeLessThan(500);
});
it('filter, sum, map', async () => {
const L = new Oneliner(quote);
const start = performance.now();
times(10000, () => {
L.query('additional_drivers.map(claims)');
L.query('additional_drivers.map(claims).filter(code=W)');
L.query('additional_drivers.map(convictions).sum(points)');
});
const end = performance.now();
expect(end - start).toBeLessThan(500);
});
});
describe('Load Test - Big 1000 Quotes (2.5MB) - 100 executions in ms', () => {
it('get object', async () => {
const L = new Oneliner(bigQuote);
const start = performance.now();
times(1000, () => {
L.query(`quote_${random(1, 999)}.proposer.ncd`);
L.query(`quote_${random(1, 999)}.policy.address.postcode`);
L.query(`quote_${random(1, 999)}.vehicle.rating`);
});
const end = performance.now();
expect(end - start).toBeLessThan(5000);
});
it('filter, sum, map', async () => {
const L = new Oneliner(bigQuote);
const start = performance.now();
times(1000, () => {
L.query(`quote_${random(1, 999)}.additional_drivers.map(claims)`);
L.query(`quote_${random(1, 999)}.additional_drivers.map(claims).filter(code=W)`);
L.query(`quote_${random(1, 999)}.additional_drivers.map(convictions).sum(points)`);
});
const end = performance.now();
expect(end - start).toBeLessThan(5000);
});
});
});