From f4f07e847ded954f0a2eccb12f47f6a5a96a9045 Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Mon, 21 Apr 2025 09:56:47 -0700 Subject: [PATCH 1/5] add request_url to sabr requests --- spec/src/modules/autocomplete.js | 1 + spec/src/modules/browse.js | 3 +++ spec/src/modules/recommendations.js | 1 + spec/src/modules/search.js | 1 + src/modules/autocomplete.js | 4 ++++ src/modules/browse.js | 8 ++++++++ src/modules/recommendations.js | 4 ++++ src/modules/search.js | 4 ++++ 8 files changed, 26 insertions(+) diff --git a/spec/src/modules/autocomplete.js b/spec/src/modules/autocomplete.js index 08f6b2d0..a7dc059b 100644 --- a/spec/src/modules/autocomplete.js +++ b/spec/src/modules/autocomplete.js @@ -50,6 +50,7 @@ describe('ConstructorIO - Autocomplete', () => { autocomplete.getAutocompleteResults(query, {}, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('sections').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/spec/src/modules/browse.js b/spec/src/modules/browse.js index 21b50382..f9108ae7 100644 --- a/spec/src/modules/browse.js +++ b/spec/src/modules/browse.js @@ -56,6 +56,7 @@ describe('ConstructorIO - Browse', () => { browse.getBrowseResults(filterName, filterValue, {}, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); @@ -846,6 +847,8 @@ describe('ConstructorIO - Browse', () => { browse.getBrowseResultsForItemIds(ids).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + + expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/spec/src/modules/recommendations.js b/spec/src/modules/recommendations.js index 16252792..7aec49da 100644 --- a/spec/src/modules/recommendations.js +++ b/spec/src/modules/recommendations.js @@ -59,6 +59,7 @@ describe('ConstructorIO - Recommendations', () => { recommendations.getRecommendations(podId, { itemIds: itemId }, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/spec/src/modules/search.js b/spec/src/modules/search.js index 9226cb38..07b5be86 100644 --- a/spec/src/modules/search.js +++ b/spec/src/modules/search.js @@ -51,6 +51,7 @@ describe('ConstructorIO - Search', () => { search.getSearchResults(query, { section }, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/src/modules/autocomplete.js b/src/modules/autocomplete.js index c61aebaf..e99fe369 100644 --- a/src/modules/autocomplete.js +++ b/src/modules/autocomplete.js @@ -212,6 +212,10 @@ class Autocomplete { return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { + // Add request url to responses + // eslint-disable-next-line no-param-reassign + json.request_url = requestUrl; + if (json.sections) { if (json.result_id) { const sectionKeys = Object.keys(json.sections); diff --git a/src/modules/browse.js b/src/modules/browse.js index 34a36939..505aa387 100644 --- a/src/modules/browse.js +++ b/src/modules/browse.js @@ -302,6 +302,10 @@ class Browse { return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { + // Add request url to responses + // eslint-disable-next-line no-param-reassign + json.request_url = requestUrl; + // Browse results if (json.response && json.response.results) { if (json.result_id) { @@ -384,6 +388,10 @@ class Browse { return helpers.throwHttpErrorFromResponse(new Error(), response); }) .then((json) => { + // Add request url to responses + // eslint-disable-next-line no-param-reassign + json.request_url = requestUrl; + if (json.response && json.response.results) { if (json.result_id) { // Append `result_id` to each result item diff --git a/src/modules/recommendations.js b/src/modules/recommendations.js index 4af825fa..00126258 100644 --- a/src/modules/recommendations.js +++ b/src/modules/recommendations.js @@ -203,6 +203,10 @@ class Recommendations { return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { + // Add request url to responses + // eslint-disable-next-line no-param-reassign + json.request_url = requestUrl; + // Recommendations results if (json.response && json.response.results) { if (json.result_id) { diff --git a/src/modules/search.js b/src/modules/search.js index 2f0ae2aa..a1571297 100644 --- a/src/modules/search.js +++ b/src/modules/search.js @@ -241,6 +241,10 @@ class Search { return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { + // Add request url to responses + // eslint-disable-next-line no-param-reassign + json.request_url = requestUrl; + // Search results if (json.response && json.response.results) { if (json.result_id) { From 1951eb94dc1c2b2e492269053486622c9c44b897 Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Wed, 30 Apr 2025 23:00:24 -0700 Subject: [PATCH 2/5] Add request url to returned promise --- spec/src/modules/autocomplete.js | 52 +++++++++++++-------- spec/src/modules/browse.js | 20 ++++++++ spec/src/modules/quizzes.js | 20 ++++++++ spec/src/modules/recommendations.js | 10 ++++ spec/src/modules/search.js | 10 ++++ src/modules/autocomplete.js | 10 ++-- src/modules/browse.js | 72 ++++++++++++++++------------- src/modules/quizzes.js | 60 +++++++++++++----------- src/modules/recommendations.js | 10 ++-- src/modules/search.js | 16 ++++--- 10 files changed, 186 insertions(+), 94 deletions(-) diff --git a/spec/src/modules/autocomplete.js b/spec/src/modules/autocomplete.js index a7dc059b..ff37c7b2 100644 --- a/spec/src/modules/autocomplete.js +++ b/spec/src/modules/autocomplete.js @@ -401,35 +401,49 @@ describe('ConstructorIO - Autocomplete', () => { }); }); - it('Should return a variations_map object in the response', (done) => { - const variationsMap = { - group_by: [ + it('Should include requestUrl in the promise for getAutocompleteResults', () => { + const { autocomplete } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = autocomplete.getAutocompleteResults(query); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + + it('Should return a response with a valid query, section and preFilterExpression', (done) => { + const preFilterExpression = { + or: [ { - name: 'variation', - field: 'data.variation_id', + and: [ + { name: 'group_id', value: 'BrandXY' }, + { name: 'Color', value: 'red' }, + ], }, - ], - values: { - size: { - aggregation: 'all', - field: 'data.facets.size', + { + and: [ + { name: 'Color', value: 'blue' }, + { name: 'Brand', value: 'XYZ' }, + ], }, - }, - dtype: 'array', + ], }; const { autocomplete } = new ConstructorIO({ - apiKey: testApiKey, + ...validOptions, fetch: fetchSpy, }); - autocomplete.getAutocompleteResults('Jacket', { variationsMap }, {}).then((res) => { + autocomplete.getAutocompleteResults(query, { preFilterExpression }).then((res) => { + const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + expect(res).to.have.property('request').to.be.an('object'); - expect(res).to.have.property('sections').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); - expect(JSON.stringify(res.request.variations_map)).to.eql(JSON.stringify(variationsMap)); - expect(res.sections.Products[0]).to.have.property('variations_map'); - expect(res.sections.Products[0].variations_map[0]).to.have.property('size'); - expect(res.sections.Products[0].variations_map[0]).to.have.property('variation'); + expect(requestedUrlParams).to.have.property('pre_filter_expression'); + expect(requestedUrlParams.pre_filter_expression).to.eql(JSON.stringify(preFilterExpression)); + expect(res.sections).to.have.property('Products').to.be.an('array'); + expect(res.sections.Products.length).to.be.eql(2); + expect(res.sections.Products[0].data.facets.find((facet) => facet.name === 'Color').values).to.be.an('array').that.include('red'); + expect(res.sections.Products[1].data.facets.find((facet) => facet.name === 'Color').values).to.be.an('array').that.include('blue'); done(); }); }); diff --git a/spec/src/modules/browse.js b/spec/src/modules/browse.js index f9108ae7..c0fae4c5 100644 --- a/spec/src/modules/browse.js +++ b/spec/src/modules/browse.js @@ -706,6 +706,16 @@ describe('ConstructorIO - Browse', () => { }); }); + it('Should include requestUrl in the promise for getBrowseResults', () => { + const { browse } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = browse.getBrowseResults(filterName, filterValue); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + it('Should be rejected when invalid filterName is provided', () => { const { browse } = new ConstructorIO(validOptions); @@ -834,6 +844,16 @@ describe('ConstructorIO - Browse', () => { )).to.eventually.be.rejectedWith('The operation was aborted.'); }); } + + it('Should include requestUrl in the promise for getBrowseResults', () => { + const { browse } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = browse.getBrowseResults(filterName, filterValue); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); }); describe('getBrowseResultsForItemIds', () => { diff --git a/spec/src/modules/quizzes.js b/spec/src/modules/quizzes.js index e171fc73..ca96d364 100644 --- a/spec/src/modules/quizzes.js +++ b/spec/src/modules/quizzes.js @@ -216,6 +216,16 @@ describe('ConstructorIO - Quizzes', () => { return expect(quizzes.getQuizNextQuestion(validQuizId, {})).to.eventually.be.rejected; }); + + it('Should include requestUrl in the promise for getQuizNextQuestion', () => { + const { quizzes } = new ConstructorIO({ + apiKey: quizApiKey, + fetch: fetchSpy, + }); + + const promise = quizzes.getQuizNextQuestion(validQuizId, {}, { clientId, sessionId }); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); }); describe('getQuizResults', () => { @@ -470,5 +480,15 @@ describe('ConstructorIO - Quizzes', () => { return expect(quizzes.getQuizResults(validQuizId, { answers: validAnswers })).to.eventually.be.rejectedWith('The operation was aborted.'); }); } + + it('Should include requestUrl in the promise for getQuizResults', () => { + const { quizzes } = new ConstructorIO({ + apiKey: quizApiKey, + fetch: fetchSpy, + }); + + const promise = quizzes.getQuizResults(validQuizId, { answers: validAnswers }); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); }); }); diff --git a/spec/src/modules/recommendations.js b/spec/src/modules/recommendations.js index 7aec49da..8bf29aeb 100644 --- a/spec/src/modules/recommendations.js +++ b/spec/src/modules/recommendations.js @@ -657,6 +657,16 @@ describe('ConstructorIO - Recommendations', () => { )).to.eventually.be.rejectedWith('The operation was aborted.'); }); } + + it('Should include requestUrl in the promise for getRecommendations', () => { + const { recommendations } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = recommendations.getRecommendations(podId, { itemIds: itemId }); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); }); describe('getRecommendationPods', () => { diff --git a/spec/src/modules/search.js b/spec/src/modules/search.js index 07b5be86..f22774c5 100644 --- a/spec/src/modules/search.js +++ b/spec/src/modules/search.js @@ -669,6 +669,16 @@ describe('ConstructorIO - Search', () => { }); }); + it('Should include requestUrl in the promise for getSearchResults', () => { + const { search } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = search.getSearchResults(query, { section }); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + it('Should be rejected when invalid query is provided', () => { const { search } = new ConstructorIO(validOptions); diff --git a/src/modules/autocomplete.js b/src/modules/autocomplete.js index e99fe369..f9f8e60b 100644 --- a/src/modules/autocomplete.js +++ b/src/modules/autocomplete.js @@ -205,17 +205,13 @@ class Autocomplete { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }).then((response) => { + const promise = fetch(requestUrl, { headers, signal }).then((response) => { if (response.ok) { return response.json(); } return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { - // Add request url to responses - // eslint-disable-next-line no-param-reassign - json.request_url = requestUrl; - if (json.sections) { if (json.result_id) { const sectionKeys = Object.keys(json.sections); @@ -238,6 +234,10 @@ class Autocomplete { throw new Error('getAutocompleteResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } } diff --git a/src/modules/browse.js b/src/modules/browse.js index 505aa387..594dbfcb 100644 --- a/src/modules/browse.js +++ b/src/modules/browse.js @@ -295,17 +295,13 @@ class Browse { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }).then((response) => { + const promise = fetch(requestUrl, { headers, signal }).then((response) => { if (response.ok) { return response.json(); } return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { - // Add request url to responses - // eslint-disable-next-line no-param-reassign - json.request_url = requestUrl; - // Browse results if (json.response && json.response.results) { if (json.result_id) { @@ -325,6 +321,10 @@ class Browse { throw new Error('getBrowseResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -379,31 +379,29 @@ class Browse { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }) - .then((response) => { - if (response.ok) { - return response.json(); - } + const promise = fetch(requestUrl, { headers, signal }).then((response) => { + if (response.ok) { + return response.json(); + } - return helpers.throwHttpErrorFromResponse(new Error(), response); - }) - .then((json) => { - // Add request url to responses - // eslint-disable-next-line no-param-reassign - json.request_url = requestUrl; - - if (json.response && json.response.results) { - if (json.result_id) { - // Append `result_id` to each result item - json.response.results.forEach((result) => { - // eslint-disable-next-line no-param-reassign - result.result_id = json.result_id; - }); - } - return json; + return helpers.throwHttpErrorFromResponse(new Error(), response); + }).then((json) => { + if (json.response && json.response.results) { + if (json.result_id) { + // Append `result_id` to each result item + json.response.results.forEach((result) => { + // eslint-disable-next-line no-param-reassign + result.result_id = json.result_id; + }); } - throw new Error('getBrowseResultsForItemIds response data is malformed'); - }); + return json; + } + throw new Error('getBrowseResultsForItemIds response data is malformed'); + }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -451,13 +449,17 @@ class Browse { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }).then((response) => { + const promise = fetch(requestUrl, { headers, signal }).then((response) => { if (response.ok) { return response.json(); } return helpers.throwHttpErrorFromResponse(new Error(), response); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -506,7 +508,7 @@ class Browse { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { + const promise = fetch(requestUrl, { headers: { ...headers, ...helpers.createAuthHeader(this.options) }, signal, }).then((response) => { @@ -516,6 +518,10 @@ class Browse { return helpers.throwHttpErrorFromResponse(new Error(), response); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -561,7 +567,7 @@ class Browse { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { + const promise = fetch(requestUrl, { headers: { ...headers, ...helpers.createAuthHeader(this.options) }, signal, }).then((response) => { @@ -571,6 +577,10 @@ class Browse { return helpers.throwHttpErrorFromResponse(new Error(), response); }); + + promise.requestUrl = requestUrl; + + return promise; } } diff --git a/src/modules/quizzes.js b/src/modules/quizzes.js index ff19eda5..3c200ee5 100644 --- a/src/modules/quizzes.js +++ b/src/modules/quizzes.js @@ -162,21 +162,23 @@ class Quizzes { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }) - .then((response) => { - if (response.ok) { - return response.json(); - } - - return helpers.throwHttpErrorFromResponse(new Error(), response); - }) - .then((json) => { - if (json.quiz_version_id) { - return json; - } - - throw new Error('getQuizNextQuestion response data is malformed'); - }); + const promise = fetch(requestUrl, { headers, signal }).then((response) => { + if (response.ok) { + return response.json(); + } + + return helpers.throwHttpErrorFromResponse(new Error(), response); + }).then((json) => { + if (json.quiz_version_id) { + return json; + } + + throw new Error('getQuizNextQuestion response data is malformed'); + }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -243,21 +245,23 @@ class Quizzes { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }) - .then((response) => { - if (response.ok) { - return response.json(); - } + const promise = fetch(requestUrl, { headers, signal }).then((response) => { + if (response.ok) { + return response.json(); + } - return helpers.throwHttpErrorFromResponse(new Error(), response); - }) - .then((json) => { - if (json.quiz_version_id) { - return json; - } + return helpers.throwHttpErrorFromResponse(new Error(), response); + }).then((json) => { + if (json.quiz_version_id) { + return json; + } - throw new Error('getQuizResults response data is malformed'); - }); + throw new Error('getQuizResults response data is malformed'); + }); + + promise.requestUrl = requestUrl; + + return promise; } } diff --git a/src/modules/recommendations.js b/src/modules/recommendations.js index 00126258..2af0a4d5 100644 --- a/src/modules/recommendations.js +++ b/src/modules/recommendations.js @@ -196,17 +196,13 @@ class Recommendations { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }).then((response) => { + const promise = fetch(requestUrl, { headers, signal }).then((response) => { if (response.ok) { return response.json(); } return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { - // Add request url to responses - // eslint-disable-next-line no-param-reassign - json.request_url = requestUrl; - // Recommendations results if (json.response && json.response.results) { if (json.result_id) { @@ -226,6 +222,10 @@ class Recommendations { throw new Error('getRecommendations response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } /** diff --git a/src/modules/search.js b/src/modules/search.js index a1571297..fe2b5e55 100644 --- a/src/modules/search.js +++ b/src/modules/search.js @@ -234,17 +234,13 @@ class Search { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }).then((response) => { + const promise = fetch(requestUrl, { headers, signal }).then((response) => { if (response.ok) { return response.json(); } return helpers.throwHttpErrorFromResponse(new Error(), response); }).then((json) => { - // Add request url to responses - // eslint-disable-next-line no-param-reassign - json.request_url = requestUrl; - // Search results if (json.response && json.response.results) { if (json.result_id) { @@ -264,6 +260,10 @@ class Search { throw new Error('getSearchResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -338,7 +338,7 @@ class Search { // Handle network timeout if specified helpers.applyNetworkTimeout(this.options, networkParameters, controller); - return fetch(requestUrl, { headers, signal }).then((response) => { + const promise = fetch(requestUrl, { headers, signal }).then((response) => { if (response.ok) { return response.json(); } @@ -364,6 +364,10 @@ class Search { throw new Error('getVoiceSearchResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } } From 72d56b727290d0f5dca10188eafff3064d6dd450 Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Wed, 30 Apr 2025 23:02:06 -0700 Subject: [PATCH 3/5] remove unused --- spec/src/modules/autocomplete.js | 1 - spec/src/modules/browse.js | 2 -- spec/src/modules/recommendations.js | 1 - spec/src/modules/search.js | 1 - 4 files changed, 5 deletions(-) diff --git a/spec/src/modules/autocomplete.js b/spec/src/modules/autocomplete.js index ff37c7b2..562144b4 100644 --- a/spec/src/modules/autocomplete.js +++ b/spec/src/modules/autocomplete.js @@ -50,7 +50,6 @@ describe('ConstructorIO - Autocomplete', () => { autocomplete.getAutocompleteResults(query, {}, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); - expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('sections').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/spec/src/modules/browse.js b/spec/src/modules/browse.js index c0fae4c5..a89545b9 100644 --- a/spec/src/modules/browse.js +++ b/spec/src/modules/browse.js @@ -56,7 +56,6 @@ describe('ConstructorIO - Browse', () => { browse.getBrowseResults(filterName, filterValue, {}, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); - expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); @@ -868,7 +867,6 @@ describe('ConstructorIO - Browse', () => { browse.getBrowseResultsForItemIds(ids).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); - expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/spec/src/modules/recommendations.js b/spec/src/modules/recommendations.js index 8bf29aeb..08dcfdfd 100644 --- a/spec/src/modules/recommendations.js +++ b/spec/src/modules/recommendations.js @@ -59,7 +59,6 @@ describe('ConstructorIO - Recommendations', () => { recommendations.getRecommendations(podId, { itemIds: itemId }, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); - expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); diff --git a/spec/src/modules/search.js b/spec/src/modules/search.js index f22774c5..30de6003 100644 --- a/spec/src/modules/search.js +++ b/spec/src/modules/search.js @@ -51,7 +51,6 @@ describe('ConstructorIO - Search', () => { search.getSearchResults(query, { section }, { ...clientSessionIdentifiers }).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); - expect(res).to.have.property('request_url').to.be.an('string'); expect(res).to.have.property('request').to.be.an('object'); expect(res).to.have.property('response').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); From cd80a79dd40630e4372513dfebed2ddcfbb75bfe Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Wed, 30 Apr 2025 23:05:53 -0700 Subject: [PATCH 4/5] revert test --- spec/src/modules/autocomplete.js | 42 +++++++++++++++----------------- 1 file changed, 19 insertions(+), 23 deletions(-) diff --git a/spec/src/modules/autocomplete.js b/spec/src/modules/autocomplete.js index 562144b4..4e9aa488 100644 --- a/spec/src/modules/autocomplete.js +++ b/spec/src/modules/autocomplete.js @@ -410,39 +410,35 @@ describe('ConstructorIO - Autocomplete', () => { expect(promise).to.have.property('requestUrl').that.is.a('string'); }); - it('Should return a response with a valid query, section and preFilterExpression', (done) => { - const preFilterExpression = { - or: [ - { - and: [ - { name: 'group_id', value: 'BrandXY' }, - { name: 'Color', value: 'red' }, - ], - }, + it('Should return a variations_map object in the response', (done) => { + const variationsMap = { + group_by: [ { - and: [ - { name: 'Color', value: 'blue' }, - { name: 'Brand', value: 'XYZ' }, - ], + name: 'variation', + field: 'data.variation_id', }, ], + values: { + size: { + aggregation: 'all', + field: 'data.facets.size', + }, + }, + dtype: 'array', }; const { autocomplete } = new ConstructorIO({ - ...validOptions, + apiKey: testApiKey, fetch: fetchSpy, }); - autocomplete.getAutocompleteResults(query, { preFilterExpression }).then((res) => { - const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); - + autocomplete.getAutocompleteResults('Jacket', { variationsMap }, {}).then((res) => { expect(res).to.have.property('request').to.be.an('object'); + expect(res).to.have.property('sections').to.be.an('object'); expect(res).to.have.property('result_id').to.be.an('string'); - expect(requestedUrlParams).to.have.property('pre_filter_expression'); - expect(requestedUrlParams.pre_filter_expression).to.eql(JSON.stringify(preFilterExpression)); - expect(res.sections).to.have.property('Products').to.be.an('array'); - expect(res.sections.Products.length).to.be.eql(2); - expect(res.sections.Products[0].data.facets.find((facet) => facet.name === 'Color').values).to.be.an('array').that.include('red'); - expect(res.sections.Products[1].data.facets.find((facet) => facet.name === 'Color').values).to.be.an('array').that.include('blue'); + expect(JSON.stringify(res.request.variations_map)).to.eql(JSON.stringify(variationsMap)); + expect(res.sections.Products[0]).to.have.property('variations_map'); + expect(res.sections.Products[0].variations_map[0]).to.have.property('size'); + expect(res.sections.Products[0].variations_map[0]).to.have.property('variation'); done(); }); }); From 2e2e5b83b11960c726d03edb96bba2cb39f821b0 Mon Sep 17 00:00:00 2001 From: Stanley Peng Date: Wed, 30 Apr 2025 23:16:04 -0700 Subject: [PATCH 5/5] Add missing tests --- spec/src/modules/browse.js | 51 ++++++++++++++++++++++++++++++-------- 1 file changed, 41 insertions(+), 10 deletions(-) diff --git a/spec/src/modules/browse.js b/spec/src/modules/browse.js index a89545b9..e1a46483 100644 --- a/spec/src/modules/browse.js +++ b/spec/src/modules/browse.js @@ -843,16 +843,6 @@ describe('ConstructorIO - Browse', () => { )).to.eventually.be.rejectedWith('The operation was aborted.'); }); } - - it('Should include requestUrl in the promise for getBrowseResults', () => { - const { browse } = new ConstructorIO({ - ...validOptions, - fetch: fetchSpy, - }); - - const promise = browse.getBrowseResults(filterName, filterValue); - expect(promise).to.have.property('requestUrl').that.is.a('string'); - }); }); describe('getBrowseResultsForItemIds', () => { @@ -879,6 +869,17 @@ describe('ConstructorIO - Browse', () => { }); }); + it('Should include requestUrl in the promise for getBrowseResultsForItemIds', () => { + const itemIds = ['item1', 'item2']; + const { browse } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = browse.getBrowseResultsForItemIds(itemIds); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + it('should return a response with valid ids, client id and session id', (done) => { const userParameters = { clientId: 'example client id', @@ -1396,6 +1397,16 @@ describe('ConstructorIO - Browse', () => { }); }); + it('Should include requestUrl in the promise for getBrowseGroups', () => { + const { browse } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = browse.getBrowseGroups({}); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + it('Should return a response with valid ids and user id', (done) => { const userId = 'user-id'; const { browse } = new ConstructorIO({ @@ -1752,6 +1763,16 @@ describe('ConstructorIO - Browse', () => { }); }); + it('Should include requestUrl in the promise for getBrowseFacets', () => { + const { browse } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = browse.getBrowseFacets({}); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + it('Should be rejected when invalid apiKey is provided', () => { const { browse } = new ConstructorIO({ apiKey: 'fyzs7tfF8L161VoAXQ8u' }); @@ -1935,6 +1956,16 @@ describe('ConstructorIO - Browse', () => { }); }); + it('Should include requestUrl in the promise for getBrowseFacetOptions', () => { + const { browse } = new ConstructorIO({ + ...validOptions, + fetch: fetchSpy, + }); + + const promise = browse.getBrowseFacetOptions(facetName); + expect(promise).to.have.property('requestUrl').that.is.a('string'); + }); + it('Should be rejected when no facetName is provided', () => { const { browse } = new ConstructorIO(validOptions);