Skip to content

Commit 7d82d1c

Browse files
author
Valentin Hervieu
committed
Add first test
1 parent 007ab09 commit 7d82d1c

File tree

2 files changed

+66
-0
lines changed

2 files changed

+66
-0
lines changed

packages/ra-core/src/dataProvider/getDataProviderCallArguments.ts

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ const OptionsProperties = [
99
'onSuccess',
1010
'undoable',
1111
'mutationMode',
12+
'enabled',
1213
];
1314

1415
const isDataProviderOptions = (value: any) => {

packages/ra-core/src/dataProvider/useDataProvider.spec.js

+65
Original file line numberDiff line numberDiff line change
@@ -319,6 +319,71 @@ describe('useDataProvider', () => {
319319
expect(onFailure.mock.calls[0][0]).toEqual(new Error('foo'));
320320
});
321321

322+
it('should accept an enabled option to block the query until a condition is met', async () => {
323+
const UseGetOneWithEnabled = () => {
324+
const [data, setData] = useState();
325+
const [error, setError] = useState();
326+
const [isEnabled, setIsEnabled] = useState(false);
327+
const dataProvider = useDataProvider();
328+
useEffect(() => {
329+
dataProvider
330+
.getOne('dummy', {}, { enabled: isEnabled })
331+
.then(res => {
332+
if (res) {
333+
// @fzaninotto I don't think this is correct
334+
// because we return a empty resolved Promise,
335+
// res is undefined here
336+
setData(res.data);
337+
}
338+
})
339+
.catch(e => setError(e));
340+
}, [dataProvider, isEnabled]);
341+
342+
let content = <div data-testid="loading">loading</div>;
343+
if (error)
344+
content = <div data-testid="error">{error.message}</div>;
345+
if (data)
346+
content = (
347+
<div data-testid="data">{JSON.stringify(data)}</div>
348+
);
349+
return (
350+
<div>
351+
{content}
352+
<button onClick={() => setIsEnabled(e => !e)}>
353+
toggle
354+
</button>
355+
</div>
356+
);
357+
};
358+
const getOne = jest
359+
.fn()
360+
.mockResolvedValue({ data: { id: 1, title: 'foo' } });
361+
const dataProvider = { getOne };
362+
const { queryByTestId, getByRole } = renderWithRedux(
363+
<DataProviderContext.Provider value={dataProvider}>
364+
<UseGetOneWithEnabled />
365+
</DataProviderContext.Provider>
366+
);
367+
expect(queryByTestId('loading')).not.toBeNull();
368+
await act(async () => {
369+
await new Promise(resolve => setTimeout(resolve));
370+
});
371+
expect(getOne).not.toBeCalled();
372+
expect(queryByTestId('loading')).not.toBeNull();
373+
374+
// enable the query
375+
fireEvent.click(getByRole('button', { name: 'toggle' }));
376+
377+
await act(async () => {
378+
await new Promise(resolve => setTimeout(resolve));
379+
});
380+
expect(getOne).toBeCalledTimes(1);
381+
expect(queryByTestId('loading')).toBeNull();
382+
expect(queryByTestId('data').textContent).toBe(
383+
'{"id":1,"title":"foo"}'
384+
);
385+
});
386+
322387
describe('mutationMode', () => {
323388
it('should wait for response to dispatch side effects in pessimistic mode', async () => {
324389
let resolveUpdate;

0 commit comments

Comments
 (0)