|
1 | 1 | import { Container } from '@n8n/di';
|
2 | 2 | import { mock } from 'jest-mock-extended';
|
3 | 3 | import { Logger } from 'n8n-core';
|
| 4 | +import { FormTrigger } from 'n8n-nodes-base/nodes/Form/FormTrigger.node'; |
| 5 | +import { ScheduleTrigger } from 'n8n-nodes-base/nodes/Schedule/ScheduleTrigger.node'; |
4 | 6 | import { NodeApiError, Workflow } from 'n8n-workflow';
|
5 |
| -import type { IWebhookData, IWorkflowBase, WorkflowActivateMode } from 'n8n-workflow'; |
| 7 | +import type { |
| 8 | + IWebhookData, |
| 9 | + IWorkflowBase, |
| 10 | + WorkflowActivateMode, |
| 11 | + INodeTypeData, |
| 12 | +} from 'n8n-workflow'; |
6 | 13 |
|
7 | 14 | import { ActiveExecutions } from '@/active-executions';
|
8 | 15 | import { ActiveWorkflowManager } from '@/active-workflow-manager';
|
9 | 16 | import type { WebhookEntity } from '@/databases/entities/webhook-entity';
|
| 17 | +import { WorkflowRepository } from '@/databases/repositories/workflow.repository'; |
10 | 18 | import { ExecutionService } from '@/executions/execution.service';
|
11 | 19 | import { ExternalHooks } from '@/external-hooks';
|
12 | 20 | import { NodeTypes } from '@/node-types';
|
@@ -43,7 +51,18 @@ beforeAll(async () => {
|
43 | 51 |
|
44 | 52 | activeWorkflowManager = Container.get(ActiveWorkflowManager);
|
45 | 53 |
|
46 |
| - await utils.initNodeTypes(); |
| 54 | + const nodes: INodeTypeData = { |
| 55 | + 'n8n-nodes-base.scheduleTrigger': { |
| 56 | + type: new ScheduleTrigger(), |
| 57 | + sourcePath: '', |
| 58 | + }, |
| 59 | + 'n8n-nodes-base.formTrigger': { |
| 60 | + type: new FormTrigger(), |
| 61 | + sourcePath: '', |
| 62 | + }, |
| 63 | + }; |
| 64 | + |
| 65 | + await utils.initNodeTypes(nodes); |
47 | 66 |
|
48 | 67 | const owner = await createOwner();
|
49 | 68 | createActiveWorkflow = async () => await createWorkflow({ active: true }, owner);
|
@@ -136,6 +155,43 @@ describe('add()', () => {
|
136 | 155 | },
|
137 | 156 | );
|
138 | 157 | });
|
| 158 | + |
| 159 | + test('should count workflow triggers correctly when node has multiple webhooks', async () => { |
| 160 | + const workflowRepositoryInstance = Container.get(WorkflowRepository); |
| 161 | + const updateWorkflowTriggerCountSpy = jest.spyOn( |
| 162 | + workflowRepositoryInstance, |
| 163 | + 'updateWorkflowTriggerCount', |
| 164 | + ); |
| 165 | + await activeWorkflowManager.init(); |
| 166 | + |
| 167 | + // Mock all of the webhooks |
| 168 | + const mockWebhooks: IWebhookData[] = [ |
| 169 | + mock<IWebhookData>({ node: 'Form Trigger', httpMethod: 'GET', path: '/webhook-path' }), |
| 170 | + mock<IWebhookData>({ node: 'Form Trigger', httpMethod: 'POST', path: '/webhook-path' }), |
| 171 | + ]; |
| 172 | + webhookService.getNodeWebhooks.mockReturnValue(mockWebhooks); |
| 173 | + webhookService.createWebhook.mockReturnValue( |
| 174 | + mock<WebhookEntity>({ webhookPath: '/webhook-path' }), |
| 175 | + ); |
| 176 | + |
| 177 | + // Create a workflow which has a form trigger |
| 178 | + const dbWorkflow = await createWorkflow({ |
| 179 | + nodes: [ |
| 180 | + { |
| 181 | + id: 'uuid-1', |
| 182 | + parameters: { path: 'test-webhook-path', options: {} }, |
| 183 | + name: 'Form Trigger', |
| 184 | + type: 'n8n-nodes-base.formTrigger', |
| 185 | + typeVersion: 1, |
| 186 | + position: [500, 300], |
| 187 | + }, |
| 188 | + ], |
| 189 | + }); |
| 190 | + |
| 191 | + await activeWorkflowManager.add(dbWorkflow.id, 'activate'); |
| 192 | + |
| 193 | + expect(updateWorkflowTriggerCountSpy).toHaveBeenCalledWith(dbWorkflow.id, 1); |
| 194 | + }); |
139 | 195 | });
|
140 | 196 |
|
141 | 197 | describe('removeAll()', () => {
|
|
0 commit comments