diff --git a/packages/nodes-base/test/nodes/Airtable/Airtable.node.test.ts b/packages/nodes-base/test/nodes/Airtable/Airtable.node.test.ts index cb03648804..f5ef28a7a9 100644 --- a/packages/nodes-base/test/nodes/Airtable/Airtable.node.test.ts +++ b/packages/nodes-base/test/nodes/Airtable/Airtable.node.test.ts @@ -44,8 +44,7 @@ describe('Execute Airtable Node', () => { }, ]; - const nodes: INodeType[] = [new ManualTrigger(), new Airtable()]; - const nodeTypes = Helpers.setup(nodes); + const nodeTypes = Helpers.setup(tests); for (const testData of tests) { test(testData.description, async () => { diff --git a/packages/nodes-base/test/nodes/Helpers.ts b/packages/nodes-base/test/nodes/Helpers.ts index 5c5ab95fe0..da548f7002 100644 --- a/packages/nodes-base/test/nodes/Helpers.ts +++ b/packages/nodes-base/test/nodes/Helpers.ts @@ -1,5 +1,5 @@ import { readFileSync } from 'fs'; -import { Credentials } from 'n8n-core'; +import { Credentials, loadClassInIsolation } from 'n8n-core'; import { ICredentialDataDecryptedObject, ICredentialsHelper, @@ -18,11 +18,13 @@ import { IVersionedNodeType, IWorkflowBase, IWorkflowExecuteAdditionalData, + LoadingDetails, LoggerProxy, NodeHelpers, WorkflowHooks, } from 'n8n-workflow'; import { WorkflowTestData } from './types'; +import path from 'path'; export class CredentialsHelper extends ICredentialsHelper { async authenticate( @@ -143,11 +145,42 @@ export function NodeTypes(): NodeTypesClass { return nodeTypesInstance; } -export function setup(nodes: INodeType[]) { - const nodeTypes = NodeTypes(); - for (const node of nodes) { - nodeTypes.addNode('n8n-nodes-base.' + node.description.name, node); +let knownNodes: Record | null = null; + +const loadKnownNodes = (): Record => { + if (knownNodes === null) { + knownNodes = JSON.parse(readFileSync('dist/known/nodes.json').toString()); } + return knownNodes!; +}; + +export function setup(testData: Array | WorkflowTestData) { + if (!Array.isArray(testData)) { + testData = [testData]; + } + + const knownNodes = loadKnownNodes(); + + const nodeTypes = NodeTypes(); + const nodeNames = Array.from( + new Set(testData.flatMap((data) => data.input.workflowData.nodes.map((n) => n.type))), + ); + + for (const nodeName of nodeNames) { + if (!nodeName.startsWith('n8n-nodes-base.')) { + throw new Error(`Unknown node type: ${nodeName}`); + } + const loadInfo = knownNodes[nodeName.replace('n8n-nodes-base.', '')]; + if (!loadInfo) { + throw new Error(`Unknown node type: ${nodeName}`); + } + const node = loadClassInIsolation( + path.join(process.cwd(), loadInfo.sourcePath), + loadInfo.className, + ) as INodeType; + nodeTypes.addNode(nodeName, node); + } + const fakeLogger = { log: () => {}, debug: () => {}, diff --git a/packages/nodes-base/test/nodes/If/If.node.test.ts b/packages/nodes-base/test/nodes/If/If.node.test.ts index 5c14175547..6efeab840d 100644 --- a/packages/nodes-base/test/nodes/If/If.node.test.ts +++ b/packages/nodes-base/test/nodes/If/If.node.test.ts @@ -38,8 +38,7 @@ describe('Execute If Node', () => { }, ]; - const nodes: INodeType[] = [new ManualTrigger(), new Code(), new Set(), new If(), new NoOp()]; - const nodeTypes = Helpers.setup(nodes); + const nodeTypes = Helpers.setup(tests); for (const testData of tests) { test(testData.description, async () => { diff --git a/packages/nodes-base/test/nodes/Set/SetNode.test.ts b/packages/nodes-base/test/nodes/Set/SetNode.test.ts index 75407df9bf..fc4370831e 100644 --- a/packages/nodes-base/test/nodes/Set/SetNode.test.ts +++ b/packages/nodes-base/test/nodes/Set/SetNode.test.ts @@ -177,8 +177,7 @@ describe('Execute Set Node', () => { }, ]; - const nodes: INodeType[] = [new Start(), new Set()]; - const nodeTypes = Helpers.setup(nodes); + const nodeTypes = Helpers.setup(tests); for (const testData of tests) { test(testData.description, async () => { diff --git a/packages/nodes-base/test/nodes/Start/StartNode.test.ts b/packages/nodes-base/test/nodes/Start/StartNode.test.ts index 5c9ccf8c6c..06c536c9cb 100644 --- a/packages/nodes-base/test/nodes/Start/StartNode.test.ts +++ b/packages/nodes-base/test/nodes/Start/StartNode.test.ts @@ -30,8 +30,7 @@ describe('Execute Start Node', () => { }, ]; - const nodes: INodeType[] = [new Start()]; - const nodeTypes = Helpers.setup(nodes); + const nodeTypes = Helpers.setup(tests); for (const testData of tests) { test(testData.description, async () => {