6607fe0504
As title, solves this kind of issues https://twentyfortwenty.twenty.com/object/workflowRun/d6aca50e-68ba-4715-8835-ea22bd44fb88 Solves null currencyDisplay when null currencyCode and null amountMicros ### Before <img width="147" height="81" alt="image" src="https://github.com/user-attachments/assets/d250d65e-b984-43f4-ad67-1397a684cf6a" /> ### After <img width="128" height="74" alt="image" src="https://github.com/user-attachments/assets/4f9c9d80-f8bb-495a-9be0-ecfb984ded81" />
133 lines
3.4 KiB
TypeScript
133 lines
3.4 KiB
TypeScript
import { resolveInput } from './variable-resolver';
|
|
|
|
describe('resolveInput', () => {
|
|
const context = {
|
|
user: {
|
|
name: 'John Doe',
|
|
age: 30,
|
|
},
|
|
settings: {
|
|
theme: 'dark',
|
|
notifications: true,
|
|
},
|
|
specialValues: {
|
|
nullValue: null,
|
|
undefinedValue: undefined,
|
|
emptyString: '',
|
|
zero: 0,
|
|
booleanFalse: false,
|
|
booleanTrue: true,
|
|
},
|
|
};
|
|
|
|
it('should return null for null input', () => {
|
|
expect(resolveInput(null, context)).toBeNull();
|
|
});
|
|
|
|
it('should support special values', () => {
|
|
expect(resolveInput('{{specialValues.nullValue}}', context)).toBeNull();
|
|
expect(
|
|
resolveInput('{{specialValues.undefinedValue}}', context),
|
|
).toBeUndefined();
|
|
expect(resolveInput('{{specialValues.emptyString}}', context)).toBe('');
|
|
expect(resolveInput('{{specialValues.zero}}', context)).toBe(0);
|
|
expect(resolveInput('{{specialValues.booleanFalse}}', context)).toBe(false);
|
|
expect(resolveInput('{{specialValues.booleanTrue}}', context)).toBe(true);
|
|
});
|
|
|
|
it('should return undefined for undefined input', () => {
|
|
expect(resolveInput(undefined, context)).toBeUndefined();
|
|
});
|
|
|
|
it('should resolve a simple string variable', () => {
|
|
expect(resolveInput('{{user.name}}', context)).toBe('John Doe');
|
|
});
|
|
|
|
it('should resolve multiple variables in a string', () => {
|
|
expect(
|
|
resolveInput('Name: {{user.name}}, Age: {{user.age}}', context),
|
|
).toBe('Name: John Doe, Age: 30');
|
|
});
|
|
|
|
it('should handle non-existent variables', () => {
|
|
expect(resolveInput('{{user.email}}', context)).toBe(undefined);
|
|
});
|
|
|
|
it('should resolve variables in an array', () => {
|
|
const input = ['{{user.name}}', '{{settings.theme}}', 'static'];
|
|
const expected = ['John Doe', 'dark', 'static'];
|
|
|
|
expect(resolveInput(input, context)).toEqual(expected);
|
|
});
|
|
|
|
it('should resolve variables in an object', () => {
|
|
const input = {
|
|
name: '{{user.name}}',
|
|
theme: '{{settings.theme}}',
|
|
static: 'value',
|
|
};
|
|
const expected = {
|
|
name: 'John Doe',
|
|
theme: 'dark',
|
|
static: 'value',
|
|
};
|
|
|
|
expect(resolveInput(input, context)).toEqual(expected);
|
|
});
|
|
|
|
it('should handle nested objects and arrays', () => {
|
|
const input = {
|
|
user: {
|
|
displayName: '{{user.name}}',
|
|
preferences: ['{{settings.theme}}', '{{settings.notifications}}'],
|
|
},
|
|
staticData: [1, 2, 3],
|
|
};
|
|
const expected = {
|
|
user: {
|
|
displayName: 'John Doe',
|
|
preferences: ['dark', true],
|
|
},
|
|
staticData: [1, 2, 3],
|
|
};
|
|
|
|
expect(resolveInput(input, context)).toEqual(expected);
|
|
});
|
|
|
|
it('does not wrap string variables with double quotes', () => {
|
|
expect(
|
|
resolveInput('{ {{test}}: 2 }', {
|
|
test: 'prop',
|
|
}),
|
|
).toBe('{ prop: 2 }');
|
|
});
|
|
|
|
it('does not modify static JSON', () => {
|
|
expect(resolveInput('{ "a": 2 }', {})).toBe('{ "a": 2 }');
|
|
});
|
|
|
|
it('supports variable as JSON object property name', () => {
|
|
expect(
|
|
resolveInput('{ "{{test}}": 2 }', {
|
|
test: 'prop',
|
|
}),
|
|
).toBe('{ "prop": 2 }');
|
|
});
|
|
|
|
it('supports variable as JSON number value', () => {
|
|
expect(
|
|
resolveInput('{ "a": {{test}} }', {
|
|
test: 2,
|
|
}),
|
|
).toBe('{ "a": 2 }');
|
|
});
|
|
|
|
it('supports variable as JSON string value', () => {
|
|
expect(
|
|
resolveInput('{ "a": "{{test}}" }', {
|
|
test: 'str',
|
|
}),
|
|
).toBe('{ "a": "str" }');
|
|
});
|
|
});
|