@apistudio/apim-cli
Version:
CLI for API Management Products
152 lines (129 loc) • 6.12 kB
text/typescript
/**
* Copyright IBM Corp. 2024, 2025
*/
import { convertToExecutableFormat } from '../../src/helpers/condition-converter.js';
describe('condition-converter', () => {
describe('convertToExecutableFormat', () => {
it('should return empty string for empty input', () => {
expect(convertToExecutableFormat('')).toBe('');
});
it('should return empty string for null/undefined input', () => {
expect(convertToExecutableFormat(null as any)).toBe('');
expect(convertToExecutableFormat(undefined as any)).toBe('');
});
it('should convert AND/OR operators to lowercase', () => {
const input = '${var1} equals 100 AND ${var2} equals 200';
const expected = '${var1} == 100 and ${var2} == 200';
expect(convertToExecutableFormat(input)).toBe(expected);
const inputOr = '${var1} equals 100 OR ${var2} equals 200';
const expectedOr = '${var1} == 100 or ${var2} == 200';
expect(convertToExecutableFormat(inputOr)).toBe(expectedOr);
});
it('should convert NOT operator to lowercase', () => {
const input = 'NOT ${var1} equals 100';
const expected = 'not ${var1} == 100';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert equalsIgnoreCase operator', () => {
const input = '${requestHeaders.abc} equalsIgnoreCase test';
const expected = '${requestHeaders.abc}_lowercase == test_lowercase';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert notEqualsIgnoreCase operator', () => {
const input = '${requestHeaders.abc} notEqualsIgnoreCase test';
const expected = '${requestHeaders.abc}_lowercase != test_lowercase';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert contains operator with array', () => {
const input = '${response.name} contains ["victor", "sangeeth"]';
const expected = '${response.name} in ("victor", "sangeeth")';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert notContains operator with array', () => {
const input = '${response.name} notContains ["victor", "sangeeth"]';
const expected = '${response.name} not in ("victor", "sangeeth")';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert exists operator', () => {
const input = '${requestHeaders.abc} exists';
const expected = 'exists(${requestHeaders.abc})';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert notExists operator', () => {
const input = '${requestHeaders.abc} notExists';
const expected = 'not exists(${requestHeaders.abc})';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert empty operator', () => {
const input = '${requestHeaders.abc} empty';
const expected = 'empty(${requestHeaders.abc})';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert range operator', () => {
const input = '${value} range [10, 20]';
const expected = '(${value} >= 10 and ${value} <= 20)';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert containsKey operator and swap operands', () => {
const input = '${requestHeaders} containsKey Content-Type';
const expected = 'Content-Type of ${requestHeaders}';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert containsKey with quoted key', () => {
const input = '${requestHeaders} containsKey "Content-Type"';
const expected = '"Content-Type" of ${requestHeaders}';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert containsKey with complex variable path', () => {
const input = '${response.headers} containsKey x-api-key';
const expected = 'x-api-key of ${response.headers}';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert containsKey in complex condition', () => {
const input =
'(${requestHeaders} containsKey Content-Type and ${response} equals sss)';
const expected =
'(Content-Type of ${requestHeaders} and ${response} == sss)';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert multiple containsKey operators', () => {
const input =
'${requestHeaders} containsKey Content-Type and ${response.headers} containsKey x-api-key';
const expected =
'Content-Type of ${requestHeaders} and x-api-key of ${response.headers}';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should convert comparison operators', () => {
expect(convertToExecutableFormat('${var} equals 100')).toBe(
'${var} == 100',
);
expect(convertToExecutableFormat('${var} notEquals 100')).toBe(
'${var} != 100',
);
expect(convertToExecutableFormat('${var} greaterThan 100')).toBe(
'${var} > 100',
);
expect(convertToExecutableFormat('${var} lessThan 100')).toBe(
'${var} < 100',
);
expect(convertToExecutableFormat('${var} greaterThanOrEqual 100')).toBe(
'${var} >= 100',
);
expect(convertToExecutableFormat('${var} lessThanOrEqual 100')).toBe(
'${var} <= 100',
);
});
it('should handle complex conditions with multiple operators', () => {
const input =
'${requestHeaders.abc} equals 100 AND ${response.name} contains ["victor", "sangeeth"]';
const expected =
'${requestHeaders.abc} == 100 and ${response.name} in ("victor", "sangeeth")';
expect(convertToExecutableFormat(input)).toBe(expected);
});
it('should handle case-insensitive operator keywords', () => {
const input = '${var1} EQUALS 100 and ${var2} CONTAINS ["test"]';
const expected = '${var1} == 100 and ${var2} in ("test")';
expect(convertToExecutableFormat(input)).toBe(expected);
});
});
});