From 580a7420e30475b12a738ccbaf7b5011c734ed2a Mon Sep 17 00:00:00 2001 From: Baloo Date: Wed, 10 Jun 2026 21:09:55 +0000 Subject: [PATCH] CDP-6131: make triggerBroadcast data and recipients params optional --- lib/api.ts | 27 +++++++++++++++------------ test/api.ts | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 12 deletions(-) diff --git a/lib/api.ts b/lib/api.ts index d41c19c..5e84637 100644 --- a/lib/api.ts +++ b/lib/api.ts @@ -226,19 +226,22 @@ export class APIClient { * @param recipients Recipient selector. See above. * @returns The parsed JSON response body. */ - triggerBroadcast(broadcastId: string | number, data: RequestData, recipients: Recipients) { - let payload = {}; - let customRecipientField = ( - Object.keys(BROADCASTS_ALLOWED_RECIPIENT_FIELDS) as BroadcastsAllowedRecipientFieldsKeys[] - ).find((field) => recipients[field]); - - if (customRecipientField) { - payload = Object.assign({ data }, filterRecipientsDataForField(recipients, customRecipientField)); + triggerBroadcast(broadcastId: string | number, data: RequestData = {}, recipients: Recipients = {}) { + let payload: Record; + const hasRecipients = Object.keys(recipients).length > 0; + + if (hasRecipients) { + const customRecipientField = ( + Object.keys(BROADCASTS_ALLOWED_RECIPIENT_FIELDS) as BroadcastsAllowedRecipientFieldsKeys[] + ).find((field) => recipients[field]); + + if (customRecipientField) { + payload = Object.assign({ data }, filterRecipientsDataForField(recipients, customRecipientField)); + } else { + payload = { data, recipients }; + } } else { - payload = { - data, - recipients, - }; + payload = { data }; } return this.request.post(`${this.apiRoot}/campaigns/${encodeURIComponent(broadcastId)}/triggers`, payload); diff --git a/test/api.ts b/test/api.ts index 9127a41..d44a943 100644 --- a/test/api.ts +++ b/test/api.ts @@ -390,6 +390,56 @@ test('#triggerBroadcast discards extraneous fields', (t) => { ); }); +test('#triggerBroadcast works with no data and no recipients', (t) => { + sinon.stub(t.context.client.request, 'post'); + t.context.client.triggerBroadcast(1); + t.truthy( + (t.context.client.request.post as SinonStub).calledWith(`${RegionUS.apiUrl}/campaigns/1/triggers`, { + data: {}, + }), + ); +}); + +test('#triggerBroadcast works with data only (no recipients)', (t) => { + sinon.stub(t.context.client.request, 'post'); + t.context.client.triggerBroadcast(1, { type: 'data' }); + t.truthy( + (t.context.client.request.post as SinonStub).calledWith(`${RegionUS.apiUrl}/campaigns/1/triggers`, { + data: { type: 'data' }, + }), + ); +}); + +test('#triggerBroadcast works with empty recipients object', (t) => { + sinon.stub(t.context.client.request, 'post'); + t.context.client.triggerBroadcast(1, { type: 'data' }, {}); + t.truthy( + (t.context.client.request.post as SinonStub).calledWith(`${RegionUS.apiUrl}/campaigns/1/triggers`, { + data: { type: 'data' }, + }), + ); +}); + +test('#triggerBroadcast works with undefined data and undefined recipients', (t) => { + sinon.stub(t.context.client.request, 'post'); + t.context.client.triggerBroadcast(1, undefined, undefined); + t.truthy( + (t.context.client.request.post as SinonStub).calledWith(`${RegionUS.apiUrl}/campaigns/1/triggers`, { + data: {}, + }), + ); +}); + +test('#triggerBroadcast works with empty data and empty recipients', (t) => { + sinon.stub(t.context.client.request, 'post'); + t.context.client.triggerBroadcast(1, {}, {}); + t.truthy( + (t.context.client.request.post as SinonStub).calledWith(`${RegionUS.apiUrl}/campaigns/1/triggers`, { + data: {}, + }), + ); +}); + test('#listExports: success', (t) => { sinon.stub(t.context.client.request, 'get'); t.context.client.listExports();