From 8635dcde2351abb57593f3cecda9495aa645e9b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ra=C3=BAl=20G=C3=B3mez=20Morales?= Date: Sat, 30 May 2026 10:58:50 +0200 Subject: [PATCH] fix(HighLevel Node): Encode contact lookup query parameters (#31365) Co-authored-by: Dawid Myslak --- .../v1/description/ContactDescription.ts | 14 +++++++- .../v1/test/ContactDescription.test.ts | 36 +++++++++++++++++++ 2 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 packages/nodes-base/nodes/HighLevel/v1/test/ContactDescription.test.ts diff --git a/packages/nodes-base/nodes/HighLevel/v1/description/ContactDescription.ts b/packages/nodes-base/nodes/HighLevel/v1/description/ContactDescription.ts index 0b29b34f3a0..c3242e59155 100644 --- a/packages/nodes-base/nodes/HighLevel/v1/description/ContactDescription.ts +++ b/packages/nodes-base/nodes/HighLevel/v1/description/ContactDescription.ts @@ -100,7 +100,7 @@ export const contactOperations: INodeProperties[] = [ routing: { request: { method: 'GET', - url: '=/contacts/lookup?email={{$parameter.email}}&phone={{$parameter.phone}}', + url: '/contacts/lookup', }, output: { postReceive: [ @@ -830,6 +830,12 @@ const lookupProperties: INodeProperties[] = [ }, }, default: '', + routing: { + send: { + type: 'query', + property: 'email', + }, + }, }, { displayName: 'Phone', @@ -844,6 +850,12 @@ const lookupProperties: INodeProperties[] = [ }, }, default: '', + routing: { + send: { + type: 'query', + property: 'phone', + }, + }, }, ]; diff --git a/packages/nodes-base/nodes/HighLevel/v1/test/ContactDescription.test.ts b/packages/nodes-base/nodes/HighLevel/v1/test/ContactDescription.test.ts new file mode 100644 index 00000000000..66d7c78b1f4 --- /dev/null +++ b/packages/nodes-base/nodes/HighLevel/v1/test/ContactDescription.test.ts @@ -0,0 +1,36 @@ +import type { INodeProperties, INodePropertyOptions } from 'n8n-workflow'; + +import { contactFields, contactOperations } from '../description/ContactDescription'; + +// Reach into the actual routing config so the test breaks if the lookup +// operation stops sending its inputs as discrete query parameters. +const lookupOperation = (contactOperations[0].options as INodePropertyOptions[]).find( + (option) => option.value === 'lookup', +); + +const findLookupField = (name: string): INodeProperties => { + const field = contactFields.find( + (candidate) => + candidate.name === name && + ((candidate.displayOptions?.show?.operation as string[] | undefined) ?? []).includes( + 'lookup', + ), + ); + + if (!field) { + throw new Error(`Expected to find lookup field "${name}"`); + } + + return field; +}; + +describe('HighLevel V1 - Contact Lookup query parameters', () => { + it('builds the request from a static path, not by interpolating user input into the URL', () => { + expect(lookupOperation?.routing?.request?.url).toBe('/contacts/lookup'); + }); + + it('sends email and phone as discrete query parameters', () => { + expect(findLookupField('email').routing?.send).toEqual({ type: 'query', property: 'email' }); + expect(findLookupField('phone').routing?.send).toEqual({ type: 'query', property: 'phone' }); + }); +});