mirror of
https://github.com/n8n-io/n8n.git
synced 2024-11-13 16:14:07 -08:00
d78a41db54
* wip: workflow execution filtering
* fix: import type failing to build
* fix: remove console.logs
* feat: execution metadata migrations
* fix(editor): Move global executions filter to its own component
* fix(editor): Using the same filter component in workflow level
* fix(editor): a small housekeeping
* checking workflowId in filter applied
* fix(editor): update filter after resolving merge conflicts
* fix(editor): unify empy filter status
* feat(editor): add datetime picker to filter
* feat(editor): add meta fields
* fix: fix button override in datepicker panel
* feat(editor): add filter metadata
* feat(core): add 'startedBefore' execution filter prop
* feat(core): add 'tags' execution query filter
* Revert "feat(core): add 'tags' execution query filter"
This reverts commit a7b968081c
.
* feat(editor): add translations and tooltip and counting selected filter props
* fix(editor): fix label layouts
* fix(editor): update custom data docs link
* fix(editor): update custom data tooltip position
* fix(editor): update tooltip text
* refactor: Ignore metadata if not enabled by license
* fix(editor): Add paywall states to advanced execution filter
* refactor: Save custom data also for worker mode
* fix: Remove duplicate migration name from list
* fix(editor): Reducing filter complexity and add debounce to text inputs
* fix(editor): Remove unused import, add comment
* fix(editor): simplify event listener
* fix: Prevent error when there are running executions
* test(editor): Add advanced execution filter basic unit test
* test(editor): Add advanced execution filter state change unit test
* fix: Small lint issue
* feat: Add indices to speed up queries
* feat: add customData limits
* refactor: put metadata save in transaction
* chore: remove unneed comment
* test: add tests for execution metadata
* fix(editor): Fixes after merge conflict
* fix(editor): Remove unused import
* wordings and ui fixes
* fix(editor): type fixes
* feat: add code node autocompletions for customData
* fix: Prevent transaction issues and ambiguous ID in sql clauses
* fix(editor): Suppress requesting current executions if metadata is used in filter (#5739)
* fix(editor): Suppress requesting current executions if metadata is used in filter
* fix(editor): Fix arrows for select in popover
* refactor: Improve performance by correcting database indices
* fix: Lint issue
* test: Fix broken test
* fix: Broken test
* test: add call data check for saveExecutionMetadata test
---------
Co-authored-by: Valya Bullions <valya@n8n.io>
Co-authored-by: Alex Grozav <alex@grozav.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: Romain Minaud <romain.minaud@gmail.com>
166 lines
4.4 KiB
TypeScript
166 lines
4.4 KiB
TypeScript
import {
|
|
getAllWorkflowExecutionMetadata,
|
|
getWorkflowExecutionMetadata,
|
|
KV_LIMIT,
|
|
setAllWorkflowExecutionMetadata,
|
|
setWorkflowExecutionMetadata,
|
|
} from '@/WorkflowExecutionMetadata';
|
|
import type { IRunExecutionData } from 'n8n-workflow';
|
|
|
|
describe('Execution Metadata functions', () => {
|
|
test('setWorkflowExecutionMetadata will set a value', () => {
|
|
const metadata = {};
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
setWorkflowExecutionMetadata(executionData, 'test1', 'value1');
|
|
|
|
expect(metadata).toEqual({
|
|
test1: 'value1',
|
|
});
|
|
});
|
|
|
|
test('setAllWorkflowExecutionMetadata will set multiple values', () => {
|
|
const metadata = {};
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
setAllWorkflowExecutionMetadata(executionData, {
|
|
test1: 'value1',
|
|
test2: 'value2',
|
|
});
|
|
|
|
expect(metadata).toEqual({
|
|
test1: 'value1',
|
|
test2: 'value2',
|
|
});
|
|
});
|
|
|
|
test('setWorkflowExecutionMetadata should convert values to strings', () => {
|
|
const metadata = {};
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
setWorkflowExecutionMetadata(executionData, 'test1', 1234);
|
|
|
|
expect(metadata).toEqual({
|
|
test1: '1234',
|
|
});
|
|
});
|
|
|
|
test('setWorkflowExecutionMetadata should limit the number of metadata entries', () => {
|
|
const metadata = {};
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
const expected: Record<string, string> = {};
|
|
for (let i = 0; i < KV_LIMIT; i++) {
|
|
expected[`test${i + 1}`] = `value${i + 1}`;
|
|
}
|
|
|
|
for (let i = 0; i < KV_LIMIT + 10; i++) {
|
|
setWorkflowExecutionMetadata(executionData, `test${i + 1}`, `value${i + 1}`);
|
|
}
|
|
|
|
expect(metadata).toEqual(expected);
|
|
});
|
|
|
|
test('getWorkflowExecutionMetadata should return a single value for an existing key', () => {
|
|
const metadata: Record<string, string> = { test1: 'value1' };
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
expect(getWorkflowExecutionMetadata(executionData, 'test1')).toBe('value1');
|
|
});
|
|
|
|
test('getWorkflowExecutionMetadata should return undefined for an unset key', () => {
|
|
const metadata: Record<string, string> = { test1: 'value1' };
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
expect(getWorkflowExecutionMetadata(executionData, 'test2')).toBeUndefined();
|
|
});
|
|
|
|
test('getAllWorkflowExecutionMetadata should return all metadata', () => {
|
|
const metadata: Record<string, string> = { test1: 'value1', test2: 'value2' };
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
expect(getAllWorkflowExecutionMetadata(executionData)).toEqual(metadata);
|
|
});
|
|
|
|
test('getAllWorkflowExecutionMetadata should not an object that modifies internal state', () => {
|
|
const metadata: Record<string, string> = { test1: 'value1', test2: 'value2' };
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
getAllWorkflowExecutionMetadata(executionData).test1 = 'changed';
|
|
|
|
expect(metadata.test1).not.toBe('changed');
|
|
expect(metadata.test1).toBe('value1');
|
|
});
|
|
|
|
test('setWorkflowExecutionMetadata should truncate long keys', () => {
|
|
const metadata = {};
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
setWorkflowExecutionMetadata(
|
|
executionData,
|
|
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab',
|
|
'value1',
|
|
);
|
|
|
|
expect(metadata).toEqual({
|
|
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa: 'value1',
|
|
});
|
|
});
|
|
|
|
test('setWorkflowExecutionMetadata should truncate long values', () => {
|
|
const metadata = {};
|
|
const executionData = {
|
|
resultData: {
|
|
metadata,
|
|
},
|
|
} as IRunExecutionData;
|
|
|
|
setWorkflowExecutionMetadata(
|
|
executionData,
|
|
'test1',
|
|
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaab',
|
|
);
|
|
|
|
expect(metadata).toEqual({
|
|
test1:
|
|
'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa',
|
|
});
|
|
});
|
|
});
|