From 7d82d1cf91a2899ff7900d2674db7f86f4331a83 Mon Sep 17 00:00:00 2001 From: Valentin Hervieu Date: Wed, 3 Feb 2021 16:19:55 +0100 Subject: [PATCH] Add first test --- .../getDataProviderCallArguments.ts | 1 + .../src/dataProvider/useDataProvider.spec.js | 65 +++++++++++++++++++ 2 files changed, 66 insertions(+) diff --git a/packages/ra-core/src/dataProvider/getDataProviderCallArguments.ts b/packages/ra-core/src/dataProvider/getDataProviderCallArguments.ts index 68f35a1b94e..ff7c01a92ae 100644 --- a/packages/ra-core/src/dataProvider/getDataProviderCallArguments.ts +++ b/packages/ra-core/src/dataProvider/getDataProviderCallArguments.ts @@ -9,6 +9,7 @@ const OptionsProperties = [ 'onSuccess', 'undoable', 'mutationMode', + 'enabled', ]; const isDataProviderOptions = (value: any) => { diff --git a/packages/ra-core/src/dataProvider/useDataProvider.spec.js b/packages/ra-core/src/dataProvider/useDataProvider.spec.js index 70ea58dfac4..a7d601384c7 100644 --- a/packages/ra-core/src/dataProvider/useDataProvider.spec.js +++ b/packages/ra-core/src/dataProvider/useDataProvider.spec.js @@ -319,6 +319,71 @@ describe('useDataProvider', () => { expect(onFailure.mock.calls[0][0]).toEqual(new Error('foo')); }); + it('should accept an enabled option to block the query until a condition is met', async () => { + const UseGetOneWithEnabled = () => { + const [data, setData] = useState(); + const [error, setError] = useState(); + const [isEnabled, setIsEnabled] = useState(false); + const dataProvider = useDataProvider(); + useEffect(() => { + dataProvider + .getOne('dummy', {}, { enabled: isEnabled }) + .then(res => { + if (res) { + // @fzaninotto I don't think this is correct + // because we return a empty resolved Promise, + // res is undefined here + setData(res.data); + } + }) + .catch(e => setError(e)); + }, [dataProvider, isEnabled]); + + let content =
loading
; + if (error) + content =
{error.message}
; + if (data) + content = ( +
{JSON.stringify(data)}
+ ); + return ( +
+ {content} + +
+ ); + }; + const getOne = jest + .fn() + .mockResolvedValue({ data: { id: 1, title: 'foo' } }); + const dataProvider = { getOne }; + const { queryByTestId, getByRole } = renderWithRedux( + + + + ); + expect(queryByTestId('loading')).not.toBeNull(); + await act(async () => { + await new Promise(resolve => setTimeout(resolve)); + }); + expect(getOne).not.toBeCalled(); + expect(queryByTestId('loading')).not.toBeNull(); + + // enable the query + fireEvent.click(getByRole('button', { name: 'toggle' })); + + await act(async () => { + await new Promise(resolve => setTimeout(resolve)); + }); + expect(getOne).toBeCalledTimes(1); + expect(queryByTestId('loading')).toBeNull(); + expect(queryByTestId('data').textContent).toBe( + '{"id":1,"title":"foo"}' + ); + }); + describe('mutationMode', () => { it('should wait for response to dispatch side effects in pessimistic mode', async () => { let resolveUpdate;