From bfec0685f79543145e4f81bea06b068e2b94a9ba Mon Sep 17 00:00:00 2001 From: Shireen Missi <94372015+ShireenMissi@users.noreply.github.com> Date: Mon, 26 Jan 2026 15:13:51 +0100 Subject: [PATCH] fix(Onfleet Trigger Node): Fix content type issue (#24767) --- .../nodes/Onfleet/OnfleetTrigger.node.ts | 2 +- .../Onfleet/test/OnfleetTrigger.node.test.ts | 75 +++++++++++++++++++ 2 files changed, 76 insertions(+), 1 deletion(-) create mode 100644 packages/nodes-base/nodes/Onfleet/test/OnfleetTrigger.node.test.ts diff --git a/packages/nodes-base/nodes/Onfleet/OnfleetTrigger.node.ts b/packages/nodes-base/nodes/Onfleet/OnfleetTrigger.node.ts index eb7e7351658..453d65ad084 100644 --- a/packages/nodes-base/nodes/Onfleet/OnfleetTrigger.node.ts +++ b/packages/nodes-base/nodes/Onfleet/OnfleetTrigger.node.ts @@ -138,7 +138,7 @@ export class OnfleetTrigger implements INodeType { /* Validation request */ /* -------------------------------------------------------------------------- */ const res = this.getResponseObject(); - res.status(200).send(req.query.check); + res.status(200).type('text/plain').send(req.query.check); return { noWebhookResponse: true }; } diff --git a/packages/nodes-base/nodes/Onfleet/test/OnfleetTrigger.node.test.ts b/packages/nodes-base/nodes/Onfleet/test/OnfleetTrigger.node.test.ts new file mode 100644 index 00000000000..293c1b1616a --- /dev/null +++ b/packages/nodes-base/nodes/Onfleet/test/OnfleetTrigger.node.test.ts @@ -0,0 +1,75 @@ +import type { IWebhookFunctions } from 'n8n-workflow'; + +import { OnfleetTrigger } from '../OnfleetTrigger.node'; + +describe('Onfleet Trigger Node', () => { + let node: OnfleetTrigger; + let mockWebhookFunctions: IWebhookFunctions; + + beforeEach(() => { + node = new OnfleetTrigger(); + mockWebhookFunctions = { + getWebhookName: jest.fn(), + getRequestObject: jest.fn(), + getResponseObject: jest.fn(), + getBodyData: jest.fn(), + helpers: { + returnJsonArray: jest.fn().mockImplementation((data) => [{ json: data }]), + }, + } as unknown as IWebhookFunctions; + }); + + describe('webhook', () => { + describe('setup webhook validation', () => { + it('should respond with text/plain content type and check query parameter', async () => { + const mockRequest = { + query: { + check: 'validation-token-123', + }, + }; + + const mockResponse = { + status: jest.fn().mockReturnThis(), + type: jest.fn().mockReturnThis(), + send: jest.fn().mockReturnThis(), + }; + + (mockWebhookFunctions.getWebhookName as jest.Mock).mockReturnValue('setup'); + (mockWebhookFunctions.getRequestObject as jest.Mock).mockReturnValue(mockRequest); + (mockWebhookFunctions.getResponseObject as jest.Mock).mockReturnValue(mockResponse); + + const result = await node.webhook.call(mockWebhookFunctions); + + expect(mockResponse.status).toHaveBeenCalledWith(200); + expect(mockResponse.type).toHaveBeenCalledWith('text/plain'); + expect(mockResponse.send).toHaveBeenCalledWith('validation-token-123'); + expect(result).toEqual({ noWebhookResponse: true }); + }); + }); + + describe('default webhook', () => { + it('should process incoming webhook data', async () => { + const mockRequestData = { + taskId: 'task123', + workerId: 'worker456', + actionContext: 'COMPLETE', + }; + + const mockRequest = { + query: {}, + }; + + (mockWebhookFunctions.getWebhookName as jest.Mock).mockReturnValue('default'); + (mockWebhookFunctions.getRequestObject as jest.Mock).mockReturnValue(mockRequest); + (mockWebhookFunctions.getBodyData as jest.Mock).mockReturnValue(mockRequestData); + + const result = await node.webhook.call(mockWebhookFunctions); + + expect(result).toEqual({ + workflowData: [[{ json: mockRequestData }]], + }); + expect(mockWebhookFunctions.helpers.returnJsonArray).toHaveBeenCalledWith(mockRequestData); + }); + }); + }); +});