diff --git a/spec/src/modules/autocomplete.js b/spec/src/modules/autocomplete.js index 08f6b2d0..4e9aa488 100644 --- a/spec/src/modules/autocomplete.js +++ b/spec/src/modules/autocomplete.js @@ -400,6 +400,16 @@ describe('ConstructorIO - Autocomplete', () => { }); }); + 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 variations_map object in the response', (done) => { const variationsMap = { group_by: [ diff --git a/spec/src/modules/browse.js b/spec/src/modules/browse.js index 21b50382..e1a46483 100644 --- a/spec/src/modules/browse.js +++ b/spec/src/modules/browse.js @@ -705,6 +705,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); @@ -846,6 +856,7 @@ describe('ConstructorIO - Browse', () => { browse.getBrowseResultsForItemIds(ids).then((res) => { const requestedUrlParams = helpers.extractUrlParamsFromFetch(fetchSpy); + 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'); @@ -858,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', @@ -1375,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({ @@ -1731,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' }); @@ -1914,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); 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 16252792..08dcfdfd 100644 --- a/spec/src/modules/recommendations.js +++ b/spec/src/modules/recommendations.js @@ -656,6 +656,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 9226cb38..30de6003 100644 --- a/spec/src/modules/search.js +++ b/spec/src/modules/search.js @@ -668,6 +668,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 c61aebaf..f9f8e60b 100644 --- a/src/modules/autocomplete.js +++ b/src/modules/autocomplete.js @@ -205,7 +205,7 @@ 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(); } @@ -234,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 34a36939..594dbfcb 100644 --- a/src/modules/browse.js +++ b/src/modules/browse.js @@ -295,7 +295,7 @@ 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(); } @@ -321,6 +321,10 @@ class Browse { throw new Error('getBrowseResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -375,27 +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) => { - 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; } /** @@ -443,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; } /** @@ -498,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) => { @@ -508,6 +518,10 @@ class Browse { return helpers.throwHttpErrorFromResponse(new Error(), response); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -553,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) => { @@ -563,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 4af825fa..2af0a4d5 100644 --- a/src/modules/recommendations.js +++ b/src/modules/recommendations.js @@ -196,7 +196,7 @@ 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(); } @@ -222,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 2f0ae2aa..fe2b5e55 100644 --- a/src/modules/search.js +++ b/src/modules/search.js @@ -234,7 +234,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(); } @@ -260,6 +260,10 @@ class Search { throw new Error('getSearchResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } /** @@ -334,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(); } @@ -360,6 +364,10 @@ class Search { throw new Error('getVoiceSearchResults response data is malformed'); }); + + promise.requestUrl = requestUrl; + + return promise; } }