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: '', + }); + }); + }); +});