153 lines
4.0 KiB
TypeScript
153 lines
4.0 KiB
TypeScript
|
|
import type { INodeType } from 'n8n-workflow';
|
||
|
|
|
||
|
|
import { shouldAssignExecuteMethod, getAllKeyPaths } from '../utils';
|
||
|
|
|
||
|
|
describe('shouldAssignExecuteMethod', () => {
|
||
|
|
it('should return true when node has no execute, poll, trigger, webhook (unless declarative), or methods', () => {
|
||
|
|
const nodeType = {
|
||
|
|
description: { requestDefaults: {} }, // Declarative node
|
||
|
|
execute: undefined,
|
||
|
|
poll: undefined,
|
||
|
|
trigger: undefined,
|
||
|
|
webhook: undefined,
|
||
|
|
methods: undefined,
|
||
|
|
} as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return false when node has execute', () => {
|
||
|
|
const nodeType = {
|
||
|
|
execute: jest.fn(),
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return false when node has poll', () => {
|
||
|
|
const nodeType = {
|
||
|
|
poll: jest.fn(),
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return false when node has trigger', () => {
|
||
|
|
const nodeType = {
|
||
|
|
trigger: jest.fn(),
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return false when node has webhook and is not declarative', () => {
|
||
|
|
const nodeType = {
|
||
|
|
description: {},
|
||
|
|
webhook: jest.fn(),
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return true when node has webhook but is declarative', () => {
|
||
|
|
const nodeType = {
|
||
|
|
description: { requestDefaults: {} }, // Declarative node
|
||
|
|
webhook: jest.fn(),
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(true);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return false when node has methods and is not declarative', () => {
|
||
|
|
const nodeType = {
|
||
|
|
methods: {},
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(false);
|
||
|
|
});
|
||
|
|
|
||
|
|
it('should return true when node has methods but is declarative', () => {
|
||
|
|
const nodeType = {
|
||
|
|
description: { requestDefaults: {} }, // Declarative node
|
||
|
|
methods: {},
|
||
|
|
} as unknown as INodeType;
|
||
|
|
|
||
|
|
expect(shouldAssignExecuteMethod(nodeType)).toBe(true);
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
describe('getAllKeyPaths', () => {
|
||
|
|
const testCases = [
|
||
|
|
{
|
||
|
|
description: 'should return empty array for null or undefined',
|
||
|
|
obj: null,
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: [],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
description: 'should return empty array for undefined',
|
||
|
|
obj: undefined,
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: [],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
description: 'should find keys with matching string values in objects',
|
||
|
|
obj: {
|
||
|
|
name: 'test',
|
||
|
|
age: 25,
|
||
|
|
description: 'contains test data',
|
||
|
|
other: 'no match',
|
||
|
|
},
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: ['name', 'description'],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
description: 'should recursively search nested objects',
|
||
|
|
obj: {
|
||
|
|
user: {
|
||
|
|
name: 'testuser',
|
||
|
|
profile: {
|
||
|
|
bio: 'test bio',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
settings: {
|
||
|
|
theme: 'dark',
|
||
|
|
},
|
||
|
|
},
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: ['user.name', 'user.profile.bio'],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
description: 'should search arrays',
|
||
|
|
obj: [{ name: 'test1' }, { name: 'other' }, { name: 'test2' }],
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: ['[0].name', '[2].name'],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
description: 'should handle mixed arrays and objects',
|
||
|
|
obj: {
|
||
|
|
items: [{ label: 'test item' }, { label: 'normal item' }],
|
||
|
|
title: 'test title',
|
||
|
|
},
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: ['items[0].label', 'title'],
|
||
|
|
},
|
||
|
|
{
|
||
|
|
description: 'should handle non-string values by ignoring them',
|
||
|
|
obj: {
|
||
|
|
name: 'test',
|
||
|
|
count: 42,
|
||
|
|
active: true,
|
||
|
|
data: null,
|
||
|
|
},
|
||
|
|
valueFilter: (value: string) => value.includes('test'),
|
||
|
|
expected: ['name'],
|
||
|
|
},
|
||
|
|
];
|
||
|
|
|
||
|
|
it.each(testCases)('$description', ({ obj, valueFilter, expected }) => {
|
||
|
|
const result = getAllKeyPaths(obj, '', [], valueFilter);
|
||
|
|
expect(result).toEqual(expected);
|
||
|
|
});
|
||
|
|
});
|