From be74c2c2ac9bd936550f047e5d5cd0bd27d585dd Mon Sep 17 00:00:00 2001 From: Diego dos Santos Date: Tue, 8 Jul 2025 19:40:47 -0300 Subject: [PATCH 1/6] feat: add URL truncation on trackItemDetailLoad method --- spec/src/modules/tracker.js | 28 ++++++++++++++++++++++++++++ src/modules/tracker.js | 4 +++- src/utils/helpers.js | 2 ++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index 955bee1e..ee259d05 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -34,6 +34,11 @@ function validateOriginReferrer(requestParams) { expect(requestParams).to.have.property('origin_referrer').to.contain('utm_campaign=campaign_1'); } +function createLongUrl(length) { + const baseUrl = 'https://constructor.io/product/KMH876?a='; + return `${baseUrl}${'a'.repeat(length - baseUrl.length)}`; +} + describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { let fetchSpy = null; let cleanup; @@ -1465,6 +1470,29 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(tracker.trackItemDetailLoad(requiredParameters)).to.equal(true); }); } + + it('Should truncate url param to 2048 characters max', (done) => { + const longUrl = createLongUrl(3000); + const truncatedUrl = longUrl.slice(0, 2048); + + const { tracker } = new ConstructorIO({ + apiKey: testApiKey, + fetch: fetchSpy, + ...requestQueueOptions, + }); + + tracker.on('success', () => { + const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy); + + // Request + expect(fetchSpy).to.have.been.called; + expect(requestParams.url).to.equal(truncatedUrl); + + done(); + }); + + expect(tracker.trackItemDetailLoad({ ...requiredParameters, url: longUrl })).to.equal(true); + }); }); describe('trackSearchSubmit', () => { diff --git a/src/modules/tracker.js b/src/modules/tracker.js index 2a2b9922..21814b08 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -6,6 +6,8 @@ const EventEmitter = require('../utils/events'); const helpers = require('../utils/helpers'); const RequestQueue = require('../utils/request-queue'); +const MAX_URL_LENGTH = 2048; + function applyParams(parameters, options) { const { apiKey, @@ -270,7 +272,7 @@ class Tracker { } if (url) { - bodyParams.url = url; + bodyParams.url = helpers.truncateString(url, MAX_URL_LENGTH); } const requestURL = `${requestUrlPath}${applyParamsAsString(queryParams, this.options)}`; diff --git a/src/utils/helpers.js b/src/utils/helpers.js index e76788f0..6c138c51 100644 --- a/src/utils/helpers.js +++ b/src/utils/helpers.js @@ -281,6 +281,8 @@ const utils = { return url; }, + + truncateString: (string, maxLength) => string.slice(0, maxLength), }; module.exports = utils; From e5437b75fb205888a618eb3572f73a92adb10ed3 Mon Sep 17 00:00:00 2001 From: Diego dos Santos Date: Wed, 9 Jul 2025 09:22:11 -0300 Subject: [PATCH 2/6] feat: add URL truncation on trackSearchResultsLoaded method --- spec/src/modules/tracker.js | 28 ++++++++++++++++++++++++++++ src/modules/tracker.js | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index ee259d05..9955def1 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -2594,6 +2594,34 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(tracker.trackSearchResultsLoaded(term, requiredParameters)).to.equal(true); }); + + it('Should truncate url param to 2048 characters max', (done) => { + const longUrl = createLongUrl(3000); + const truncatedUrl = longUrl.slice(0, 2048); + + const { tracker } = new ConstructorIO({ + apiKey: testApiKey, + fetch: fetchSpy, + ...requestQueueOptions, + }); + + tracker.on('success', () => { + const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy); + + // Request + expect(fetchSpy).to.have.been.called; + expect(requestParams.url).to.equal(truncatedUrl); + + done(); + }); + + const parameters = { + ...requiredParameters, + url: longUrl, + }; + + expect(tracker.trackSearchResultsLoaded(term, parameters)).to.equal(true); + }); }); describe('trackSearchResultClick', () => { diff --git a/src/modules/tracker.js b/src/modules/tracker.js index 21814b08..6ef9af3d 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -739,7 +739,7 @@ class Tracker { sort_order: sortOrder, sort_by: sortBy, selected_filters: selectedFilters, - url, + url: helpers.truncateString(url, MAX_URL_LENGTH), section, analytics_tags: analyticsTags, }; From 064f7ff83559fd36aa97f76ef4d6820cdfc8122b Mon Sep 17 00:00:00 2001 From: Diego dos Santos Date: Wed, 9 Jul 2025 09:24:06 -0300 Subject: [PATCH 3/6] refactor: simplify parameters structure in trackItemDetailLoad test --- spec/src/modules/tracker.js | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index 9955def1..9c6545b6 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -1491,7 +1491,12 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { done(); }); - expect(tracker.trackItemDetailLoad({ ...requiredParameters, url: longUrl })).to.equal(true); + const parameters = { + ...requiredParameters, + url: longUrl, + }; + + expect(tracker.trackItemDetailLoad(parameters)).to.equal(true); }); }); From 4593fa6045673eb1caa7bc1f434378d51e2595d4 Mon Sep 17 00:00:00 2001 From: Diego dos Santos Date: Wed, 9 Jul 2025 09:32:09 -0300 Subject: [PATCH 4/6] feat: add URL truncation on trackRecommendationView method --- spec/src/modules/tracker.js | 28 ++++++++++++++++++++++++++++ src/modules/tracker.js | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index 9c6545b6..639e816e 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -4866,6 +4866,34 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(tracker.trackRecommendationView(requiredParamsWithSeedItemIds)).to.equal(true); }); + + it('Should truncate url param to 2048 characters max', (done) => { + const longUrl = createLongUrl(3000); + const truncatedUrl = longUrl.slice(0, 2048); + + const { tracker } = new ConstructorIO({ + apiKey: testApiKey, + fetch: fetchSpy, + ...requestQueueOptions, + }); + + tracker.on('success', () => { + const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy); + + // Request + expect(fetchSpy).to.have.been.called; + expect(requestParams.url).to.equal(truncatedUrl); + + done(); + }); + + const parameters = { + ...requiredParameters, + url: longUrl, + }; + + expect(tracker.trackRecommendationView(parameters)).to.equal(true); + }); }); describe('trackRecommendationClick', () => { diff --git a/src/modules/tracker.js b/src/modules/tracker.js index 6ef9af3d..494aeb95 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -1284,7 +1284,7 @@ class Tracker { } if (url) { - bodyParams.url = url; + bodyParams.url = helpers.truncateString(url, MAX_URL_LENGTH); } if (podId) { From 8200eede1e9a1ad87a48d2c2d1839dc504e3ba19 Mon Sep 17 00:00:00 2001 From: Diego dos Santos Date: Wed, 9 Jul 2025 09:35:51 -0300 Subject: [PATCH 5/6] feat: add URL truncation on trackBrowseResultsLoaded method --- spec/src/modules/tracker.js | 28 ++++++++++++++++++++++++++++ src/modules/tracker.js | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index 639e816e..67e4d8b6 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -5785,6 +5785,34 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(tracker.trackBrowseResultsLoaded(requiredParameters)).to.equal(true); }); + + it('Should truncate url param to 2048 characters max', (done) => { + const longUrl = createLongUrl(3000); + const truncatedUrl = longUrl.slice(0, 2048); + + const { tracker } = new ConstructorIO({ + apiKey: testApiKey, + fetch: fetchSpy, + ...requestQueueOptions, + }); + + tracker.on('success', () => { + const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy); + + // Request + expect(fetchSpy).to.have.been.called; + expect(requestParams.url).to.equal(truncatedUrl); + + done(); + }); + + const parameters = { + ...requiredParameters, + url: longUrl, + }; + + expect(tracker.trackBrowseResultsLoaded(parameters)).to.equal(true); + }); }); describe('trackBrowseRedirect', () => { diff --git a/src/modules/tracker.js b/src/modules/tracker.js index 494aeb95..9cc7dc8d 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -1552,7 +1552,7 @@ class Tracker { } if (url) { - bodyParams.url = url; + bodyParams.url = helpers.truncateString(url, MAX_URL_LENGTH); } if (sortOrder) { From 09ee94c320c1987912d70147edfbfc4e29271be1 Mon Sep 17 00:00:00 2001 From: Diego dos Santos Date: Wed, 9 Jul 2025 09:38:26 -0300 Subject: [PATCH 6/6] feat: add URL truncation on trackQuizResultsLoaded method --- spec/src/modules/tracker.js | 28 ++++++++++++++++++++++++++++ src/modules/tracker.js | 2 +- 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/spec/src/modules/tracker.js b/spec/src/modules/tracker.js index 67e4d8b6..15f43423 100644 --- a/spec/src/modules/tracker.js +++ b/spec/src/modules/tracker.js @@ -7460,6 +7460,34 @@ describe(`ConstructorIO - Tracker${bundledDescriptionSuffix}`, () => { expect(tracker.trackQuizResultsLoaded(requiredParameters)).to.equal(true); }); + + it('Should truncate url param to 2048 characters max', (done) => { + const longUrl = createLongUrl(3000); + const truncatedUrl = longUrl.slice(0, 2048); + + const { tracker } = new ConstructorIO({ + apiKey: testApiKey, + fetch: fetchSpy, + ...requestQueueOptions, + }); + + tracker.on('success', () => { + const requestParams = helpers.extractBodyParamsFromFetch(fetchSpy); + + // Request + expect(fetchSpy).to.have.been.called; + expect(requestParams.url).to.equal(truncatedUrl); + + done(); + }); + + const parameters = { + ...requiredParameters, + url: longUrl, + }; + + expect(tracker.trackQuizResultsLoaded(parameters)).to.equal(true); + }); }); describe('trackQuizResultClick', () => { diff --git a/src/modules/tracker.js b/src/modules/tracker.js index 9cc7dc8d..8abb62fe 100644 --- a/src/modules/tracker.js +++ b/src/modules/tracker.js @@ -2022,7 +2022,7 @@ class Tracker { bodyParams.quiz_id = quizId; bodyParams.quiz_version_id = quizVersionId; bodyParams.quiz_session_id = quizSessionId; - bodyParams.url = url; + bodyParams.url = helpers.truncateString(url, MAX_URL_LENGTH); if (!helpers.isNil(section)) { if (typeof section !== 'string') {