From c6e09a51920a296a1042247109e22cb07ea41c45 Mon Sep 17 00:00:00 2001 From: Raymond Rutjes Date: Sun, 21 May 2017 10:43:59 +0200 Subject: [PATCH] feat(store): add query parameters setter & getter --- .../src/__tests__/index.js | 75 +++++++++++++++++++ packages/instantsearch-store/src/index.js | 29 ++++++- 2 files changed, 100 insertions(+), 4 deletions(-) diff --git a/packages/instantsearch-store/src/__tests__/index.js b/packages/instantsearch-store/src/__tests__/index.js index 12831167e..4f538fa74 100644 --- a/packages/instantsearch-store/src/__tests__/index.js +++ b/packages/instantsearch-store/src/__tests__/index.js @@ -129,4 +129,79 @@ describe('Store', () => { const version = require('../../package.json').version; expect(addAlgoliaAgent).toBeCalledWith(`vue-instantsearch ${version}`); }); + + test('should merge query parameters with existing ones', () => { + const store = createFromAlgoliaCredentials('whatever', 'whatever'); + store.queryParameters = { + attributesToRetrieve: ['objectID'], + nonRetrievableAttributes: ['secret'], + }; + + expect(store.queryParameters).toHaveProperty('attributesToRetrieve', [ + 'objectID', + ]); + expect(store.queryParameters).toHaveProperty('nonRetrievableAttributes', [ + 'secret', + ]); + + // Ensure parameters have been merged with existing ones. + expect(Object.keys(store.queryParameters).length).toBeGreaterThan(2); + }); + + test('can retrieve query parameters', () => { + const client = algoliaClient('app_id', 'api_key'); + const helper = algoliaHelper(client); + helper.setQueryParameter('distinct', 1); + helper.setPage(3); + + const store = new Store(helper); + + expect(store.queryParameters).toHaveProperty('distinct', 1); + + // Ensure that pages start at 1 by making sure our initial 3 became 4. + expect(store.queryParameters).toHaveProperty('page', 4); + }); + + test('should reset page when query parameters are changed', () => { + const store = createFromAlgoliaCredentials('whatever', 'whatever'); + store.page = 2; + store.queryParameters = { + distinct: 1, + attributesToRetrieve: ['objectID'], + }; + + expect(store.page).toEqual(1); + }); + + test('should allow page to be changed by updating query parameters', () => { + const store = createFromAlgoliaCredentials('whatever', 'whatever'); + store.queryParameters = { + page: 3, + distinct: 1, + attributesToRetrieve: ['objectID'], + }; + + expect(store.page).toEqual(3); + }); + + test('should trigger search only once when query parameters are changed', () => { + const client = algoliaClient('app_id', 'api_key'); + const helper = algoliaHelper(client); + const store = new Store(helper); + + const search = jest.fn(); + helper.search = search; + + store.start(); + + helper.search.mockClear(); + + store.queryParameters = { + page: 3, + distinct: 1, + attributesToRetrieve: ['objectID'], + }; + + expect(search).toHaveBeenCalledTimes(1); + }); }); diff --git a/packages/instantsearch-store/src/index.js b/packages/instantsearch-store/src/index.js index 5f8160e25..b266ce1ab 100644 --- a/packages/instantsearch-store/src/index.js +++ b/packages/instantsearch-store/src/index.js @@ -65,6 +65,10 @@ export class Store { this._helper.getClient().addAlgoliaAgent(`vue-instantsearch ${version}`); } + get algoliaHelper() { + return this._helper; + } + get highlightPreTag() { return this._helper.getQueryParameter('highlightPreTag'); } @@ -73,10 +77,6 @@ export class Store { return this._helper.getQueryParameter('highlightPostTag'); } - get algoliaHelper() { - return this._helper; - } - set algoliaClient(algoliaClient) { this._helper.setClient(algoliaClient); @@ -282,6 +282,27 @@ export class Store { return this._helper.state.query; } + set queryParameters(parameters) { + this.stop(); + for (let parameter in parameters) { + this._helper.setQueryParameter(parameter, parameters[parameter]); + } + + // Make sure page starts at 1. + if ('page' in parameters) { + this.page = parameters.page; + delete parameters.page; + } + this.start(); + } + + get queryParameters() { + const parameters = this._helper.state.getQueryParams(); + parameters.page = this.page; + + return parameters; + } + // Todo: find a better name for this function. refresh() { this._helper.search();