mirror of
https://github.com/n8n-io/n8n.git
synced 2024-11-16 01:24:05 -08:00
1d2666b37c
This PR is an example for how we can 1. improve typing and remove boilerplate code in may of our nodes 2. use nock to write effective unit tests for nodes that make external calls ## Review / Merge checklist - [x] PR title and summary are descriptive - [x] Add tests
59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import nock from 'nock';
|
|
import { WorkflowExecute } from 'n8n-core';
|
|
import type { INodeTypes, IRun, IRunExecutionData } from 'n8n-workflow';
|
|
import { createDeferredPromise, Workflow } from 'n8n-workflow';
|
|
import * as Helpers from './Helpers';
|
|
import type { WorkflowTestData } from './types';
|
|
|
|
export async function executeWorkflow(testData: WorkflowTestData, nodeTypes: INodeTypes) {
|
|
if (testData.nock) {
|
|
const { baseUrl, mocks } = testData.nock;
|
|
const agent = nock(baseUrl);
|
|
mocks.forEach(({ method, path, statusCode, responseBody }) =>
|
|
agent[method](path).reply(statusCode, responseBody),
|
|
);
|
|
}
|
|
const executionMode = testData.trigger?.mode ?? 'manual';
|
|
const workflowInstance = new Workflow({
|
|
id: 'test',
|
|
nodes: testData.input.workflowData.nodes,
|
|
connections: testData.input.workflowData.connections,
|
|
active: false,
|
|
nodeTypes,
|
|
settings: testData.input.workflowData.settings,
|
|
});
|
|
const waitPromise = await createDeferredPromise<IRun>();
|
|
const nodeExecutionOrder: string[] = [];
|
|
const additionalData = Helpers.WorkflowExecuteAdditionalData(
|
|
waitPromise,
|
|
nodeExecutionOrder,
|
|
testData,
|
|
);
|
|
|
|
let executionData: IRun;
|
|
const runExecutionData: IRunExecutionData = {
|
|
resultData: {
|
|
runData: {},
|
|
},
|
|
executionData: {
|
|
contextData: {},
|
|
waitingExecution: {},
|
|
waitingExecutionSource: null,
|
|
nodeExecutionStack: [
|
|
{
|
|
node: workflowInstance.getStartNode()!,
|
|
data: {
|
|
main: [[testData.trigger?.input ?? { json: {} }]],
|
|
},
|
|
source: null,
|
|
},
|
|
],
|
|
},
|
|
};
|
|
const workflowExecute = new WorkflowExecute(additionalData, executionMode, runExecutionData);
|
|
executionData = await workflowExecute.processRunExecutionData(workflowInstance);
|
|
|
|
const result = await waitPromise.promise();
|
|
return { executionData, result, nodeExecutionOrder };
|
|
}
|