UNPKG

@apistudio/apim-cli

Version:

CLI for API Management Products

280 lines (279 loc) 17.3 kB
"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); }); }); });