Files
n8n_Demo/n8n-n8n-1.109.2/packages/cli/src/__tests__/utils.test.ts

153 lines
4.0 KiB
TypeScript
Raw Normal View History

2025-09-08 04:48:28 +08:00
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);
});
});