Skip to content

Commit 34fbeb5

Browse files
committed
story and test for useCreate
1 parent 43617bf commit 34fbeb5

File tree

2 files changed

+85
-1
lines changed

2 files changed

+85
-1
lines changed

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

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,12 @@ import {
2626
WithMiddlewaresSuccess as WithMiddlewaresSuccessUndoable,
2727
WithMiddlewaresError as WithMiddlewaresErrorUndoable,
2828
} from './useCreate.undoable.stories';
29-
import { Middleware, MutationMode, Params } from './useCreate.stories';
29+
import {
30+
Middleware,
31+
MutationMode,
32+
Params,
33+
InvalidateList,
34+
} from './useCreate.stories';
3035

3136
describe('useCreate', () => {
3237
it('returns a callback that can be used with create arguments', async () => {
@@ -627,4 +632,15 @@ describe('useCreate', () => {
627632
await screen.findByText('Bazinga');
628633
});
629634
});
635+
636+
it('invalidates getList query when dataProvider resolves in undoable mode', async () => {
637+
render(<InvalidateList mutationMode="undoable" />);
638+
fireEvent.change(await screen.findByLabelText('title'), {
639+
target: { value: 'New Post' },
640+
});
641+
fireEvent.click(screen.getByText('Save'));
642+
await screen.findByText('resources.posts.notifications.created');
643+
fireEvent.click(screen.getByText('Close'));
644+
await screen.findByText('3: New Post');
645+
});
630646
});

packages/ra-core/src/dataProvider/useCreate.stories.tsx

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as React from 'react';
22
import { QueryClient, useIsMutating } from '@tanstack/react-query';
3+
import fakeRestDataProvider from 'ra-data-fakerest';
34

45
import { CoreAdmin, CoreAdminContext, Resource } from '../core';
56
import { useCreate } from './useCreate';
@@ -383,3 +384,70 @@ const RefreshButton = () => {
383384
</button>
384385
);
385386
};
387+
388+
export const InvalidateList = ({
389+
mutationMode,
390+
}: {
391+
mutationMode: MutationModeType;
392+
}) => {
393+
const dataProvider = fakeRestDataProvider(
394+
{
395+
posts: [
396+
{ id: 1, title: 'Hello' },
397+
{ id: 2, title: 'World' },
398+
],
399+
},
400+
process.env.NODE_ENV !== 'test',
401+
process.env.NODE_ENV === 'test' ? 10 : 1000
402+
);
403+
404+
return (
405+
<TestMemoryRouter initialEntries={['/posts/create']}>
406+
<CoreAdmin dataProvider={dataProvider}>
407+
<Resource
408+
name="posts"
409+
create={
410+
<CreateBase mutationMode={mutationMode}>
411+
<Form>
412+
{mutationMode !== 'pessimistic' && (
413+
<TextInput source="id" defaultValue={3} />
414+
)}
415+
<TextInput source="title" />
416+
<button type="submit">Save</button>
417+
</Form>
418+
</CreateBase>
419+
}
420+
list={
421+
<ListBase loading={<p>Loading...</p>}>
422+
<RecordsIterator
423+
render={(record: any) => (
424+
<div
425+
style={{
426+
display: 'flex',
427+
gap: '8px',
428+
alignItems: 'center',
429+
}}
430+
>
431+
{record.id}: {record.title}
432+
</div>
433+
)}
434+
/>
435+
<Notification />
436+
</ListBase>
437+
}
438+
/>
439+
</CoreAdmin>
440+
</TestMemoryRouter>
441+
);
442+
};
443+
InvalidateList.args = {
444+
mutationMode: 'undoable',
445+
};
446+
InvalidateList.argTypes = {
447+
mutationMode: {
448+
control: {
449+
type: 'select',
450+
},
451+
options: ['pessimistic', 'optimistic', 'undoable'],
452+
},
453+
};

0 commit comments

Comments
 (0)