mirror of
https://github.com/Abdulazizzn/n8n-enterprise-unlocked.git
synced 2025-12-21 03:42:16 +00:00
feat(core): Improve handling of manual executions with wait nodes (#11750)
Co-authored-by: Michael Kret <michael.k@radency.com>
This commit is contained in:
committed by
GitHub
parent
d5ba1a059b
commit
61696c3db3
@@ -1,6 +1,12 @@
|
||||
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
||||
import { displayForm, openPopUpWindow, executionFilterToQueryFilter } from './executionUtils';
|
||||
import {
|
||||
displayForm,
|
||||
openPopUpWindow,
|
||||
executionFilterToQueryFilter,
|
||||
waitingNodeTooltip,
|
||||
} from './executionUtils';
|
||||
import type { INode, IRunData, IPinData } from 'n8n-workflow';
|
||||
import { type INodeUi } from '../Interface';
|
||||
|
||||
const FORM_TRIGGER_NODE_TYPE = 'formTrigger';
|
||||
const WAIT_NODE_TYPE = 'waitNode';
|
||||
@@ -13,6 +19,33 @@ vi.mock('./executionUtils', async () => {
|
||||
};
|
||||
});
|
||||
|
||||
vi.mock('@/stores/root.store', () => ({
|
||||
useRootStore: () => ({
|
||||
formWaitingUrl: 'http://localhost:5678/form-waiting',
|
||||
webhookWaitingUrl: 'http://localhost:5678/webhook-waiting',
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock('@/stores/workflows.store', () => ({
|
||||
useWorkflowsStore: () => ({
|
||||
activeExecutionId: '123',
|
||||
}),
|
||||
}));
|
||||
|
||||
vi.mock('@/plugins/i18n', () => ({
|
||||
i18n: {
|
||||
baseText: (key: string) => {
|
||||
const texts: { [key: string]: string } = {
|
||||
'ndv.output.waitNodeWaiting': 'Waiting for execution to resume...',
|
||||
'ndv.output.waitNodeWaitingForFormSubmission': 'Waiting for form submission: ',
|
||||
'ndv.output.waitNodeWaitingForWebhook': 'Waiting for webhook call: ',
|
||||
'ndv.output.sendAndWaitWaitingApproval': 'Waiting for approval...',
|
||||
};
|
||||
return texts[key] || key;
|
||||
},
|
||||
},
|
||||
}));
|
||||
|
||||
describe('displayForm', () => {
|
||||
const getTestUrlMock = vi.fn();
|
||||
|
||||
@@ -124,3 +157,116 @@ describe('displayForm', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('waitingNodeTooltip', () => {
|
||||
it('should return empty string for null or undefined node', () => {
|
||||
expect(waitingNodeTooltip(null)).toBe('');
|
||||
expect(waitingNodeTooltip(undefined)).toBe('');
|
||||
});
|
||||
|
||||
it('should return default waiting message for time resume types', () => {
|
||||
const node: INodeUi = {
|
||||
id: '1',
|
||||
name: 'Wait',
|
||||
type: 'n8n-nodes-base.wait',
|
||||
typeVersion: 1,
|
||||
position: [0, 0],
|
||||
parameters: {
|
||||
resume: 'timeInterval',
|
||||
},
|
||||
};
|
||||
|
||||
expect(waitingNodeTooltip(node)).toBe('Waiting for execution to resume...');
|
||||
});
|
||||
|
||||
it('should return form submission message with URL for form resume type', () => {
|
||||
const node: INodeUi = {
|
||||
id: '1',
|
||||
name: 'Wait',
|
||||
type: 'n8n-nodes-base.wait',
|
||||
typeVersion: 1,
|
||||
position: [0, 0],
|
||||
parameters: {
|
||||
resume: 'form',
|
||||
},
|
||||
};
|
||||
|
||||
const expectedUrl = 'http://localhost:5678/form-waiting/123';
|
||||
expect(waitingNodeTooltip(node)).toBe(
|
||||
`Waiting for form submission: <a href="${expectedUrl}" target="_blank">${expectedUrl}</a>`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should include webhook suffix in URL when provided', () => {
|
||||
const node: INodeUi = {
|
||||
id: '1',
|
||||
name: 'Wait',
|
||||
type: 'n8n-nodes-base.wait',
|
||||
typeVersion: 1,
|
||||
position: [0, 0],
|
||||
parameters: {
|
||||
resume: 'webhook',
|
||||
options: {
|
||||
webhookSuffix: 'test-suffix',
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const expectedUrl = 'http://localhost:5678/webhook-waiting/123/test-suffix';
|
||||
expect(waitingNodeTooltip(node)).toBe(
|
||||
`Waiting for webhook call: <a href="${expectedUrl}" target="_blank">${expectedUrl}</a>`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle form node type', () => {
|
||||
const node: INodeUi = {
|
||||
id: '1',
|
||||
name: 'Form',
|
||||
type: 'n8n-nodes-base.form',
|
||||
typeVersion: 1,
|
||||
position: [0, 0],
|
||||
parameters: {},
|
||||
};
|
||||
|
||||
const expectedUrl = 'http://localhost:5678/form-waiting/123';
|
||||
expect(waitingNodeTooltip(node)).toBe(
|
||||
`Waiting for form submission: <a href="${expectedUrl}" target="_blank">${expectedUrl}</a>`,
|
||||
);
|
||||
});
|
||||
|
||||
it('should handle send and wait operation', () => {
|
||||
const node: INodeUi = {
|
||||
id: '1',
|
||||
name: 'SendWait',
|
||||
type: 'n8n-nodes-base.sendWait',
|
||||
typeVersion: 1,
|
||||
position: [0, 0],
|
||||
parameters: {
|
||||
operation: 'sendAndWait',
|
||||
},
|
||||
};
|
||||
|
||||
expect(waitingNodeTooltip(node)).toBe('Waiting for approval...');
|
||||
});
|
||||
|
||||
it('should ignore object-type webhook suffix', () => {
|
||||
const node: INodeUi = {
|
||||
id: '1',
|
||||
name: 'Wait',
|
||||
type: 'n8n-nodes-base.wait',
|
||||
typeVersion: 1,
|
||||
position: [0, 0],
|
||||
parameters: {
|
||||
resume: 'webhook',
|
||||
options: {
|
||||
webhookSuffix: { some: 'object' },
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
const expectedUrl = 'http://localhost:5678/webhook-waiting/123';
|
||||
expect(waitingNodeTooltip(node)).toBe(
|
||||
`Waiting for webhook call: <a href="${expectedUrl}" target="_blank">${expectedUrl}</a>`,
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user