From b5c831122ca873776ee8fe3a6b4a15f603d5885d Mon Sep 17 00:00:00 2001 From: Omar Ajoue Date: Tue, 30 Aug 2022 10:49:30 +0200 Subject: [PATCH] Add some tests to ActiveExecutions file (#3957) * Add some tests to ActiveExecutions file --- .vscode/launch.json | 17 +++- .../cli/test/unit/ActiveExecutions.test.ts | 91 +++++++++++++++++++ 2 files changed, 106 insertions(+), 2 deletions(-) create mode 100644 packages/cli/test/unit/ActiveExecutions.test.ts diff --git a/.vscode/launch.json b/.vscode/launch.json index c80cf84bd1..ce665b0bd7 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -19,8 +19,21 @@ "type": "node", "env": { // "N8N_PORT": "5679", - } - } + }, + }, + { + "name": "Debug CLI tests", + "cwd": "${workspaceFolder}/packages/cli", + "runtimeExecutable": "npm", + "args": [ + "run", + "test", + // "--", + // "ActiveExecutions" + ], + "type": "node", + "request": "launch" + }, ] /** diff --git a/packages/cli/test/unit/ActiveExecutions.test.ts b/packages/cli/test/unit/ActiveExecutions.test.ts new file mode 100644 index 0000000000..7be21960ef --- /dev/null +++ b/packages/cli/test/unit/ActiveExecutions.test.ts @@ -0,0 +1,91 @@ +import { ActiveExecutions, IWorkflowExecutionDataProcess, Db } from '../../src'; +import { mocked } from 'jest-mock'; +import PCancelable from 'p-cancelable'; +import { v4 as uuid } from 'uuid'; +import type { IRun } from 'n8n-workflow'; + +const FAKE_EXECUTION_ID = '15'; +const FAKE_SECOND_EXECUTION_ID = '20'; + +jest.mock('../../src/Db', () => { + return { + collections: { + Execution: { + save: jest.fn(async () => Promise.resolve({id: FAKE_EXECUTION_ID})), + update: jest.fn(), + } + } + }; +}); + +describe('ActiveExecutions', () => { + + let activeExecutions: ActiveExecutions.ActiveExecutions; + + beforeEach(() => { + activeExecutions = new ActiveExecutions.ActiveExecutions(); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + test('Should initialize activeExecutions with empty list', () => { + expect(activeExecutions.getActiveExecutions().length).toBe(0); + }); + + test('Should add execution to active execution list', async () => { + const newExecution = mockExecutionData(); + const executionId = await activeExecutions.add(newExecution); + expect(executionId).toBe(FAKE_EXECUTION_ID); + expect(activeExecutions.getActiveExecutions().length).toBe(1); + expect(mocked(Db.collections.Execution.save)).toHaveBeenCalledTimes(1); + expect(mocked(Db.collections.Execution.update)).toHaveBeenCalledTimes(0); + }); + + test('Should update execution if add is called with execution ID', async () => { + const newExecution = mockExecutionData(); + const executionId = await activeExecutions.add(newExecution, undefined, FAKE_SECOND_EXECUTION_ID); + expect(executionId).toBe(FAKE_SECOND_EXECUTION_ID); + expect(activeExecutions.getActiveExecutions().length).toBe(1); + expect(mocked(Db.collections.Execution.save)).toHaveBeenCalledTimes(0); + expect(mocked(Db.collections.Execution.update)).toHaveBeenCalledTimes(1); + }); + + test('Should fail attaching execution to invalid executionId', async () => { + const deferredPromise = mockCancelablePromise(); + expect(() => { + activeExecutions.attachWorkflowExecution(FAKE_EXECUTION_ID, deferredPromise); + }).toThrow(); + }); + + test('Should successfully attach execution to valid executionId', async () => { + const newExecution = mockExecutionData(); + await activeExecutions.add(newExecution, undefined, FAKE_EXECUTION_ID); + const deferredPromise = mockCancelablePromise(); + activeExecutions.attachWorkflowExecution(FAKE_EXECUTION_ID, deferredPromise); + }); + +}); + +function mockExecutionData(): IWorkflowExecutionDataProcess { + return { + executionMode: 'manual', + workflowData: { + name: 'Test workflow 1', + active: false, + createdAt: new Date(), + updatedAt: new Date(), + nodes: [], + connections: {} + }, + userId: uuid(), + } +} + +function mockCancelablePromise(): PCancelable { + return new PCancelable(async (resolve) => { + resolve(); + }); +} +