From ea2763337e60086cce4463d96fb79b5a2f807f11 Mon Sep 17 00:00:00 2001 From: Mr-KRAMA Date: Wed, 3 Dec 2025 14:59:12 +0530 Subject: [PATCH] fix: replace type casting with String() conversion and add tests --- .../credentials/WooCommerceApi.credentials.ts | 8 +- .../credentials/WooCommerceApi.test.ts | 92 +++++++++++++++++++ 2 files changed, 96 insertions(+), 4 deletions(-) create mode 100644 packages/nodes-base/credentials/WooCommerceApi.test.ts diff --git a/packages/nodes-base/credentials/WooCommerceApi.credentials.ts b/packages/nodes-base/credentials/WooCommerceApi.credentials.ts index 6931ba78d2d..b69be3c46ae 100644 --- a/packages/nodes-base/credentials/WooCommerceApi.credentials.ts +++ b/packages/nodes-base/credentials/WooCommerceApi.credentials.ts @@ -54,14 +54,14 @@ export class WooCommerceApi implements ICredentialType { requestOptions.qs = {}; } Object.assign(requestOptions.qs, { - consumer_key: credentials.consumerKey, - consumer_secret: credentials.consumerSecret, + consumer_key: String(credentials.consumerKey || ''), + consumer_secret: String(credentials.consumerSecret || ''), }); } else { // Use HTTP Basic Auth requestOptions.auth = { - user: credentials.consumerKey as string, - password: credentials.consumerSecret as string, + user: String(credentials.consumerKey || ''), + password: String(credentials.consumerSecret || ''), }; } return requestOptions; diff --git a/packages/nodes-base/credentials/WooCommerceApi.test.ts b/packages/nodes-base/credentials/WooCommerceApi.test.ts new file mode 100644 index 00000000000..e2f63db1b7b --- /dev/null +++ b/packages/nodes-base/credentials/WooCommerceApi.test.ts @@ -0,0 +1,92 @@ +import { WooCommerceApi } from './WooCommerceApi.credentials'; +import type { ICredentialDataDecryptedObject, IHttpRequestOptions } from 'n8n-workflow'; + +describe('WooCommerceApi', () => { + let wooCommerceApi: WooCommerceApi; + + beforeEach(() => { + wooCommerceApi = new WooCommerceApi(); + }); + + describe('authenticate', () => { + it('should use Basic Auth by default', async () => { + const credentials: ICredentialDataDecryptedObject = { + consumerKey: 'test_key', + consumerSecret: 'test_secret', + includeCredentialsInQuery: false, + }; + + const requestOptions: IHttpRequestOptions = { + url: 'https://example.com/api', + }; + + const result = await wooCommerceApi.authenticate(credentials, requestOptions); + + expect(result.auth).toEqual({ + user: 'test_key', + password: 'test_secret', + }); + expect(result.qs).toBeUndefined(); + }); + + it('should use query parameters when includeCredentialsInQuery is true', async () => { + const credentials: ICredentialDataDecryptedObject = { + consumerKey: 'test_key', + consumerSecret: 'test_secret', + includeCredentialsInQuery: true, + }; + + const requestOptions: IHttpRequestOptions = { + url: 'https://example.com/api', + }; + + const result = await wooCommerceApi.authenticate(credentials, requestOptions); + + expect(result.qs).toEqual({ + consumer_key: 'test_key', + consumer_secret: 'test_secret', + }); + expect(result.auth).toBeUndefined(); + }); + + it('should handle existing query parameters', async () => { + const credentials: ICredentialDataDecryptedObject = { + consumerKey: 'test_key', + consumerSecret: 'test_secret', + includeCredentialsInQuery: true, + }; + + const requestOptions: IHttpRequestOptions = { + url: 'https://example.com/api', + qs: { existing: 'param' }, + }; + + const result = await wooCommerceApi.authenticate(credentials, requestOptions); + + expect(result.qs).toEqual({ + existing: 'param', + consumer_key: 'test_key', + consumer_secret: 'test_secret', + }); + }); + + it('should handle non-string credentials gracefully', async () => { + const credentials: ICredentialDataDecryptedObject = { + consumerKey: null, + consumerSecret: undefined, + includeCredentialsInQuery: false, + }; + + const requestOptions: IHttpRequestOptions = { + url: 'https://example.com/api', + }; + + const result = await wooCommerceApi.authenticate(credentials, requestOptions); + + expect(result.auth).toEqual({ + user: '', + password: '', + }); + }); + }); +});