Skip to content

Commit

Permalink
fix(core): recursively merge arrays in searchParameters
Browse files Browse the repository at this point in the history
fixes #80
  • Loading branch information
vvo committed Sep 10, 2015
1 parent 8b8965d commit dbadcdb
Show file tree
Hide file tree
Showing 5 changed files with 91 additions and 7 deletions.
12 changes: 11 additions & 1 deletion lib/InstantSearch.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ var algoliasearchHelper = require('algoliasearch-helper');

var forEach = require('lodash/collection/forEach');
var merge = require('lodash/object/merge');
var union = require('lodash/array/union');

class InstantSearch {
constructor(applicationID, searchKey, indexName, searchParameters) {
Expand All @@ -19,7 +20,16 @@ class InstantSearch {
// Get the helper configuration from the widget
if (widgetDefinition.getConfiguration) {
var partialConfiguration = widgetDefinition.getConfiguration(this.searchParameters);
this.searchParameters = merge({}, this.searchParameters, partialConfiguration);
this.searchParameters = merge(
{},
this.searchParameters,
partialConfiguration,
(a, b) => {
if (Array.isArray(a)) {
return union(a, b);
}
}
);
}
// Add the widget to the list of widget
this.widgets.push(widgetDefinition);
Expand Down
7 changes: 4 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
"lint": "./scripts/lint.sh",
"build": "./scripts/build.sh",
"dev": "./scripts/dev.sh",
"test": "babel-node test/*.js && npm run lint",
"test:watch": "nodemon -i node_modules/ -i coverage/ -i .git/ -i dist/ -q --exec 'babel-node test/*.js | tap-spec'",
"test:coverage": "babel-node node_modules/.bin/isparta cover test/*.js",
"test": "./scripts/test.sh && npm run lint",
"test:watch": "nodemon -i node_modules/ -i coverage/ -i .git/ -i dist/ -q --exec './scripts/test.sh | tap-spec'",
"test:coverage": "babel-node node_modules/.bin/isparta cover ./scripts/test.sh",
"doctoc": "doctoc --maxlevel 3 README.md"
},
"browserify": {
Expand All @@ -25,6 +25,7 @@
"babel": "5.8.23",
"babel-eslint": "4.1.1",
"babel-loader": "5.3.2",
"babel-tape-runner": "1.2.0",
"css-loader": "0.16.0",
"doctoc": "0.15.0",
"eslint": "1.3.1",
Expand Down
7 changes: 7 additions & 0 deletions scripts/test.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#!/usr/bin/env bash

set -e # exit when error

printf "\nTest\n"

babel-tape-runner test/**/*.js
6 changes: 3 additions & 3 deletions test/InstantSearch.js → test/InstantSearch/lifecycle.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
var test = require('tape');

test('InstantSearch', function(t) {
test('InstantSearch: lifecycle', function(t) {
var EventEmitter = require('events').EventEmitter;

var proxyquire = require('proxyquire');
Expand All @@ -18,7 +18,7 @@ test('InstantSearch', function(t) {

var appId = 'appId';
var apiKey = 'apiKey';
var indexName = 'test';
var indexName = 'lifeycle';

var searchParameters = {some: 'configuration', another: {config: 'parameter'}};

Expand All @@ -28,7 +28,7 @@ test('InstantSearch', function(t) {
render: sinon.spy()
};

var InstantSearch = proxyquire('../lib/InstantSearch', {
var InstantSearch = proxyquire('../../lib/InstantSearch', {
algoliasearch: algoliasearch,
'algoliasearch-helper': algoliasearchHelper
});
Expand Down
66 changes: 66 additions & 0 deletions test/InstantSearch/recursively-merge-arrays-searchParameters.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
var test = require('tape');

test('InstantSearch: recursively merge arrays in searchParameters', function(t) {
var EventEmitter = require('events').EventEmitter;

var proxyquire = require('proxyquire');
var sinon = require('sinon');

// simple mocks
var helper = new EventEmitter();
helper.search = noop;

// hijack `algoliasearch` and `algoliasearchHelper` modules
var algoliasearch = noop;
var algoliasearchHelper = sinon.stub().returns(helper);

var searchParameters = {
some: ['value', 'another value'],
cool: 3,
another: {nested: ['array', 'of', 'values']}
};

var firstWidget = {
getConfiguration: sinon.stub().returns({
first: ['values'],
some: ['first'],
another: {yes: true}
})
};

var secondWidget = {
getConfiguration: sinon.stub().returns({
first: ['new value'],
cool: 4,
another: {nested: ['thing'], yes: false},
some: ['second']
})
};

var InstantSearch = proxyquire('../../lib/InstantSearch', {
algoliasearch: algoliasearch,
'algoliasearch-helper': algoliasearchHelper
});

var search = new InstantSearch('appId', 'apiKey', 'recursively', searchParameters);

search.addWidget(firstWidget);
search.addWidget(secondWidget);
search.start();

var expected = {
first: ['values', 'new value'],
some: ['value', 'another value', 'first', 'second'],
cool: 4,
another: {nested: ['array', 'of', 'values', 'thing'], yes: false}
};

t.deepEqual(
algoliasearchHelper.args[0][2],
expected
);

t.end();
});

function noop() {}

0 comments on commit dbadcdb

Please sign in to comment.