diff --git a/packages/algoliasearch-helper/src/algoliasearch.helper.js b/packages/algoliasearch-helper/src/algoliasearch.helper.js index 8081c91054..d36d95ea41 100644 --- a/packages/algoliasearch-helper/src/algoliasearch.helper.js +++ b/packages/algoliasearch-helper/src/algoliasearch.helper.js @@ -1631,10 +1631,16 @@ AlgoliaSearchHelper.prototype._recommend = function () { return derivedState._buildQueries(derivedIndex); }); - var queries = Array.prototype.concat.apply( - this.recommendState._buildQueries(index), - derivedQueries - ); + var queries = Array.prototype.concat + .apply(this.recommendState._buildQueries(index), derivedQueries) + .map(function (query) { + return Object.assign(query, { + queryParameters: Object.assign(query.queryParameters || {}, { + clickAnalytics: searchState.clickAnalytics, + userToken: searchState.userToken, + }), + }); + }); if (queries.length === 0) { return; diff --git a/packages/algoliasearch-helper/test/spec/recommend.js b/packages/algoliasearch-helper/test/spec/recommend.js index ac79a3ffac..3d07e98585 100644 --- a/packages/algoliasearch-helper/test/spec/recommend.js +++ b/packages/algoliasearch-helper/test/spec/recommend.js @@ -44,8 +44,14 @@ describe('recommend()', () => { indexName: 'indexName', model: 'bought-together', objectID: 'A0E20000000279B', + queryParameters: expect.any(Object), + }, + { + indexName: 'indexName', + model: 'trending-facets', + facetName: 'brand', + queryParameters: expect.any(Object), }, - { indexName: 'indexName', model: 'trending-facets', facetName: 'brand' }, ]); }); @@ -121,4 +127,36 @@ describe('recommend()', () => { expect(client.getRecommendations).toHaveBeenCalledTimes(1); }); + + test('adds `clickAnalytics` and `userToken` to the queries if available', () => { + var client = { + getRecommendations: jest.fn().mockImplementationOnce(() => { + return Promise.resolve({ results: [] }); + }), + }; + + var helper = algoliasearchHelper(client, 'indexName', {}); + + // Set `clickAnalytics` and `userToken` on the helper search state + helper.overrideStateWithoutTriggeringChangeEvent({ + ...helper.state, + clickAnalytics: true, + userToken: 'userToken', + }); + + helper.addFrequentlyBoughtTogether({ $$id: 1 }); + helper.recommend(); + + expect(client.getRecommendations).toHaveBeenCalledTimes(1); + expect(client.getRecommendations).toHaveBeenLastCalledWith([ + { + indexName: 'indexName', + model: 'bought-together', + queryParameters: { + clickAnalytics: true, + userToken: 'userToken', + }, + }, + ]); + }); });