Skip to content

Commit eebc28f

Browse files
authored
Merge pull request #5980 from marmelab/stabilize-unit-tests
Avoid waiting for an arbitrary short duration in tests
2 parents 44c20b4 + d750e7f commit eebc28f

File tree

8 files changed

+182
-146
lines changed

8 files changed

+182
-146
lines changed

packages/ra-core/src/controller/field/ReferenceArrayFieldController.spec.tsx

+6-4
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import expect from 'expect';
44
import ReferenceArrayFieldController from './ReferenceArrayFieldController';
55
import { DataProviderContext } from '../../dataProvider';
66
import { renderWithRedux } from 'ra-test';
7+
import { waitFor } from '@testing-library/react';
78

89
describe('<ReferenceArrayFieldController />', () => {
910
it('should set the loaded prop to false when related records are not yet fetched', () => {
@@ -197,10 +198,11 @@ describe('<ReferenceArrayFieldController />', () => {
197198
},
198199
}
199200
);
200-
await new Promise(resolve => setTimeout(resolve, 10));
201-
expect(dispatch).toBeCalledTimes(5);
202-
expect(dispatch.mock.calls[0][0].type).toBe('RA/CRUD_GET_MANY');
203-
expect(dataProvider.getMany).toBeCalledTimes(1);
201+
await waitFor(() => {
202+
expect(dispatch).toBeCalledTimes(5);
203+
expect(dispatch.mock.calls[0][0].type).toBe('RA/CRUD_GET_MANY');
204+
expect(dataProvider.getMany).toBeCalledTimes(1);
205+
});
204206
});
205207

206208
it('should filter string data based on the filter props', () => {

packages/ra-core/src/controller/useFilterState.spec.tsx

+15-12
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from 'react';
22
import { renderHook } from 'ra-test';
33
import useFilterState from './useFilterState';
4-
import { render, act } from '@testing-library/react';
4+
import { render, act, waitFor } from '@testing-library/react';
55

66
describe('useFilterState', () => {
77
it('should initialize filterState with default filter', () => {
@@ -36,9 +36,9 @@ describe('useFilterState', () => {
3636
act(() => hookValue.setFilter('needle in a haystack'));
3737

3838
expect(childrenMock).toBeCalledTimes(1);
39-
await new Promise(resolve => setTimeout(resolve, 70));
40-
41-
expect(childrenMock).toBeCalledTimes(2);
39+
await waitFor(() => {
40+
expect(childrenMock).toBeCalledTimes(2);
41+
});
4242

4343
expect(childrenMock.mock.calls[1][0].filter).toEqual({
4444
q: 'needle in a haystack',
@@ -60,10 +60,11 @@ describe('useFilterState', () => {
6060
render(<Test />);
6161

6262
act(() => ret.setFilter('needle in a haystack'));
63-
await new Promise(resolve => setTimeout(resolve, 70));
64-
expect(ret.filter).toEqual({
65-
type: 'thisOne',
66-
search: 'needle in a haystack',
63+
await waitFor(() => {
64+
expect(ret.filter).toEqual({
65+
type: 'thisOne',
66+
search: 'needle in a haystack',
67+
});
6768
});
6869
});
6970

@@ -80,10 +81,12 @@ describe('useFilterState', () => {
8081
const { rerender } = render(<Test permanentFilter={{ foo: 'bar' }} />);
8182
expect(ret.filter).toEqual({ foo: 'bar', q: '' });
8283
act(() => ret.setFilter('search'));
83-
await new Promise(resolve => setTimeout(resolve, 10));
84-
expect(ret.filter).toEqual({ foo: 'bar', q: 'search' });
84+
await waitFor(() => {
85+
expect(ret.filter).toEqual({ foo: 'bar', q: 'search' });
86+
});
8587
rerender(<Test permanentFilter={{ foo: 'baz' }} />);
86-
await new Promise(resolve => setTimeout(resolve, 10));
87-
expect(ret.filter).toEqual({ foo: 'baz', q: 'search' });
88+
await waitFor(() => {
89+
expect(ret.filter).toEqual({ foo: 'baz', q: 'search' });
90+
});
8891
});
8992
});

packages/ra-core/src/core/CoreAdminRouter.spec.tsx

+3-2
Original file line numberDiff line numberDiff line change
@@ -60,8 +60,9 @@ describe('<CoreAdminRouter>', () => {
6060
</CoreAdminRouter>
6161
</Router>
6262
);
63-
await new Promise(resolve => setTimeout(resolve, 10));
64-
expect(getByText('Layout')).not.toBeNull();
63+
await waitFor(() => {
64+
expect(getByText('Layout')).not.toBeNull();
65+
});
6566
history.push('/posts');
6667
expect(getByText('PostList')).not.toBeNull();
6768
history.push('/comments');

packages/ra-core/src/dataProvider/useGetList.spec.tsx

+46-36
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import expect from 'expect';
44
import { renderWithRedux } from 'ra-test';
55
import useGetList from './useGetList';
66
import { DataProviderContext } from '../dataProvider';
7+
import { waitFor } from '@testing-library/react';
78

89
const UseGetList = ({
910
resource = 'posts',
@@ -62,9 +63,10 @@ describe('useGetList', () => {
6263
<UseGetList />
6364
</DataProviderContext.Provider>
6465
);
65-
await new Promise(resolve => setTimeout(resolve, 10));
66-
expect(dispatch).toBeCalledTimes(5);
67-
expect(dataProvider.getList).toBeCalledTimes(1);
66+
await waitFor(() => {
67+
expect(dispatch).toBeCalledTimes(5);
68+
expect(dataProvider.getList).toBeCalledTimes(1);
69+
});
6870
});
6971

7072
it('should call the dataProvider on update when the resource changes', async () => {
@@ -164,14 +166,18 @@ describe('useGetList', () => {
164166
},
165167
}
166168
);
167-
await new Promise(resolve => setTimeout(resolve, 10));
168-
expect(hookValue.mock.calls.pop()[0]).toEqual({
169-
data: { 1: { id: 1, title: 'foo' }, 2: { id: 2, title: 'bar' } },
170-
ids: [1, 2],
171-
total: 2,
172-
loading: false,
173-
loaded: true,
174-
error: null,
169+
await waitFor(() => {
170+
expect(hookValue.mock.calls.pop()[0]).toEqual({
171+
data: {
172+
1: { id: 1, title: 'foo' },
173+
2: { id: 2, title: 'bar' },
174+
},
175+
ids: [1, 2],
176+
total: 2,
177+
loading: false,
178+
loaded: true,
179+
error: null,
180+
});
175181
});
176182
});
177183

@@ -211,8 +217,9 @@ describe('useGetList', () => {
211217
}
212218
);
213219
expect(hookValue.mock.calls.pop()[0].loading).toBe(true);
214-
await new Promise(resolve => setTimeout(resolve, 10));
215-
expect(hookValue.mock.calls.pop()[0].loading).toBe(false);
220+
await waitFor(() => {
221+
expect(hookValue.mock.calls.pop()[0].loading).toBe(false);
222+
});
216223
});
217224

218225
it('should set the loading state depending on the availability of the data in the redux store', () => {
@@ -245,10 +252,11 @@ describe('useGetList', () => {
245252
</DataProviderContext.Provider>
246253
);
247254
expect(hookValue.mock.calls.pop()[0].error).toBe(null);
248-
await new Promise(resolve => setTimeout(resolve, 10));
249-
expect(hookValue.mock.calls.pop()[0].error).toEqual(
250-
new Error('failed')
251-
);
255+
await waitFor(() => {
256+
expect(hookValue.mock.calls.pop()[0].error).toEqual(
257+
new Error('failed')
258+
);
259+
});
252260
});
253261

254262
it('should execute success side effects on success', async () => {
@@ -286,22 +294,23 @@ describe('useGetList', () => {
286294
/>
287295
</DataProviderContext.Provider>
288296
);
289-
await new Promise(resolve => setTimeout(resolve, 10));
290-
expect(onSuccess1).toBeCalledTimes(1);
291-
expect(onSuccess1.mock.calls.pop()[0]).toEqual({
292-
data: [
293-
{ id: 1, title: 'foo' },
294-
{ id: 2, title: 'bar' },
295-
],
296-
total: 2,
297-
});
298-
expect(onSuccess2).toBeCalledTimes(1);
299-
expect(onSuccess2.mock.calls.pop()[0]).toEqual({
300-
data: [
301-
{ id: 3, foo: 1 },
302-
{ id: 4, foo: 2 },
303-
],
304-
total: 2,
297+
await waitFor(() => {
298+
expect(onSuccess1).toBeCalledTimes(1);
299+
expect(onSuccess1.mock.calls.pop()[0]).toEqual({
300+
data: [
301+
{ id: 1, title: 'foo' },
302+
{ id: 2, title: 'bar' },
303+
],
304+
total: 2,
305+
});
306+
expect(onSuccess2).toBeCalledTimes(1);
307+
expect(onSuccess2.mock.calls.pop()[0]).toEqual({
308+
data: [
309+
{ id: 3, foo: 1 },
310+
{ id: 4, foo: 2 },
311+
],
312+
total: 2,
313+
});
305314
});
306315
});
307316

@@ -317,8 +326,9 @@ describe('useGetList', () => {
317326
<UseGetList options={{ onFailure }} />
318327
</DataProviderContext.Provider>
319328
);
320-
await new Promise(resolve => setTimeout(resolve, 10));
321-
expect(onFailure).toBeCalledTimes(1);
322-
expect(onFailure.mock.calls.pop()[0]).toEqual(new Error('failed'));
329+
await waitFor(() => {
330+
expect(onFailure).toBeCalledTimes(1);
331+
expect(onFailure.mock.calls.pop()[0]).toEqual(new Error('failed'));
332+
});
323333
});
324334
});

0 commit comments

Comments
 (0)