From 509833a689952feddcfd5155b2c7ff0d6923acbe Mon Sep 17 00:00:00 2001 From: dhaksdhakshin Date: Tue, 23 Jun 2026 11:57:07 +0530 Subject: [PATCH] fix: Correct operation defaults to valid options in several nodes Five 'options' operation selectors declared a default that isn't one of their own option values, so the operation loaded with no valid selection: - Spotify (Track): 'track' -> 'get' - Bitwarden (Event): 'get' -> 'getAll' - Mautic (Company Contact): 'create' -> 'add' - Microsoft Outlook v1 (Folder Message): 'create' -> 'getAll' - n8n (Audit): 'get' -> 'generate' Add a unit test asserting each fixed selector's default is a valid option value. Closes #32347 --- .../descriptions/EventDescription.ts | 2 +- .../nodes/Mautic/CompanyContactDescription.ts | 2 +- .../Outlook/v1/FolderMessageDecription.ts | 2 +- .../nodes-base/nodes/N8n/AuditDescription.ts | 2 +- .../nodes-base/nodes/Spotify/Spotify.node.ts | 2 +- .../test/nodes/operationDefaults.test.ts | 49 +++++++++++++++++++ 6 files changed, 54 insertions(+), 5 deletions(-) create mode 100644 packages/nodes-base/test/nodes/operationDefaults.test.ts diff --git a/packages/nodes-base/nodes/Bitwarden/descriptions/EventDescription.ts b/packages/nodes-base/nodes/Bitwarden/descriptions/EventDescription.ts index d7464b262e7..de7ce0bb27b 100644 --- a/packages/nodes-base/nodes/Bitwarden/descriptions/EventDescription.ts +++ b/packages/nodes-base/nodes/Bitwarden/descriptions/EventDescription.ts @@ -6,7 +6,7 @@ export const eventOperations: INodeProperties[] = [ name: 'operation', type: 'options', noDataExpression: true, - default: 'get', + default: 'getAll', options: [ { name: 'Get Many', diff --git a/packages/nodes-base/nodes/Mautic/CompanyContactDescription.ts b/packages/nodes-base/nodes/Mautic/CompanyContactDescription.ts index 75754aaed06..7392505c4d6 100644 --- a/packages/nodes-base/nodes/Mautic/CompanyContactDescription.ts +++ b/packages/nodes-base/nodes/Mautic/CompanyContactDescription.ts @@ -25,7 +25,7 @@ export const companyContactOperations: INodeProperties[] = [ action: 'Remove a company contact', }, ], - default: 'create', + default: 'add', }, ]; diff --git a/packages/nodes-base/nodes/Microsoft/Outlook/v1/FolderMessageDecription.ts b/packages/nodes-base/nodes/Microsoft/Outlook/v1/FolderMessageDecription.ts index d3d5f17994a..b9e497095ec 100644 --- a/packages/nodes-base/nodes/Microsoft/Outlook/v1/FolderMessageDecription.ts +++ b/packages/nodes-base/nodes/Microsoft/Outlook/v1/FolderMessageDecription.ts @@ -19,7 +19,7 @@ export const folderMessageOperations: INodeProperties[] = [ action: 'Get many folder messages', }, ], - default: 'create', + default: 'getAll', }, ]; diff --git a/packages/nodes-base/nodes/N8n/AuditDescription.ts b/packages/nodes-base/nodes/N8n/AuditDescription.ts index 4a037050307..d8f57dbb86c 100644 --- a/packages/nodes-base/nodes/N8n/AuditDescription.ts +++ b/packages/nodes-base/nodes/N8n/AuditDescription.ts @@ -6,7 +6,7 @@ export const auditOperations: INodeProperties[] = [ name: 'operation', type: 'options', noDataExpression: true, - default: 'get', + default: 'generate', displayOptions: { show: { resource: ['audit'], diff --git a/packages/nodes-base/nodes/Spotify/Spotify.node.ts b/packages/nodes-base/nodes/Spotify/Spotify.node.ts index 7e51b7d11b7..0becd78d11f 100644 --- a/packages/nodes-base/nodes/Spotify/Spotify.node.ts +++ b/packages/nodes-base/nodes/Spotify/Spotify.node.ts @@ -563,7 +563,7 @@ export class Spotify implements INodeType { action: 'Search tracks by keyword', }, ], - default: 'track', + default: 'get', }, { displayName: 'Track ID', diff --git a/packages/nodes-base/test/nodes/operationDefaults.test.ts b/packages/nodes-base/test/nodes/operationDefaults.test.ts new file mode 100644 index 00000000000..563a98cf4ab --- /dev/null +++ b/packages/nodes-base/test/nodes/operationDefaults.test.ts @@ -0,0 +1,49 @@ +import type { INodeProperties } from 'n8n-workflow'; + +import { eventOperations } from '../../nodes/Bitwarden/descriptions/EventDescription'; +import { companyContactOperations } from '../../nodes/Mautic/CompanyContactDescription'; +import { folderMessageOperations } from '../../nodes/Microsoft/Outlook/v1/FolderMessageDecription'; +import { auditOperations } from '../../nodes/N8n/AuditDescription'; +import { Spotify } from '../../nodes/Spotify/Spotify.node'; + +/** + * Asserts that for every `type: 'options'` parameter that declares a static + * list of options and a non-empty string default, the default is one of the + * option values. Parameters with dynamically loaded options (no static + * `options` array) are skipped. + */ +function expectOptionDefaultsToBeValid(properties: INodeProperties[]) { + for (const property of properties) { + if (property.type !== 'options') continue; + if (!Array.isArray(property.options) || property.options.length === 0) continue; + if (typeof property.default !== 'string' || property.default === '') continue; + + const validValues = property.options + .map((option) => ('value' in option ? option.value : undefined)) + .filter((value): value is string | number => value !== undefined); + + expect(validValues).toContain(property.default); + } +} + +describe('operation parameter defaults', () => { + it('Bitwarden Event operation default is a valid option', () => { + expectOptionDefaultsToBeValid(eventOperations); + }); + + it('Mautic Company Contact operation default is a valid option', () => { + expectOptionDefaultsToBeValid(companyContactOperations); + }); + + it('Microsoft Outlook v1 Folder Message operation default is a valid option', () => { + expectOptionDefaultsToBeValid(folderMessageOperations); + }); + + it('n8n Audit operation default is a valid option', () => { + expectOptionDefaultsToBeValid(auditOperations); + }); + + it('Spotify operation defaults are valid options', () => { + expectOptionDefaultsToBeValid(new Spotify().description.properties); + }); +});