Skip to content

Commit f68fbc9

Browse files
committed
test: replace setTimeout with await sleep
Because `setTimeout` cannot be awaited and might cause flaky tests. `delayServerRespond` is no longer necessary. Also remove redundant comments.
1 parent fae8b64 commit f68fbc9

11 files changed

+174
-150
lines changed

src/source/geojson_source.test.ts

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ describe('GeoJSONSource.setData', () => {
158158
});
159159
};
160160
source.setData('http://localhost/nonexistent');
161-
await sleep(0); // to resolve pending `await`s
161+
await sleep(0);
162162
expect(spy).toHaveBeenCalled();
163163
});
164164

@@ -305,7 +305,7 @@ describe('GeoJSONSource.update', () => {
305305
buffer: 16,
306306
generateId: true
307307
} as GeoJSONSourceOptions, mockDispatcher, undefined).load();
308-
await sleep(0); // to resolve pending `await`s
308+
await sleep(0);
309309
expect(spy).toHaveBeenCalled();
310310
});
311311

@@ -336,7 +336,7 @@ describe('GeoJSONSource.update', () => {
336336
generateId: true
337337
} as GeoJSONSourceOptions, mockDispatcher, undefined);
338338
source.load();
339-
await sleep(0); // to resolve pending `await`s
339+
await sleep(0);
340340
expect(spy).toHaveBeenCalled();
341341
});
342342

@@ -366,7 +366,7 @@ describe('GeoJSONSource.update', () => {
366366
spy.mockClear();
367367

368368
source.setClusterOptions({cluster: true, clusterRadius: 80, clusterMaxZoom: 16});
369-
await sleep(0); // to resolve pending `await`s
369+
await sleep(0);
370370

371371
expect(spy).toHaveBeenCalledTimes(1);
372372
expect(spy.mock.calls[0][0].type).toBe(MessageType.loadData);
@@ -395,7 +395,7 @@ describe('GeoJSONSource.update', () => {
395395

396396
// Wait for initial data to be loaded
397397
source.load();
398-
await sleep(0); // to resolve all the pending `await`s
398+
await sleep(0);
399399

400400
spy.mockClear();
401401

@@ -408,7 +408,7 @@ describe('GeoJSONSource.update', () => {
408408
source.setData(sourceData2);
409409
source.setClusterOptions({cluster: true, clusterRadius: 80, clusterMaxZoom: 16});
410410

411-
await sleep(0); // to resolve all the pending `await`s
411+
await sleep(0);
412412

413413
expect(spy).toHaveBeenCalledTimes(2);
414414
expect(spy.mock.calls[0][0].type).toBe(MessageType.loadData);
@@ -465,7 +465,7 @@ describe('GeoJSONSource.update', () => {
465465
source.updateData(diff);
466466
source.setClusterOptions({cluster: true, clusterRadius: 80, clusterMaxZoom: 16});
467467

468-
await sleep(0); // to resolve all the pending `await`s
468+
await sleep(0);
469469

470470
expect(spy).toHaveBeenCalledTimes(2);
471471
expect(spy.mock.calls[0][0].data.cluster).toBe(false);
@@ -504,7 +504,7 @@ describe('GeoJSONSource.update', () => {
504504
generateId: true
505505
} as GeoJSONSourceOptions, mockDispatcher, undefined);
506506
source.load();
507-
await sleep(0); // to resolve pending `await`s
507+
await sleep(0);
508508
expect(spy).toHaveBeenCalled();
509509
});
510510

src/source/image_source.test.ts

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -45,11 +45,6 @@ class StubMap extends Evented {
4545
describe('ImageSource', () => {
4646
stubAjaxGetImage(undefined);
4747
let server: FakeServer;
48-
// delay server.respond so that it happens after the pending request is made
49-
// this works around a microtask delay introduced by unconditionally awaiting the transformRequest result
50-
const delayServerRespond = () => {
51-
setTimeout(() => server.respond());
52-
};
5348

5449
beforeEach(() => {
5550
global.fetch = null;
@@ -72,7 +67,8 @@ describe('ImageSource', () => {
7267
expect(e.dataType).toBe('source');
7368
});
7469
source.onAdd(new StubMap() as any);
75-
delayServerRespond();
70+
await sleep(0);
71+
server.respond();
7672
await sleep(0);
7773
expect(source.image).toBeTruthy();
7874
});
@@ -99,7 +95,8 @@ describe('ImageSource', () => {
9995
};
10096
const promise = source.once('data');
10197
source.onAdd(map);
102-
delayServerRespond();
98+
await sleep(0);
99+
server.respond();
103100
await promise;
104101
expect(server.requests[0].url).toBe('/image.png');
105102
expect(server.requests[0].requestHeaders['Authorization']).toBe('Bearer token');
@@ -144,7 +141,8 @@ describe('ImageSource', () => {
144141
url: '/image2.png',
145142
coordinates: [[0, 0], [-1, 0], [-1, -1], [0, -1]]
146143
});
147-
delayServerRespond();
144+
await sleep(0);
145+
server.respond();
148146
await sleep(0);
149147
const afterSerialized = source.serialize();
150148
expect(afterSerialized.coordinates).toEqual([[0, 0], [-1, 0], [-1, -1], [0, -1]]);
@@ -154,7 +152,8 @@ describe('ImageSource', () => {
154152
const source = createSource({url: '/image.png'});
155153
const promise = waitForEvent(source, 'data', (e) => e.dataType === 'source' && e.sourceDataType === 'content');
156154
source.onAdd(new StubMap() as any);
157-
delayServerRespond();
155+
await sleep(0);
156+
server.respond();
158157
await promise;
159158
expect(typeof source.tileID == 'object').toBeTruthy();
160159
});
@@ -163,7 +162,8 @@ describe('ImageSource', () => {
163162
const source = createSource({url: '/image.png'});
164163
const promise = waitForEvent(source, 'data', (e) => e.dataType === 'source' && e.sourceDataType === 'metadata');
165164
source.onAdd(new StubMap() as any);
166-
delayServerRespond();
165+
await sleep(0);
166+
server.respond();
167167
await expect(promise).resolves.toBeDefined();
168168
});
169169

@@ -201,7 +201,8 @@ describe('ImageSource', () => {
201201
source.onAdd(map);
202202
expect(source.image).toBeUndefined();
203203
source.updateImage({url: '/image2.png'});
204-
delayServerRespond();
204+
await sleep(0);
205+
server.respond();
205206
await sleep(10);
206207

207208
expect(source.image).toBeTruthy();
@@ -214,7 +215,7 @@ describe('ImageSource', () => {
214215
// Suppress errors because we're aborting.
215216
map.on('error', () => {});
216217
source.onAdd(map);
217-
await sleep(0); // flush any resolvable `await`s
218+
await sleep(0);
218219

219220
const spy = vi.spyOn(server.requests[0] as any, 'abort');
220221

@@ -228,7 +229,8 @@ describe('ImageSource', () => {
228229

229230
expect(source.loaded()).toBe(false);
230231
source.onAdd(map);
231-
delayServerRespond();
232+
await sleep(0);
233+
server.respond();
232234
await sleep(0);
233235
expect(source.loaded()).toBe(true);
234236

@@ -239,7 +241,8 @@ describe('ImageSource', () => {
239241

240242
expect(missingImagesource.loaded()).toBe(false);
241243
missingImagesource.onAdd(map);
242-
delayServerRespond();
244+
await sleep(0);
245+
server.respond();
243246
await sleep(0);
244247

245248
expect(missingImagesource.loaded()).toBe(true);

src/source/load_tilejson.test.ts

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,6 @@ import {type RasterSourceSpecification} from '@maplibre/maplibre-gl-style-spec';
99

1010
describe('loadTileJson', () => {
1111
let server: FakeServer;
12-
// delay server.resond so that it happens after the pending request is made
13-
// this works around a microtask delay introduced by unconditionally awaiting the transformRequest result
14-
const delayServerRespond = () => {
15-
setTimeout(() => server.respond());
16-
};
1712
beforeEach(() => {
1813
global.fetch = null;
1914
server = fakeServer.create();
@@ -45,7 +40,8 @@ describe('loadTileJson', () => {
4540
});
4641

4742
const promise = loadTileJson(options, requestManager, new AbortController());
48-
delayServerRespond();
43+
await sleep(0);
44+
server.respond();
4945
const result = await promise;
5046

5147
expect(result).toEqual(mockTileJSON);
@@ -75,8 +71,10 @@ describe('loadTileJson', () => {
7571
url,
7672
headers: {Authorization: 'Bearer token'}
7773
}));
78-
delayServerRespond();
79-
const result = await loadTileJson(options, requestManager, new AbortController());
74+
const promise = loadTileJson(options, requestManager, new AbortController());
75+
await sleep(0);
76+
server.respond();
77+
const result = await promise;
8078

8179
expect(result).toEqual(mockTileJSON);
8280
expect(server.requests[0].url).toBe('http://example.com/test.json');
@@ -106,7 +104,8 @@ describe('loadTileJson', () => {
106104
});
107105

108106
const promise = loadTileJson(options, requestManager, new AbortController());
109-
delayServerRespond();
107+
await sleep(0);
108+
server.respond();
110109
const result = await promise;
111110

112111
expect(result).toEqual({
@@ -139,7 +138,8 @@ describe('loadTileJson', () => {
139138
});
140139

141140
const promise = loadTileJson(options, requestManager, new AbortController());
142-
delayServerRespond();
141+
await sleep(0);
142+
server.respond();
143143
const result: any = await promise;
144144

145145
expect(result.someData1).toBeUndefined();
@@ -168,7 +168,8 @@ describe('loadTileJson', () => {
168168
});
169169

170170
const promise = loadTileJson(options, requestManager, new AbortController());
171-
delayServerRespond();
171+
await sleep(0);
172+
server.respond();
172173
const result = await promise;
173174

174175
expect(result.vectorLayerIds).toEqual(['layer1', 'layer2']);
@@ -196,9 +197,9 @@ describe('loadTileJson', () => {
196197

197198
const abortController = new AbortController();
198199
const promise = loadTileJson(options, requestManager, abortController);
199-
await sleep(0); // to resolve pending transformRequest
200+
await sleep(0);
200201
abortController.abort();
201-
delayServerRespond();
202+
server.respond();
202203

203204
await expect(promise).rejects.toThrow(expect.objectContaining({name: ABORT_ERROR}));
204205
});
@@ -214,7 +215,8 @@ describe('loadTileJson', () => {
214215
});
215216

216217
const promise = loadTileJson(options, requestManager, new AbortController());
217-
delayServerRespond();
218+
await sleep(0);
219+
server.respond();
218220

219221
await expect(promise).rejects.toThrow('AJAXError: Not Found (404): http://example.com/test.json');
220222
});

0 commit comments

Comments
 (0)