Skip to content

Commit 11399e6

Browse files
authored
fix(client): use client.search in sffv for v5 (#6354)
* fix(client): use client.search in sffv for v5 v5 has a `searchForFacetValues` function, but it's single-index only. We thus need to detect it and use `client.search` directly. In a future major we can change this and only use `client.search` * hup lint fixed
1 parent 2a171a9 commit 11399e6

File tree

5 files changed

+108
-30
lines changed

5 files changed

+108
-30
lines changed

packages/algoliasearch-helper/src/algoliasearch.helper.js

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -371,7 +371,10 @@ AlgoliaSearchHelper.prototype.searchForFacetValues = function (
371371
maxFacetHits,
372372
userState
373373
) {
374-
var clientHasSFFV = typeof this.client.searchForFacetValues === 'function';
374+
var clientHasSFFV =
375+
typeof this.client.searchForFacetValues === 'function' &&
376+
// v5 has a wrong sffv signature
377+
typeof this.client.searchForFacets !== 'function';
375378
var clientHasInitIndex = typeof this.client.initIndex === 'function';
376379
if (
377380
!clientHasSFFV &&

packages/algoliasearch-helper/test/spec/algoliasearch.helper/pendingSearch.js

Lines changed: 71 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
'use strict';
22

33
var algoliasearch = require('algoliasearch');
4+
var isV5 = (algoliasearch.apiClientVersion || '')[0] === '5';
45
algoliasearch = algoliasearch.algoliasearch || algoliasearch;
56

67
var algoliasearchHelper = require('../../../index');
@@ -71,43 +72,85 @@ test('When searchOnce with promises, hasPendingRequests is true', function (done
7172
triggerCb();
7273
});
7374

74-
test('When searchForFacetValues, hasPendingRequests is true', function (done) {
75-
var client = algoliasearch('dsf', 'dsfdf');
75+
if (!isV5) {
76+
test('When searchForFacetValues, hasPendingRequests is true (v3, v4)', function (done) {
77+
var client = algoliasearch('dsf', 'dsfdf');
78+
79+
let triggerCb;
80+
client.searchForFacetValues = function () {
81+
return new Promise(function (resolve) {
82+
triggerCb = function () {
83+
resolve([
84+
{
85+
exhaustiveFacetsCount: true,
86+
facetHits: [],
87+
processingTimeMS: 3,
88+
},
89+
]);
90+
};
91+
});
92+
};
7693

77-
var triggerCb;
78-
client.searchForFacetValues = function () {
79-
return new Promise(function (resolve) {
80-
triggerCb = function () {
81-
resolve([
82-
{
83-
exhaustiveFacetsCount: true,
84-
facetHits: [],
85-
processingTimeMS: 3,
86-
},
87-
]);
88-
};
94+
var helper = algoliasearchHelper(client, 'test_hotels-node');
95+
var countNoMoreSearch = 0;
96+
helper.on('searchQueueEmpty', function () {
97+
countNoMoreSearch += 1;
8998
});
90-
};
9199

92-
var helper = algoliasearchHelper(client, 'test_hotels-node');
93-
var countNoMoreSearch = 0;
94-
helper.on('searchQueueEmpty', function () {
95-
countNoMoreSearch += 1;
100+
expect(helper.hasPendingRequests()).toBe(false);
101+
102+
helper.searchForFacetValues('').then(function () {
103+
expect(helper.hasPendingRequests()).toBe(false);
104+
expect(countNoMoreSearch).toBe(1);
105+
done();
106+
});
107+
108+
expect(helper.hasPendingRequests()).toBe(true);
109+
expect(countNoMoreSearch).toBe(0);
110+
111+
triggerCb();
96112
});
113+
} else {
114+
test('When searchForFacetValues, hasPendingRequests is true (v5)', function (done) {
115+
var client = algoliasearch('dsf', 'dsfdf');
116+
117+
let triggerCb;
118+
client.search = function () {
119+
return new Promise(function (resolve) {
120+
triggerCb = function () {
121+
resolve({
122+
results: [
123+
{
124+
exhaustiveFacetsCount: true,
125+
facetHits: [],
126+
processingTimeMS: 3,
127+
},
128+
],
129+
});
130+
};
131+
});
132+
};
97133

98-
expect(helper.hasPendingRequests()).toBe(false);
134+
var helper = algoliasearchHelper(client, 'test_hotels-node');
135+
var countNoMoreSearch = 0;
136+
helper.on('searchQueueEmpty', function () {
137+
countNoMoreSearch += 1;
138+
});
99139

100-
helper.searchForFacetValues('').then(function () {
101140
expect(helper.hasPendingRequests()).toBe(false);
102-
expect(countNoMoreSearch).toBe(1);
103-
done();
104-
});
105141

106-
expect(helper.hasPendingRequests()).toBe(true);
107-
expect(countNoMoreSearch).toBe(0);
142+
helper.searchForFacetValues('').then(function () {
143+
expect(helper.hasPendingRequests()).toBe(false);
144+
expect(countNoMoreSearch).toBe(1);
145+
done();
146+
});
108147

109-
triggerCb();
110-
});
148+
expect(helper.hasPendingRequests()).toBe(true);
149+
expect(countNoMoreSearch).toBe(0);
150+
151+
triggerCb();
152+
});
153+
}
111154

112155
test('When helper.search(), hasPendingRequests is true', function (done) {
113156
var testData = require('../../datasets/SearchParameters/search.dataset')();

packages/algoliasearch-helper/test/spec/algoliasearch.helper/searchForFacetValues.js

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,26 @@ test('searchForFacetValues calls the index method if no client method', function
5656
});
5757
});
5858

59+
test('searchForFacetValues calls client.search if client.searchForFacets exists', function () {
60+
var clientSearch = jest.fn(function () {
61+
return Promise.resolve({
62+
results: [makeFakeSearchForFacetValuesResponse()],
63+
});
64+
});
65+
66+
var fakeClient = {
67+
searchForFacets: jest.fn(),
68+
searchForFacetValues: jest.fn(),
69+
search: clientSearch,
70+
};
71+
72+
var helper = algoliasearchHelper(fakeClient, 'index');
73+
74+
return helper.searchForFacetValues('facet', 'query', 1).then(function () {
75+
expect(clientSearch).toHaveBeenCalledTimes(1);
76+
});
77+
});
78+
5979
test('searchForFacetValues resolve with the correct response from client', function () {
6080
var fakeClient = {
6181
addAlgoliaAgent: function () {},

packages/algoliasearch-helper/types/algoliasearch.d.ts

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -306,6 +306,17 @@ export type SupportedLanguage = PickForClient<{
306306
v5: AlgoliaSearch.SupportedLanguage;
307307
}>;
308308

309+
// v5 only has the `searchForFacetValues` method in the `search` client, not in `lite`.
310+
// We need to check both clients to get the correct type.
311+
// (this is not actually used in the codebase, but it's here for completeness)
312+
type SearchForFacetValuesV5 = ClientSearchV5 | ClientFullV5 extends {
313+
searchForFacetValues: unknown;
314+
}
315+
?
316+
| ClientSearchV5['searchForFacetValues']
317+
| ClientFullV5['searchForFacetValues']
318+
: never;
319+
309320
export interface SearchClient {
310321
search: <T>(
311322
requests: Array<{ indexName: string; params: SearchOptions }>
@@ -317,7 +328,7 @@ export interface SearchClient {
317328
searchForFacetValues: unknown;
318329
}
319330
? DefaultSearchClient['searchForFacetValues']
320-
: never;
331+
: SearchForFacetValuesV5;
321332
initIndex?: DefaultSearchClient extends { initIndex: unknown }
322333
? DefaultSearchClient['initIndex']
323334
: never;

packages/instantsearch.js/src/widgets/refinement-list/__tests__/refinement-list.test.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1187,6 +1187,7 @@ function createMockedSearchClient() {
11871187
return Promise.resolve([
11881188
createSFFVResponse({
11891189
facetHits:
1190+
// @ts-ignore for v5, which has a different definition of `searchForFacetValues`
11901191
requests[0].params.facetQuery === 'query with no results'
11911192
? []
11921193
: [

0 commit comments

Comments
 (0)