Skip to content

Commit 09d661d

Browse files
authored
[CI-4383] Add optional seed item ids to trackRecommendationView (#375)
* Add optional seed item ids to trackRecommendationView method * Lint * Add the empty line back * Accept seedItemIds as a number, add tests
1 parent 44b6864 commit 09d661d

2 files changed

Lines changed: 155 additions & 0 deletions

File tree

spec/src/modules/tracker.js

Lines changed: 145 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4660,6 +4660,151 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => {
46604660

46614661
expect(tracker.trackRecommendationView(requiredParameters)).to.equal(true);
46624662
});
4663+
4664+
it('Should respond with a valid response when seedItemIds is an array', (done) => {
4665+
const seedItemIds = ['123'];
4666+
const { tracker } = new ConstructorIO({
4667+
apiKey: testApiKey,
4668+
fetch: fetchSpy,
4669+
...requestQueueOptions,
4670+
});
4671+
const requiredParamsWithSeedItemIds = {
4672+
seedItemIds,
4673+
...requiredParameters,
4674+
};
4675+
4676+
tracker.on('success', (responseParams) => {
4677+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
4678+
4679+
// Request
4680+
expect(fetchSpy).to.have.been.called;
4681+
expect(requestParams).to.have.property('seed_item_ids').to.deep.equal(['123']);
4682+
4683+
// Response
4684+
expect(responseParams).to.have.property('method').to.equal('POST');
4685+
expect(responseParams).to.have.property('message');
4686+
4687+
done();
4688+
});
4689+
4690+
expect(tracker.trackRecommendationView(requiredParamsWithSeedItemIds)).to.equal(true);
4691+
});
4692+
4693+
it('Should respond with a valid response and convert seedItemIds to an array if it\'s is a number', (done) => {
4694+
const seedItemIds = 123;
4695+
const { tracker } = new ConstructorIO({
4696+
apiKey: testApiKey,
4697+
fetch: fetchSpy,
4698+
...requestQueueOptions,
4699+
});
4700+
const requiredParamsWithSeedItemIds = {
4701+
seedItemIds,
4702+
...requiredParameters,
4703+
};
4704+
4705+
tracker.on('success', (responseParams) => {
4706+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
4707+
4708+
// Request
4709+
expect(fetchSpy).to.have.been.called;
4710+
expect(requestParams).to.have.property('seed_item_ids').to.deep.equal(['123']);
4711+
4712+
// Response
4713+
expect(responseParams).to.have.property('method').to.equal('POST');
4714+
expect(responseParams).to.have.property('message');
4715+
4716+
done();
4717+
});
4718+
4719+
expect(tracker.trackRecommendationView(requiredParamsWithSeedItemIds)).to.equal(true);
4720+
});
4721+
4722+
it('Should respond with a valid response and convert seedItemIds to an array if it\'s a string', (done) => {
4723+
const seedItemIds = '123';
4724+
const { tracker } = new ConstructorIO({
4725+
apiKey: testApiKey,
4726+
fetch: fetchSpy,
4727+
...requestQueueOptions,
4728+
});
4729+
const requiredParamsWithSeedItemIds = {
4730+
seedItemIds,
4731+
...requiredParameters,
4732+
};
4733+
4734+
tracker.on('success', (responseParams) => {
4735+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
4736+
4737+
// Request
4738+
expect(fetchSpy).to.have.been.called;
4739+
expect(requestParams).to.have.property('seed_item_ids').to.deep.equal(['123']);
4740+
4741+
// Response
4742+
expect(responseParams).to.have.property('method').to.equal('POST');
4743+
expect(responseParams).to.have.property('message');
4744+
4745+
done();
4746+
});
4747+
4748+
expect(tracker.trackRecommendationView(requiredParamsWithSeedItemIds)).to.equal(true);
4749+
});
4750+
4751+
it('Should respond with a valid response and omit seed_item_ids if seedItemIds is null', (done) => {
4752+
const seedItemIds = null;
4753+
const { tracker } = new ConstructorIO({
4754+
apiKey: testApiKey,
4755+
fetch: fetchSpy,
4756+
...requestQueueOptions,
4757+
});
4758+
const requiredParamsWithSeedItemIds = {
4759+
seedItemIds,
4760+
...requiredParameters,
4761+
};
4762+
4763+
tracker.on('success', (responseParams) => {
4764+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
4765+
4766+
// Request
4767+
expect(fetchSpy).to.have.been.called;
4768+
expect(requestParams).to.not.have.property('seed_item_ids');
4769+
4770+
// Response
4771+
expect(responseParams).to.have.property('method').to.equal('POST');
4772+
expect(responseParams).to.have.property('message');
4773+
4774+
done();
4775+
});
4776+
4777+
expect(tracker.trackRecommendationView(requiredParamsWithSeedItemIds)).to.equal(true);
4778+
});
4779+
4780+
it('Should respond with a valid response and omit seed_item_ids if seedItemIds is an object', (done) => {
4781+
const seedItemIds = { seedItemIds: '123' };
4782+
const { tracker } = new ConstructorIO({
4783+
apiKey: testApiKey,
4784+
fetch: fetchSpy,
4785+
...requestQueueOptions,
4786+
});
4787+
const requiredParamsWithSeedItemIds = {
4788+
seedItemIds,
4789+
...requiredParameters,
4790+
};
4791+
4792+
tracker.on('success', (responseParams) => {
4793+
const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy);
4794+
4795+
// Request
4796+
expect(fetchSpy).to.have.been.called;
4797+
expect(requestParams).to.not.have.property('seed_item_ids');
4798+
4799+
// Response
4800+
expect(responseParams).to.have.property('method').to.equal('POST');
4801+
expect(responseParams).to.have.property('message');
4802+
4803+
done();
4804+
});
4805+
4806+
expect(tracker.trackRecommendationView(requiredParamsWithSeedItemIds)).to.equal(true);
4807+
});
46634808
});
46644809

46654810
describe('trackRecommendationClick', () => {

src/modules/tracker.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1222,6 +1222,7 @@ class Tracker {
12221222
* @param {string} [parameters.resultId] - Recommendation result identifier (returned in response from Constructor)
12231223
* @param {string} [parameters.section="Products"] - Results section
12241224
* @param {object} [parameters.analyticsTags] - Pass additional analytics data
1225+
* @param {string[]|string|number} [parameters.seedItemIds] - Item ID(s) to be used as seed
12251226
* @param {object} [networkParameters] - Parameters relevant to the network request
12261227
* @param {number} [networkParameters.timeout] - Request timeout (in milliseconds)
12271228
* @returns {(true|Error)}
@@ -1258,6 +1259,7 @@ class Tracker {
12581259
numResultsViewed = num_results_viewed,
12591260
items,
12601261
analyticsTags,
1262+
seedItemIds,
12611263
resultCount = result_count || items?.length || 0,
12621264
} = parameters;
12631265

@@ -1299,6 +1301,14 @@ class Tracker {
12991301
bodyParams.analytics_tags = analyticsTags;
13001302
}
13011303

1304+
if (typeof seedItemIds === 'number') {
1305+
bodyParams.seed_item_ids = [String(seedItemIds)];
1306+
} else if (seedItemIds?.length && typeof seedItemIds === 'string') {
1307+
bodyParams.seed_item_ids = [seedItemIds];
1308+
} else if (seedItemIds?.length && Array.isArray(seedItemIds)) {
1309+
bodyParams.seed_item_ids = seedItemIds;
1310+
}
1311+
13021312
const requestURL = `${requestPath}${applyParamsAsString({}, this.options)}`;
13031313
const requestMethod = 'POST';
13041314
const requestBody = applyParams(bodyParams, { ...this.options, requestMethod });

0 commit comments

Comments
 (0)