safe-evaluate-expression
Version:
Small library to dynamically create and evaluate expression with multiple parameters (even undefined)
199 lines (188 loc) • 4.46 kB
JavaScript
const test = require('ava');
const { complexToBasic } = require('../');
const c10 = {
and: [
{
or: [
{
and: [
{
operator: 'isEqual',
values: [
{ type: 'string', value: 'dayOfTheWeek' },
{ type: 'string', value: '"Lun"' },
],
},
{
and: [
{
operator: 'isGreater',
values: [
{ type: 'string', value: 'hourOfDay' },
{ type: 'string', value: 10 },
],
},
{
operator: 'isLess',
values: [
{ type: 'string', value: 'hourOfDay' },
{ type: 'string', value: 12 },
],
},
],
},
],
},
{
and: [
{
operator: 'isEqual',
values: [
{ type: 'string', value: 'dayOfTheWeek' },
{ type: 'string', value: '"Ven"' },
],
},
{
and: [
{
operator: 'isGreater',
values: [
{ type: 'string', value: 'hourOfDay' },
{ type: 'string', value: 20 },
],
},
{
operator: 'isLess',
values: [
{ type: 'string', value: 'hourOfDay' },
{ type: 'string', value: 23 },
],
},
],
},
],
},
],
},
{
operator: 'isEqual',
values: [
{ type: 'string', value: 'recommendable' },
{ type: 'string', value: true },
],
},
],
};
const c12 = {
and: [
{
operator: 'isEqual',
values: [
{
value: '"k"',
type: 'string',
},
{
value: '"z"',
type: 'string',
},
],
},
{
or: [
{
operator: '!isEmpty',
values: [
{
value: '"a"',
type: 'string',
},
{
value: '"b"',
type: 'string',
},
],
},
{
operator: 'isEqual',
values: [
{
value: '"c"',
type: 'string',
},
{
value: '"d"',
type: 'string',
},
],
},
{
operator: 'isEqual',
values: [
{
value: '"e"',
type: 'string',
},
{
value: '"f"',
type: 'string',
},
],
},
],
},
],
};
c13 = {
and: [
{
operator: 'isEmpty',
values: [{ type: 'metadata', value: 'query_title' }, { value: '' }],
id: 'EybWr2jujI',
},
],
};
const dotted = {
and: [
{
operator: 'greaterThan',
values: [
{
type: 'metadata',
value: 'video_watched_w_ts.id',
},
{
value: '"5"',
type: 'number',
},
],
id: 'FmcXApH2u9',
},
],
};
const b10 = `(((isEqual(dayOfTheWeek, "Lun") && (isGreater(hourOfDay, 10) && isLess(hourOfDay, 12))) || (isEqual(dayOfTheWeek, "Ven") && (isGreater(hourOfDay, 20) && isLess(hourOfDay, 23)))) && isEqual(recommendable, true))`;
const c11 = { and: [{ operator: '*' }] };
const b11 = `*`;
const b12 = `(isEqual("k", "z") && (!isEmpty("a", "b") || isEqual("c", "d") || isEqual("e", "f")))`;
const b13 = `(isEmpty(query_title))`;
test('test deep nested condition', (t) => {
const result = complexToBasic(c10);
t.deepEqual(result, b10);
});
test('test always condition', (t) => {
const result = complexToBasic(c11);
t.deepEqual(result, b11);
});
test('test and or condition', (t) => {
const result = complexToBasic(c12);
t.deepEqual(result, b12);
});
test('test one value condition', (t) => {
const result = complexToBasic(c13);
t.deepEqual(result, b13);
});
test('test dotted', (t) => {
const result = complexToBasic(dotted);
console.log(result);
t.deepEqual(result, `(greaterThan('video_watched_w_ts.id', "5"))`);
});