Skip to content

Commit

Permalink
fix(rangeSlider): error when no result
Browse files Browse the repository at this point in the history
  • Loading branch information
maxiloc committed Nov 10, 2015
1 parent 1bbd569 commit 70e8554
Show file tree
Hide file tree
Showing 2 changed files with 148 additions and 110 deletions.
256 changes: 147 additions & 109 deletions widgets/range-slider/__tests__/range-slider-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,40 +36,7 @@ describe('rangeSlider()', () => {

container = document.createElement('div');
widget = rangeSlider({container, attributeName: 'aNumAttr'});
results = {
disjunctiveFacets: [{
name: 'aNumAttr',
data: {
19.99: 610,
39.99: 593,
29.99: 488,
49.99: 486,
99.99: 430,
14.99: 376,
59.99: 323,
34.99: 286,
79.99: 282,
9.99: 277,
599.99: 105,
999.99: 104,
799.99: 96,
899.99: 88,
699.99: 84,
1099.99: 53,
1199.99: 49,
649.99: 48,
1299.99: 46,
749.99: 34
},
exhaustive: true,
stats: {
min: 1.99,
max: 4999.98,
avg: 243.349,
sum: 2433490
}
}]
};

helper = new AlgoliasearchHelper(
{search: function() {}},
'indexName',
Expand All @@ -80,86 +47,157 @@ describe('rangeSlider()', () => {
sinon.spy(helper, 'search');
});

it('configures the disjunctiveFacets', () => {
expect(widget.getConfiguration()).toEqual({disjunctiveFacets: ['aNumAttr']});
});

it('calls twice ReactDOM.render(<Slider props />, container)', () => {
widget.render({results, helper});
widget.render({results, helper});

let props = {
cssClasses: {body: null, root: null},
onChange: () => {},
pips: true,
range: {max: 5000, min: 1},
shouldAutoHideContainer: false,
start: [-Infinity, Infinity],
step: 1,
templateProps: {
templates: {footer: '', header: ''},
templatesConfig: undefined,
transformData: undefined,
useCustomCompileOptions: {footer: false, header: false}
},
tooltips: true
};

expect(ReactDOM.render.calledTwice).toBe(true, 'ReactDOM.render called twice');
expect(autoHideContainer.calledOnce).toBe(true, 'autoHideContainer called once');
expect(headerFooter.calledOnce).toBe(true, 'headerFooter called once');
expect(ReactDOM.render.firstCall.args[0]).toEqualJSX(<Slider {...props} />);
expect(ReactDOM.render.firstCall.args[1]).toEqual(container);
expect(ReactDOM.render.secondCall.args[0]).toEqualJSX(<Slider {...props} />);
expect(ReactDOM.render.secondCall.args[1]).toEqual(container);
});

it('doesn\'t call the refinement functions if not refined', () => {
let state0 = helper.state;
widget.render({results, helper});
let state1 = helper.state;
expect(state1).toEqual(state0);
expect(helper.search.called).toBe(false, 'search never called');
});

it('calls the refinement functions if refined with min+1', () => {
let stats = results.disjunctiveFacets[0].stats;
let targetValue = Math.floor(stats.min) + 1;

let state0 = helper.state;
widget._refine(helper, stats, [targetValue, stats.max]);
let state1 = helper.state;

expect(helper.search.calledOnce).toBe(true, 'search called once');
expect(state1).toEqual(state0.addNumericRefinement('aNumAttr', '>=', targetValue));
});

it('calls the refinement functions if refined with max-1', () => {
let stats = results.disjunctiveFacets[0].stats;
let targetValue = Math.ceil(stats.max) - 1;

let state0 = helper.state;
widget._refine(helper, stats, [stats.min, targetValue]);
let state1 = helper.state;

expect(helper.search.calledOnce).toBe(true, 'search called once');
expect(state1).toEqual(state0.addNumericRefinement('aNumAttr', '<=', targetValue));
context('without result', () => {
beforeEach(() => {
results = {};
});

it('calls ReactDOM.render(<Slider props />, container)', () => {
widget.render({results, helper});

let props = {
cssClasses: {body: null, root: null},
onChange: () => {},
pips: true,
range: {max: 0, min: 0},
shouldAutoHideContainer: true,
start: [-Infinity, Infinity],
step: 1,
templateProps: {
templates: {footer: '', header: ''},
templatesConfig: undefined,
transformData: undefined,
useCustomCompileOptions: {footer: false, header: false}
},
tooltips: true
};

expect(ReactDOM.render.calledOnce).toBe(true, 'ReactDOM.render called once');
expect(autoHideContainer.calledOnce).toBe(true, 'autoHideContainer called once');
expect(headerFooter.calledOnce).toBe(true, 'headerFooter called once');
expect(ReactDOM.render.firstCall.args[0]).toEqualJSX(<Slider {...props} />);
});
});

it('calls the refinement functions if refined with min+1 and max-1', () => {
let stats = results.disjunctiveFacets[0].stats;
let targetValue = [Math.floor(stats.min) + 1, Math.ceil(stats.max) - 1];

let state0 = helper.state;
widget._refine(helper, stats, targetValue);
let state1 = helper.state;

let expectedState = state0.
context('with results', () => {
beforeEach(() => {
results = {
disjunctiveFacets: [{
name: 'aNumAttr',
data: {
19.99: 610,
39.99: 593,
29.99: 488,
49.99: 486,
99.99: 430,
14.99: 376,
59.99: 323,
34.99: 286,
79.99: 282,
9.99: 277,
599.99: 105,
999.99: 104,
799.99: 96,
899.99: 88,
699.99: 84,
1099.99: 53,
1199.99: 49,
649.99: 48,
1299.99: 46,
749.99: 34
},
exhaustive: true,
stats: {
min: 1.99,
max: 4999.98,
avg: 243.349,
sum: 2433490
}
}]
};
});

it('configures the disjunctiveFacets', () => {
expect(widget.getConfiguration()).toEqual({disjunctiveFacets: ['aNumAttr']});
});

it('calls twice ReactDOM.render(<Slider props />, container)', () => {
widget.render({results, helper});
widget.render({results, helper});

let props = {
cssClasses: {body: null, root: null},
onChange: () => {},
pips: true,
range: {max: 5000, min: 1},
shouldAutoHideContainer: false,
start: [-Infinity, Infinity],
step: 1,
templateProps: {
templates: {footer: '', header: ''},
templatesConfig: undefined,
transformData: undefined,
useCustomCompileOptions: {footer: false, header: false}
},
tooltips: true
};

expect(ReactDOM.render.calledTwice).toBe(true, 'ReactDOM.render called twice');
expect(autoHideContainer.calledOnce).toBe(true, 'autoHideContainer called once');
expect(headerFooter.calledOnce).toBe(true, 'headerFooter called once');
expect(ReactDOM.render.firstCall.args[0]).toEqualJSX(<Slider {...props} />);
expect(ReactDOM.render.firstCall.args[1]).toEqual(container);
expect(ReactDOM.render.secondCall.args[0]).toEqualJSX(<Slider {...props} />);
expect(ReactDOM.render.secondCall.args[1]).toEqual(container);
});

it('doesn\'t call the refinement functions if not refined', () => {
let state0 = helper.state;
widget.render({results, helper});
let state1 = helper.state;
expect(state1).toEqual(state0);
expect(helper.search.called).toBe(false, 'search never called');
});

it('calls the refinement functions if refined with min+1', () => {
let stats = results.disjunctiveFacets[0].stats;
let targetValue = Math.floor(stats.min) + 1;

let state0 = helper.state;
widget._refine(helper, stats, [targetValue, stats.max]);
let state1 = helper.state;

expect(helper.search.calledOnce).toBe(true, 'search called once');
expect(state1).toEqual(state0.addNumericRefinement('aNumAttr', '>=', targetValue));
});

it('calls the refinement functions if refined with max-1', () => {
let stats = results.disjunctiveFacets[0].stats;
let targetValue = Math.ceil(stats.max) - 1;

let state0 = helper.state;
widget._refine(helper, stats, [stats.min, targetValue]);
let state1 = helper.state;

expect(helper.search.calledOnce).toBe(true, 'search called once');
expect(state1).toEqual(state0.addNumericRefinement('aNumAttr', '<=', targetValue));
});

it('calls the refinement functions if refined with min+1 and max-1', () => {
let stats = results.disjunctiveFacets[0].stats;
let targetValue = [Math.floor(stats.min) + 1, Math.ceil(stats.max) - 1];

let state0 = helper.state;
widget._refine(helper, stats, targetValue);
let state1 = helper.state;

let expectedState = state0.
addNumericRefinement('aNumAttr', '>=', targetValue[0]).
addNumericRefinement('aNumAttr', '<=', targetValue[1]);

expect(state1).toEqual(expectedState);
expect(helper.search.calledOnce).toBe(true, 'search called once');
expect(state1).toEqual(expectedState);
expect(helper.search.calledOnce).toBe(true, 'search called once');
});
});

afterEach(() => {
Expand Down
2 changes: 1 addition & 1 deletion widgets/range-slider/range-slider.js
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ function rangeSlider({
},
render({results, helper, templatesConfig}) {
let facet = find(results.disjunctiveFacets, {name: attributeName});
let stats = facet.stats;
let stats = facet !== undefined ? facet.stats : undefined;
let currentRefinement = this._getCurrentRefinement(helper);

if (stats === undefined) {
Expand Down

0 comments on commit 70e8554

Please sign in to comment.