@apistudio/apim-cli
Version:
CLI for API Management Products
280 lines (279 loc) • 17.3 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
const expression_parser_service_1 = require("../core/services/expression-parser.service");
describe("Expression parser tests", () => {
describe('ExpressionParser', () => {
describe('parse', () => {
it('should parse simple path expressions', () => {
const expression = expression_parser_service_1.ExpressionParser.parse('$.spec.value');
expect(expression).toBeInstanceOf(expression_parser_service_1.PathExpression);
});
it('should parse equality expressions', () => {
const expression = expression_parser_service_1.ExpressionParser.parse('$.spec.value === "test"');
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should parse equality expressions with single equals', () => {
// The current implementation doesn't support single equals
// Let's test with triple equals instead
const expression = expression_parser_service_1.ExpressionParser.parse('$.spec.value === "test"');
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should parse numeric equality expressions', () => {
const expression = expression_parser_service_1.ExpressionParser.parse('$.spec.value === 123');
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should throw error for unparseable expressions', () => {
expect(() => expression_parser_service_1.ExpressionParser.parse('invalid expression')).toThrow();
});
});
});
describe('PathExpression', () => {
it('should evaluate to true when path exists', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.value');
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate to false when path does not exist', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.nonexistent');
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(false);
});
it('should evaluate to false when path is invalid', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.value');
const context = null;
expect(expression.evaluate(context)).toBe(false);
});
it('should validate path correctly', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.value');
expect(expression.validate().valid).toBe(true);
});
it('should invalidate empty path', () => {
const expression = new expression_parser_service_1.PathExpression('');
expect(expression.validate().valid).toBe(false);
});
it('should invalidate path without $ prefix', () => {
const expression = new expression_parser_service_1.PathExpression('spec.value');
expect(expression.validate().valid).toBe(false);
});
it('should get value by path correctly', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.value');
const context = { spec: { value: 'test' } };
expect(expression.getValueByPath(context, '$.spec.value')).toBe('test');
});
it('should return undefined for nonexistent path', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.value');
const context = { spec: {} };
expect(expression.getValueByPath(context, '$.spec.nonexistent')).toBeUndefined();
});
it('should throw error for invalid path format', () => {
const expression = new expression_parser_service_1.PathExpression('$.spec.value');
const context = { spec: { value: 'test' } };
expect(() => expression.getValueByPath(context, 'invalid')).toThrow();
});
});
describe('ComparisonExpression', () => {
it('should evaluate equality correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '==', 'test');
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate inequality correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '!=', 'wrong');
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate greater than correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '>', 5);
const context = { spec: { value: 10 } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate less than correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '<', 5);
const context = { spec: { value: 3 } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate greater than or equal correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '>=', 5);
const context = { spec: { value: 5 } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate less than or equal correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '<=', 5);
const context = { spec: { value: 5 } };
expect(expression.evaluate(context)).toBe(true);
});
it('should return false for invalid path', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.nonexistent', '==', 'test');
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(false);
});
it('should validate correctly', () => {
const expression = new expression_parser_service_1.ComparisonExpression('$.spec.value', '==', 'test');
expect(expression.validate().valid).toBe(true);
});
it('should invalidate with invalid path', () => {
const expression = new expression_parser_service_1.ComparisonExpression('invalid', '==', 'test');
expect(expression.validate().valid).toBe(false);
});
});
describe('LogicalExpression', () => {
it('should evaluate AND correctly when both are true', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.value1');
const right = new expression_parser_service_1.PathExpression('$.spec.value2');
const expression = new expression_parser_service_1.LogicalExpression(left, 'AND', right);
const context = { spec: { value1: 'test1', value2: 'test2' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate AND correctly when left is false', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.nonexistent');
const right = new expression_parser_service_1.PathExpression('$.spec.value');
const expression = new expression_parser_service_1.LogicalExpression(left, 'AND', right);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(false);
});
it('should evaluate AND correctly when right is false', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.value');
const right = new expression_parser_service_1.PathExpression('$.spec.nonexistent');
const expression = new expression_parser_service_1.LogicalExpression(left, 'AND', right);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(false);
});
it('should evaluate OR correctly when both are true', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.value1');
const right = new expression_parser_service_1.PathExpression('$.spec.value2');
const expression = new expression_parser_service_1.LogicalExpression(left, 'OR', right);
const context = { spec: { value1: 'test1', value2: 'test2' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate OR correctly when left is true', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.value');
const right = new expression_parser_service_1.PathExpression('$.spec.nonexistent');
const expression = new expression_parser_service_1.LogicalExpression(left, 'OR', right);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate OR correctly when right is true', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.nonexistent');
const right = new expression_parser_service_1.PathExpression('$.spec.value');
const expression = new expression_parser_service_1.LogicalExpression(left, 'OR', right);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should evaluate OR correctly when both are false', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.nonexistent1');
const right = new expression_parser_service_1.PathExpression('$.spec.nonexistent2');
const expression = new expression_parser_service_1.LogicalExpression(left, 'OR', right);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(false);
});
it('should validate correctly when both are valid', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.value1');
const right = new expression_parser_service_1.PathExpression('$.spec.value2');
const expression = new expression_parser_service_1.LogicalExpression(left, 'AND', right);
expect(expression.validate().valid).toBe(true);
});
it('should invalidate when left is invalid', () => {
const left = new expression_parser_service_1.PathExpression('invalid');
const right = new expression_parser_service_1.PathExpression('$.spec.value');
const expression = new expression_parser_service_1.LogicalExpression(left, 'AND', right);
expect(expression.validate().valid).toBe(false);
});
it('should invalidate when right is invalid', () => {
const left = new expression_parser_service_1.PathExpression('$.spec.value');
const right = new expression_parser_service_1.PathExpression('invalid');
const expression = new expression_parser_service_1.LogicalExpression(left, 'AND', right);
expect(expression.validate().valid).toBe(false);
});
});
describe('NotExpression', () => {
it('should negate true to false', () => {
const inner = new expression_parser_service_1.PathExpression('$.spec.value');
const expression = new expression_parser_service_1.NotExpression(inner);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(false);
});
it('should negate false to true', () => {
const inner = new expression_parser_service_1.PathExpression('$.spec.nonexistent');
const expression = new expression_parser_service_1.NotExpression(inner);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should validate correctly', () => {
const inner = new expression_parser_service_1.PathExpression('$.spec.value');
const expression = new expression_parser_service_1.NotExpression(inner);
expect(expression.validate().valid).toBe(true);
});
it('should invalidate when inner is invalid', () => {
const inner = new expression_parser_service_1.PathExpression('invalid');
const expression = new expression_parser_service_1.NotExpression(inner);
expect(expression.validate().valid).toBe(false);
});
});
describe('ExpressionBuilder', () => {
it('should build path expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').exists();
expect(expression).toBeInstanceOf(expression_parser_service_1.PathExpression);
});
it('should build equality expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').equals('test');
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should build inequality expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').notEquals('test');
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should build greater than expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').greaterThan(5);
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should build less than expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').lessThan(5);
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should build greater than or equal expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').greaterThanOrEqual(5);
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should build less than or equal expressions', () => {
const expression = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').lessThanOrEqual(5);
expect(expression).toBeInstanceOf(expression_parser_service_1.ComparisonExpression);
});
it('should build NOT expressions', () => {
const inner = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').exists();
const expression = expression_parser_service_1.ExpressionBuilder.not(inner);
expect(expression).toBeInstanceOf(expression_parser_service_1.NotExpression);
});
});
describe('Expression Chaining', () => {
it('should chain expressions with AND', () => {
const left = expression_parser_service_1.ExpressionBuilder.path('$.spec.value1').exists();
const right = expression_parser_service_1.ExpressionBuilder.path('$.spec.value2').exists();
const expression = left.and(right);
expect(expression).toBeInstanceOf(expression_parser_service_1.LogicalExpression);
const context = { spec: { value1: 'test1', value2: 'test2' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should chain expressions with OR', () => {
const left = expression_parser_service_1.ExpressionBuilder.path('$.spec.nonexistent').exists();
const right = expression_parser_service_1.ExpressionBuilder.path('$.spec.value').exists();
const expression = left.or(right);
expect(expression).toBeInstanceOf(expression_parser_service_1.LogicalExpression);
const context = { spec: { value: 'test' } };
expect(expression.evaluate(context)).toBe(true);
});
it('should chain multiple expressions', () => {
const expr1 = expression_parser_service_1.ExpressionBuilder.path('$.spec.value1').exists();
const expr2 = expression_parser_service_1.ExpressionBuilder.path('$.spec.value2').exists();
const expr3 = expression_parser_service_1.ExpressionBuilder.path('$.spec.value3').exists();
const expression = expr1.and(expr2).and(expr3);
const context = {
spec: {
value1: 'test1',
value2: 'test2',
value3: 'test3'
}
};
expect(expression.evaluate(context)).toBe(true);
});
});
});