safe-evaluate-expression
Version:
Small library to dynamically create and evaluate expression with multiple parameters (even undefined)
139 lines (125 loc) • 3.54 kB
JavaScript
const test = require('ava');
const { factory, operators } = require('../');
const evaluate = factory({ operators, multipleParams: true, translateLogical: true });
const metadata = {
x: 1.1,
y: 2,
now: '2020-11-07T23:00:00.000Zรท2020-11-14T22:59:59.000Z',
};
const list = { k: 3, z: 4 };
const map = new Map([['pi', 3.14]]);
const expression1 = 'isLower(x,z)';
const expression2 = 'isLower(k,y)';
const expression3 = 'isLower(notDefined,z)'; // put a not defined value
const expression4 = {
and: [
{ operator: '!isEmpty', values: [{ type: 'string', value: '"lorem"' }] },
{
or: [
{
operator: 'isEqual',
values: [
{ type: 'string', value: 'a' },
{ type: 'string', value: 'a' },
],
},
{
operator: 'isEqual',
values: [
{ type: 'string', value: '"b"' },
{ type: 'string', value: '"b"' },
],
},
],
},
],
};
const expression5 = {
and: [
{
operator: '*',
values: [
{
type: 'metadata',
value: '',
},
{
type: '',
value: '',
},
],
id: 'Bg8NiI52KJ',
},
],
};
test('expression *', (t) => t.true(evaluate(expression5, metadata, list)));
test('expression1', (t) => t.true(evaluate(expression1, metadata, list)));
test('expression1 OR expression2', (t) =>
t.true(evaluate(`${expression1} OR ${expression2}`, metadata, list)));
test('expression2', (t) => t.false(evaluate(expression2, metadata, list)));
test('expression1 AND expression2', (t) =>
t.false(evaluate(`${expression1} AND ${expression2}`, metadata, list)));
test('expression3', (t) => t.false(evaluate(expression3, metadata, list)));
test('expression3 AND expression2', (t) =>
t.false(evaluate(`${expression3} AND ${expression2}`, metadata, list)));
test('isLower(x,z) AND isLower(k,y) OR (isLower(z,P) AND NOT isLower(P,k)))', (t) =>
t.false(
evaluate(
`(isLower(x,z) AND isLower(k,y) OR (isLower(z,P) AND NOT isLower(P,k)))`,
metadata,
list,
),
));
test(`isLower(z,pi)`, (t) => t.false(evaluate(`isLower(z,pi)`, metadata, list, map)));
test(`complex string`, (t) =>
t.true(evaluate(`isEqual(now, "2020-11-07T23:00:00.000Zรท2020-11-14T22:59:59.000Z")`, metadata)));
test('expression complex', (t) => t.true(evaluate(expression4, metadata, list)));
test('includes with trail', (t) => {
const condition = {
and: [
{
operator: 'includes',
values: [
{ type: 'string', value: 'social-all' },
{ type: 'string', value: '"a"' },
],
},
],
};
t.true(evaluate(condition, { 'social-all': '["a"]' }, { ciao: 'mamma' }));
});
test('includes with mulit-trail', (t) => {
const condition = {
and: [
{
operator: 'includes',
values: [
{ type: 'string', value: 'social-news-all' },
{ type: 'string', value: '"a"' },
],
},
],
};
t.true(evaluate(condition, { 'social-news-all': '["a"]' }, { ciao: 'mamma' }));
});
test('dotted condition', (t) => {
const condition = {
and: [
{
operator: 'sizeGreater',
values: [
{
type: 'metadata',
value: 'k',
},
{
value: '"4"',
type: 'number',
},
],
id: '2xSC4zIAh-',
},
],
};
t.true(evaluate(condition, { k: [1, 2, 3, 4, 5, 6] }, { ciao: 'mamma' }));
});