Skip to content

Commit 46c1526

Browse files
authored
feat(javascript): provide browseObjects, browseRules and browseSynonyms helper methods (#887)
1 parent bc1bb54 commit 46c1526

File tree

17 files changed

+612
-191
lines changed

17 files changed

+612
-191
lines changed

.github/.cache_version

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
0.0.11
1+
0.0.12

clients/algoliasearch-client-javascript/bundlesize.config.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"files": [
33
{
44
"path": "packages/algoliasearch/dist/algoliasearch.umd.js",
5-
"maxSize": "8.30KB"
5+
"maxSize": "8.60KB"
66
},
77
{
88
"path": "packages/algoliasearch/dist/lite/lite.umd.js",
@@ -30,7 +30,7 @@
3030
},
3131
{
3232
"path": "packages/client-search/dist/client-search.umd.js",
33-
"maxSize": "6.60KB"
33+
"maxSize": "6.90KB"
3434
},
3535
{
3636
"path": "packages/client-sources/dist/client-sources.umd.js",

clients/algoliasearch-client-javascript/packages/client-common/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export * from './src/createAuth';
22
export * from './src/createEchoRequester';
3-
export * from './src/createRetryablePromise';
3+
export * from './src/createIterablePromise';
44
export * from './src/cache';
55
export * from './src/transporter';
66
export * from './src/createAlgoliaAgent';

clients/algoliasearch-client-javascript/packages/client-common/jest.config.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ const config: Config.InitialOptions = {
1414
testPathIgnorePatterns: [
1515
'src/__tests__/cache/null-cache.test.ts',
1616
'src/__tests__/cache/memory-cache.test.ts',
17+
'src/__tests__/create-iterable-promise.test.ts',
1718
],
1819
},
1920
{
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,238 @@
1+
import { createIterablePromise } from '../createIterablePromise';
2+
3+
describe('createIterablePromise', () => {
4+
describe('func', () => {
5+
it('provides the `previousResponse` parameter', async () => {
6+
const responses: Array<string | undefined> = [];
7+
const promise = createIterablePromise<string | undefined>({
8+
func: (previousResponse) => {
9+
return new Promise((resolve) => {
10+
resolve(previousResponse === undefined ? 'yes' : 'no');
11+
});
12+
},
13+
validate: () => responses.length === 3,
14+
aggregator: (response) => responses.push(response),
15+
});
16+
17+
await expect(promise).resolves.toEqual('no');
18+
expect(responses).toEqual(['yes', 'no', 'no']);
19+
});
20+
});
21+
22+
describe('validate', () => {
23+
it('iterates on a `func` until `validate` is met', async () => {
24+
let calls = 0;
25+
const promise = createIterablePromise({
26+
func: () => {
27+
return new Promise((resolve) => {
28+
calls += 1;
29+
resolve(`success #${calls}`);
30+
});
31+
},
32+
validate: () => calls >= 3,
33+
});
34+
35+
await expect(promise).resolves.toEqual('success #3');
36+
expect(calls).toBe(3);
37+
});
38+
39+
it('forward the response of the `func`', async () => {
40+
let calls = 0;
41+
const promise = createIterablePromise<number>({
42+
func: () => {
43+
return new Promise((resolve) => {
44+
calls += 1;
45+
resolve(calls);
46+
});
47+
},
48+
validate: (response) => response >= 3,
49+
});
50+
51+
await expect(promise).resolves.toEqual(3);
52+
expect(calls).toBe(3);
53+
});
54+
});
55+
56+
describe('aggregator', () => {
57+
it('is called before iterating', async () => {
58+
let calls = 0;
59+
let count = 0;
60+
const promise = createIterablePromise({
61+
func: () => {
62+
return new Promise((resolve) => {
63+
calls += 1;
64+
resolve(`success #${calls}`);
65+
});
66+
},
67+
validate: () => calls >= 3,
68+
aggregator: () => (count += 3),
69+
});
70+
71+
await expect(promise).resolves.toEqual('success #3');
72+
expect(calls).toBe(3);
73+
expect(count).toBe(3 * 3);
74+
});
75+
76+
it('forward the response of the `func`', async () => {
77+
let calls = 0;
78+
const responses: string[] = [];
79+
const promise = createIterablePromise<string>({
80+
func: () => {
81+
return new Promise((resolve) => {
82+
calls += 1;
83+
resolve(`success #${calls}`);
84+
});
85+
},
86+
validate: () => calls >= 3,
87+
aggregator: (response) => {
88+
responses.push(response);
89+
},
90+
});
91+
92+
await expect(promise).resolves.toEqual('success #3');
93+
expect(calls).toBe(3);
94+
expect(responses).toEqual(['success #1', 'success #2', 'success #3']);
95+
});
96+
});
97+
98+
describe('timeout', () => {
99+
it('defaults to no timeout (0)', async () => {
100+
let calls = 0;
101+
const before = Date.now();
102+
const promise = createIterablePromise({
103+
func: () => {
104+
return new Promise((resolve) => {
105+
calls += 1;
106+
resolve(`success #${calls}`);
107+
});
108+
},
109+
validate: () => calls >= 2,
110+
});
111+
112+
await expect(promise).resolves.toEqual('success #2');
113+
114+
expect(Date.now() - before).toBeGreaterThanOrEqual(0);
115+
expect(Date.now() - before).toBeLessThan(10);
116+
expect(calls).toBe(2);
117+
});
118+
119+
it('waits before calling the `func` again', async () => {
120+
let calls = 0;
121+
const before = Date.now();
122+
const promise = createIterablePromise({
123+
func: () => {
124+
return new Promise((resolve) => {
125+
calls += 1;
126+
resolve(`success #${calls}`);
127+
});
128+
},
129+
validate: () => calls >= 2,
130+
timeout: () => 2000,
131+
});
132+
133+
await expect(promise).resolves.toEqual('success #2');
134+
135+
expect(Date.now() - before).toBeGreaterThanOrEqual(2000);
136+
expect(Date.now() - before).toBeLessThan(2010);
137+
expect(calls).toBe(2);
138+
});
139+
});
140+
141+
describe('error', () => {
142+
it('gets the rejection of the given promise via reject', async () => {
143+
let calls = 0;
144+
145+
const promise = createIterablePromise({
146+
func: () => {
147+
return new Promise((resolve, reject) => {
148+
calls += 1;
149+
if (calls <= 3) {
150+
resolve('okay');
151+
} else {
152+
reject(new Error('nope'));
153+
}
154+
});
155+
},
156+
validate: () => false,
157+
});
158+
159+
await expect(promise).rejects.toEqual(
160+
expect.objectContaining({ message: 'nope' })
161+
);
162+
});
163+
164+
it('gets the rejection of the given promise via throw', async () => {
165+
let calls = 0;
166+
167+
const promise = createIterablePromise({
168+
func: () => {
169+
return new Promise((resolve) => {
170+
calls += 1;
171+
if (calls <= 3) {
172+
resolve('okay');
173+
} else {
174+
throw new Error('nope');
175+
}
176+
});
177+
},
178+
validate: () => false,
179+
});
180+
181+
await expect(promise).rejects.toEqual(
182+
expect.objectContaining({ message: 'nope' })
183+
);
184+
});
185+
186+
it('rejects with the given `message` when `validate` hits', async () => {
187+
const MAX_RETRIES = 3;
188+
let calls = 0;
189+
190+
const promise = createIterablePromise({
191+
func: () => {
192+
return new Promise((resolve) => {
193+
calls += 1;
194+
resolve('okay');
195+
});
196+
},
197+
validate: () => false,
198+
error: {
199+
validate: () => calls >= MAX_RETRIES,
200+
message: () => `Error is thrown: ${calls}/${MAX_RETRIES}`,
201+
},
202+
});
203+
204+
await expect(promise).rejects.toEqual(
205+
expect.objectContaining({
206+
message: 'Error is thrown: 3/3',
207+
})
208+
);
209+
expect(calls).toBe(MAX_RETRIES);
210+
});
211+
212+
it('forward the response of the `func`', async () => {
213+
const MAX_RETRIES = 3;
214+
let calls = 0;
215+
216+
const promise = createIterablePromise<number>({
217+
func: () => {
218+
return new Promise((resolve) => {
219+
calls += 1;
220+
resolve(calls);
221+
});
222+
},
223+
validate: () => false,
224+
error: {
225+
validate: (response) => response >= MAX_RETRIES,
226+
message: (response) => `Error is thrown: ${response}/${MAX_RETRIES}`,
227+
},
228+
});
229+
230+
await expect(promise).rejects.toEqual(
231+
expect.objectContaining({
232+
message: 'Error is thrown: 3/3',
233+
})
234+
);
235+
expect(calls).toBe(MAX_RETRIES);
236+
});
237+
});
238+
});

clients/algoliasearch-client-javascript/packages/client-common/src/__tests__/create-retryable-promise.test.ts

Lines changed: 0 additions & 86 deletions
This file was deleted.

0 commit comments

Comments
 (0)