Skip to content

Commit 705b3e6

Browse files
samoussHaroenv
authored andcommitted
feat(connectVoiceSearch): clear the state on dispose (#3823)
* test(connectVoiceSearch): scope dispose tests togheter * test(connectVoiceSearch): do not throw without unmount function * feat(connectVoiceSearch): remove query on dispose * test(connectVoiceSearch): rename jsHelper -> algoliasearchHelper * test(connectVoiceSearch): inline test setup
1 parent 940522c commit 705b3e6

File tree

2 files changed

+121
-60
lines changed

2 files changed

+121
-60
lines changed

src/connectors/voice-search/__tests__/connectVoiceSearch-test.js

Lines changed: 114 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import jsHelper, { SearchParameters } from 'algoliasearch-helper';
1+
import algoliasearchHelper, { SearchParameters } from 'algoliasearch-helper';
22
import connectVoiceSearch from '../connectVoiceSearch';
33

44
jest.mock('../../../lib/voiceSearchHelper', () => {
@@ -16,30 +16,18 @@ jest.mock('../../../lib/voiceSearchHelper', () => {
1616
};
1717
});
1818

19-
function getDefaultSetup() {
20-
const renderFn = jest.fn();
21-
const unmountFn = jest.fn();
22-
const makeWidget = connectVoiceSearch(renderFn, unmountFn);
23-
const widget = makeWidget({});
24-
const helper = jsHelper({});
25-
26-
return {
27-
renderFn,
28-
unmountFn,
29-
widget,
30-
helper,
31-
};
32-
}
33-
3419
function getInitializedWidget() {
35-
const { renderFn, unmountFn, widget, helper } = getDefaultSetup();
20+
const helper = algoliasearchHelper({}, '');
21+
22+
const renderFn = () => {};
23+
const makeWidget = connectVoiceSearch(renderFn);
24+
const widget = makeWidget({});
3625

3726
helper.search = () => {};
3827
widget.init({ helper });
3928

4029
return {
4130
renderFn,
42-
unmountFn,
4331
widget,
4432
helper,
4533
refine: query => widget._refine(query),
@@ -59,72 +47,139 @@ See documentation: https://www.algolia.com/doc/api-reference/widgets/voice-searc
5947
});
6048
});
6149

62-
describe('lifecycle', () => {
63-
it('calls renderFn during init and render', () => {
64-
const { renderFn, widget, helper } = getDefaultSetup();
65-
widget.init({ helper });
66-
expect(renderFn).toHaveBeenCalledTimes(1);
67-
expect(renderFn).toHaveBeenLastCalledWith(
68-
expect.objectContaining({}),
69-
true
70-
);
71-
widget.render({
72-
helper,
73-
});
74-
expect(renderFn).toHaveBeenCalledTimes(2);
75-
expect(renderFn).toHaveBeenLastCalledWith(
76-
expect.objectContaining({}),
77-
false
78-
);
79-
});
50+
it('calls renderFn during init and render', () => {
51+
const helper = algoliasearchHelper({}, '');
8052

81-
it('calls unmount on `dispose`', () => {
82-
const { unmountFn, widget, helper } = getDefaultSetup();
83-
widget.init({ helper });
84-
widget.dispose({ helper, state: helper.state });
85-
expect(unmountFn).toHaveBeenCalledTimes(1);
86-
});
53+
const renderFn = jest.fn();
54+
const makeWidget = connectVoiceSearch(renderFn);
55+
const widget = makeWidget({});
8756

88-
it('removes event listeners on `dispose`', () => {
89-
const { widget, helper } = getDefaultSetup();
90-
widget.init({ helper });
91-
widget.dispose({ helper, state: helper.state });
92-
expect(widget._voiceSearchHelper.dispose).toHaveBeenCalledTimes(1);
93-
});
57+
widget.init({ helper });
9458

95-
it('does not throw without the unmount function', () => {
96-
const renderFn = () => {};
97-
const makeWidget = connectVoiceSearch(renderFn);
98-
const widget = makeWidget({});
99-
const helper = jsHelper({});
100-
widget.init({ helper });
101-
expect(() =>
102-
widget.dispose({ helper, state: helper.state })
103-
).not.toThrow();
59+
expect(renderFn).toHaveBeenCalledTimes(1);
60+
expect(renderFn).toHaveBeenLastCalledWith(
61+
expect.objectContaining({}),
62+
true
63+
);
64+
65+
widget.render({
66+
helper,
10467
});
68+
69+
expect(renderFn).toHaveBeenCalledTimes(2);
70+
expect(renderFn).toHaveBeenLastCalledWith(
71+
expect.objectContaining({}),
72+
false
73+
);
10574
});
10675

10776
it('triggers render when state changes', () => {
108-
const { renderFn, widget, helper } = getDefaultSetup();
77+
const helper = algoliasearchHelper({}, '');
78+
79+
const renderFn = jest.fn();
80+
const makeWidget = connectVoiceSearch(renderFn);
81+
const widget = makeWidget({});
82+
10983
widget.init({ helper });
84+
11085
expect(renderFn).toHaveBeenCalledTimes(1);
86+
11187
widget._voiceSearchHelper.changeState();
88+
11289
expect(renderFn).toHaveBeenCalledTimes(2);
90+
11391
widget._voiceSearchHelper.changeState();
92+
11493
expect(renderFn).toHaveBeenCalledTimes(3);
11594
});
11695

11796
it('setQuery and search when query changes', () => {
118-
const { widget, helper } = getDefaultSetup();
97+
const helper = algoliasearchHelper({}, '');
98+
99+
const renderFn = jest.fn();
100+
const makeWidget = connectVoiceSearch(renderFn);
101+
const widget = makeWidget({});
102+
119103
jest.spyOn(helper, 'setQuery');
104+
120105
helper.search = jest.fn();
106+
121107
widget.init({ helper });
108+
122109
widget._voiceSearchHelper.changeQuery('foo');
110+
123111
expect(helper.setQuery).toHaveBeenCalledTimes(1);
124112
expect(helper.setQuery).toHaveBeenCalledWith('foo');
125113
expect(helper.search).toHaveBeenCalledTimes(1);
126114
});
127115

116+
describe('dispose', () => {
117+
it('calls the unmount function', () => {
118+
const helper = algoliasearchHelper({}, '');
119+
120+
const renderFn = () => {};
121+
const unmountFn = jest.fn();
122+
const makeWidget = connectVoiceSearch(renderFn, unmountFn);
123+
const widget = makeWidget({});
124+
125+
widget.init({ helper });
126+
127+
expect(unmountFn).toHaveBeenCalledTimes(0);
128+
129+
widget.dispose({ helper, state: helper.state });
130+
131+
expect(unmountFn).toHaveBeenCalledTimes(1);
132+
});
133+
134+
it('does not throw without the unmount function', () => {
135+
const helper = algoliasearchHelper({}, '');
136+
137+
const renderFn = () => {};
138+
const makeWidget = connectVoiceSearch(renderFn);
139+
const widget = makeWidget({});
140+
141+
widget.init({ helper });
142+
143+
expect(() =>
144+
widget.dispose({ helper, state: helper.state })
145+
).not.toThrow();
146+
});
147+
148+
it('removes event listeners on the voice helper', () => {
149+
const helper = algoliasearchHelper({}, '');
150+
151+
const renderFn = () => {};
152+
const makeWidget = connectVoiceSearch(renderFn);
153+
const widget = makeWidget({});
154+
155+
widget.init({ helper });
156+
157+
expect(widget._voiceSearchHelper.dispose).toHaveBeenCalledTimes(0);
158+
159+
widget.dispose({ helper, state: helper.state });
160+
161+
expect(widget._voiceSearchHelper.dispose).toHaveBeenCalledTimes(1);
162+
});
163+
164+
it('removes the `query` from the `SearchParameters`', () => {
165+
const helper = algoliasearchHelper({}, '', {
166+
query: 'Apple',
167+
});
168+
169+
const renderFn = () => {};
170+
const makeWidget = connectVoiceSearch(renderFn);
171+
const widget = makeWidget({});
172+
173+
widget.init({ helper });
174+
175+
expect(helper.state.query).toBe('Apple');
176+
177+
const nextState = widget.dispose({ helper, state: helper.state });
178+
179+
expect(nextState.query).toBeUndefined();
180+
});
181+
});
182+
128183
describe('getWidgetState', () => {
129184
it('returns the same state if query is an empty string', () => {
130185
const { widget, helper, refine } = getInitializedWidget();

src/connectors/voice-search/connectVoiceSearch.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,23 @@ const connectVoiceSearch: VoiceSearchConnector = (
9999
voiceSearchHelper: (this as any)._voiceSearchHelper,
100100
});
101101
},
102+
102103
render({ instantSearchInstance }) {
103104
render({
104105
isFirstRendering: false,
105106
instantSearchInstance,
106107
voiceSearchHelper: (this as any)._voiceSearchHelper,
107108
});
108109
},
110+
109111
dispose({ state }) {
110112
(this as any)._voiceSearchHelper.dispose();
113+
111114
unmountFn();
112-
return state.setQuery('');
115+
116+
return state.setQueryParameter('query', undefined);
113117
},
118+
114119
getWidgetState(uiState, { searchParameters }) {
115120
const query = searchParameters.query || '';
116121

@@ -123,6 +128,7 @@ const connectVoiceSearch: VoiceSearchConnector = (
123128
query,
124129
};
125130
},
131+
126132
getWidgetSearchParameters(searchParameters, { uiState }) {
127133
return searchParameters.setQueryParameter('query', uiState.query);
128134
},

0 commit comments

Comments
 (0)