Skip to content

Commit e88c2a0

Browse files
committed
Update the implementation to match the view event
1 parent d3f0402 commit e88c2a0

File tree

3 files changed

+87
-27
lines changed

3 files changed

+87
-27
lines changed

spec/src/modules/tracker.js

Lines changed: 79 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -5376,34 +5376,96 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => {
53765376
expect(tracker.trackRecommendationClick(parametersWithSeedItemIds)).to.equal(true);
53775377
});
53785378

5379-
it('Should throw an error when invalid seedItemIds format is provided (number)', () => {
5380-
const { tracker } = new ConstructorIO({ apiKey: testApiKey });
5381-
const parametersWithInvalidSeedItemIds = {
5379+
it('Should respond with a valid response and convert seedItemIds to array when provided as string', (done) => {
5380+
const { tracker } = new ConstructorIO({
5381+
apiKey: testApiKey,
5382+
fetch: fetchSpy,
5383+
...requestQueueOptions,
5384+
});
5385+
const parametersWithSeedItemIds = {
5386+
...requiredParameters,
5387+
seedItemIds: 'item-123',
5388+
};
5389+
tracker.on('success', (responseParams) => {
5390+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
5391+
// Request
5392+
expect(fetchSpy).to.have.been.called;
5393+
expect(requestParams).to.have.property('seed_item_ids').to.deep.equal(['item-123']);
5394+
// Response
5395+
expect(responseParams).to.have.property('method').to.equal('POST');
5396+
expect(responseParams).to.have.property('message');
5397+
done();
5398+
});
5399+
expect(tracker.trackRecommendationClick(parametersWithSeedItemIds)).to.equal(true);
5400+
});
5401+
5402+
it('Should respond with a valid response and convert seedItemIds to array when provided as number', (done) => {
5403+
const { tracker } = new ConstructorIO({
5404+
apiKey: testApiKey,
5405+
fetch: fetchSpy,
5406+
...requestQueueOptions,
5407+
});
5408+
const parametersWithSeedItemIds = {
53825409
...requiredParameters,
53835410
seedItemIds: 123,
53845411
};
5385-
expect(tracker.trackRecommendationClick(parametersWithInvalidSeedItemIds)).to.be.an('error');
5386-
expect(tracker.trackRecommendationClick(parametersWithInvalidSeedItemIds).message).to.equal('seedItemIds must be an array of strings');
5412+
tracker.on('success', (responseParams) => {
5413+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
5414+
// Request
5415+
expect(fetchSpy).to.have.been.called;
5416+
expect(requestParams).to.have.property('seed_item_ids').to.deep.equal(['123']);
5417+
// Response
5418+
expect(responseParams).to.have.property('method').to.equal('POST');
5419+
expect(responseParams).to.have.property('message');
5420+
done();
5421+
});
5422+
expect(tracker.trackRecommendationClick(parametersWithSeedItemIds)).to.equal(true);
53875423
});
53885424

5389-
it('Should throw an error when invalid seedItemIds format is provided (array with non-strings)', () => {
5390-
const { tracker } = new ConstructorIO({ apiKey: testApiKey });
5391-
const parametersWithInvalidSeedItemIds = {
5425+
it('Should respond with a valid response and omit seed_item_ids when seedItemIds is empty string', (done) => {
5426+
const { tracker } = new ConstructorIO({
5427+
apiKey: testApiKey,
5428+
fetch: fetchSpy,
5429+
...requestQueueOptions,
5430+
});
5431+
const parametersWithSeedItemIds = {
53925432
...requiredParameters,
5393-
seedItemIds: ['item-123', 456, 'item-789'],
5433+
seedItemIds: '',
53945434
};
5395-
expect(tracker.trackRecommendationClick(parametersWithInvalidSeedItemIds)).to.be.an('error');
5396-
expect(tracker.trackRecommendationClick(parametersWithInvalidSeedItemIds).message).to.equal('seedItemIds must be an array of strings');
5435+
tracker.on('success', (responseParams) => {
5436+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
5437+
// Request
5438+
expect(fetchSpy).to.have.been.called;
5439+
expect(requestParams).to.not.have.property('seed_item_ids');
5440+
// Response
5441+
expect(responseParams).to.have.property('method').to.equal('POST');
5442+
expect(responseParams).to.have.property('message');
5443+
done();
5444+
});
5445+
expect(tracker.trackRecommendationClick(parametersWithSeedItemIds)).to.equal(true);
53975446
});
53985447

5399-
it('Should throw an error when invalid seedItemIds format is provided (object)', () => {
5400-
const { tracker } = new ConstructorIO({ apiKey: testApiKey });
5401-
const parametersWithInvalidSeedItemIds = {
5448+
it('Should respond with a valid response and omit seed_item_ids when seedItemIds is empty array', (done) => {
5449+
const { tracker } = new ConstructorIO({
5450+
apiKey: testApiKey,
5451+
fetch: fetchSpy,
5452+
...requestQueueOptions,
5453+
});
5454+
const parametersWithSeedItemIds = {
54025455
...requiredParameters,
5403-
seedItemIds: { id: 'item-123' },
5456+
seedItemIds: [],
54045457
};
5405-
expect(tracker.trackRecommendationClick(parametersWithInvalidSeedItemIds)).to.be.an('error');
5406-
expect(tracker.trackRecommendationClick(parametersWithInvalidSeedItemIds).message).to.equal('seedItemIds must be an array of strings');
5458+
tracker.on('success', (responseParams) => {
5459+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
5460+
// Request
5461+
expect(fetchSpy).to.have.been.called;
5462+
expect(requestParams).to.not.have.property('seed_item_ids');
5463+
// Response
5464+
expect(responseParams).to.have.property('method').to.equal('POST');
5465+
expect(responseParams).to.have.property('message');
5466+
done();
5467+
});
5468+
expect(tracker.trackRecommendationClick(parametersWithSeedItemIds)).to.equal(true);
54075469
});
54085470
});
54095471

src/modules/tracker.js

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,7 +1357,7 @@ class Tracker {
13571357
* @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
13581358
* @param {string} [parameters.slCampaignId] - Pass campaign id of sponsored listing
13591359
* @param {string} [parameters.slCampaignOwner] - Pass campaign owner of sponsored listing
1360-
* @param {string[]} [parameters.seedItemIds] - Item ID(s) of the seed item
1360+
* @param {string[]|string|number} [parameters.seedItemIds] - Item ID(s) to be used as seed
13611361
* @returns {(true|Error)}
13621362
* @description User clicked an item that appeared within a list of recommended results
13631363
* @example
@@ -1466,14 +1466,12 @@ class Tracker {
14661466
bodyParams.sl_campaign_owner = slCampaignOwner;
14671467
}
14681468

1469-
if (seedItemIds) {
1470-
// Validate seedItemIds format
1471-
if (Array.isArray(seedItemIds) && seedItemIds.every((id) => typeof id === 'string')) {
1472-
bodyParams.seed_item_ids = seedItemIds;
1473-
} else {
1474-
this.requests.send();
1475-
return new Error('seedItemIds must be an array of strings');
1476-
}
1469+
if (typeof seedItemIds === 'number') {
1470+
bodyParams.seed_item_ids = [String(seedItemIds)];
1471+
} else if (seedItemIds?.length && typeof seedItemIds === 'string') {
1472+
bodyParams.seed_item_ids = [seedItemIds];
1473+
} else if (seedItemIds?.length && Array.isArray(seedItemIds)) {
1474+
bodyParams.seed_item_ids = seedItemIds;
14771475
}
14781476

14791477
const requestURL = `${requestPath}${applyParamsAsString({}, this.options)}`;

src/types/tracker.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ declare class Tracker {
165165
analyticsTags?: Record<string, string>;
166166
slCampaignId?: string;
167167
slCampaignOwner?: string;
168-
seedItemIds?: string[];
168+
seedItemIds?: string[] | string | number;
169169
},
170170
networkParameters?: NetworkParameters
171171
): true | Error;

0 commit comments

Comments
 (0)