Skip to content

Commit dad6134

Browse files
committed
createController: story and test
1 parent 7a322df commit dad6134

2 files changed

Lines changed: 72 additions & 5 deletions

File tree

packages/ra-core/src/controller/create/useCreateController.security.stories.tsx

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
CreateControllerProps,
1414
useCreateController,
1515
} from './useCreateController';
16+
import { useAuthState } from '../../auth';
1617

1718
export default {
1819
title: 'ra-core/controller/useCreateController',
@@ -39,6 +40,16 @@ const defaultDataProvider = fakeDataProvider(
3940
process.env.NODE_ENV === 'development'
4041
);
4142

43+
const PostList = () => {
44+
useAuthState();
45+
return (
46+
<div style={styles.mainContainer}>
47+
<div>List view</div>
48+
<Link to="/posts/create">Create</Link>
49+
</div>
50+
);
51+
};
52+
4253
const CreatePost = (props: Partial<CreateControllerProps>) => {
4354
const params = useCreateController({
4455
resource: 'posts',
@@ -47,6 +58,7 @@ const CreatePost = (props: Partial<CreateControllerProps>) => {
4758
return (
4859
<div style={styles.mainContainer}>
4960
{params.isPending ? <p>Loading...</p> : <div>Create view</div>}
61+
<Link to="/posts">List</Link>
5062
</div>
5163
);
5264
};
@@ -93,16 +105,33 @@ export const DisableAuthentication = ({
93105
dataProvider={dataProvider}
94106
authProvider={authProvider}
95107
>
96-
<CoreAdminUI>
108+
<CoreAdminUI accessDenied={AccessDenied}>
97109
<Resource
98110
name="posts"
111+
list={<PostList />}
99112
create={<CreatePost disableAuthentication />}
100113
/>
101114
</CoreAdminUI>
102115
</CoreAdminContext>
103116
</TestMemoryRouter>
104117
);
105118
};
119+
DisableAuthentication.args = {
120+
authProvider: undefined,
121+
};
122+
DisableAuthentication.argTypes = {
123+
authProvider: {
124+
options: ['default', 'canAccess'],
125+
mapping: {
126+
default: undefined,
127+
canAccess: {
128+
...defaultAuthProvider,
129+
canAccess: () => Promise.resolve(false),
130+
},
131+
},
132+
control: { type: 'inline-radio' },
133+
},
134+
};
106135

107136
export const CanAccess = ({
108137
authProviderDelay = 300,

packages/ra-core/src/controller/create/useCreateController.spec.tsx

Lines changed: 42 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import React from 'react';
1010
import { Route, Routes } from 'react-router-dom';
1111

1212
import {
13+
AuthProvider,
1314
CreateContextProvider,
1415
DataProvider,
1516
Form,
@@ -28,7 +29,10 @@ import {
2829
import { CreateController } from './CreateController';
2930

3031
import { TestMemoryRouter } from '../../routing';
31-
import { CanAccess } from './useCreateController.security.stories';
32+
import {
33+
CanAccess,
34+
DisableAuthentication,
35+
} from './useCreateController.security.stories';
3236

3337
describe('useCreateController', () => {
3438
const defaultProps = {
@@ -70,8 +74,8 @@ describe('useCreateController', () => {
7074
let saveCallback;
7175
const dataProvider = testDataProvider({
7276
getOne: () => Promise.resolve({ data: { id: 12 } } as any),
73-
// @ts-ignore
7477
create: (_, { data }) =>
78+
// @ts-ignore
7579
Promise.resolve({ data: { id: 123, ...data } }),
7680
});
7781

@@ -224,8 +228,8 @@ describe('useCreateController', () => {
224228
let saveCallback;
225229
const dataProvider = testDataProvider({
226230
getOne: () => Promise.resolve({ data: { id: 12 } } as any),
227-
// @ts-ignore
228231
create: (_, { data }) =>
232+
// @ts-ignore
229233
Promise.resolve({ data: { id: 123, ...data } }),
230234
});
231235
const onSuccess = jest.fn();
@@ -262,8 +266,8 @@ describe('useCreateController', () => {
262266
let saveCallback;
263267
const dataProvider = testDataProvider({
264268
getOne: () => Promise.resolve({ data: { id: 12 } } as any),
265-
// @ts-ignore
266269
create: (_, { data }) =>
270+
// @ts-ignore
267271
Promise.resolve({ data: { id: 123, ...data } }),
268272
});
269273
const onSuccess = jest.fn();
@@ -692,5 +696,39 @@ describe('useCreateController', () => {
692696
await screen.findByText('Loading...');
693697
await screen.findByText('Create view');
694698
});
699+
700+
it('should not call checkAuth nor canAccess when disableAuthentication is true', async () => {
701+
const authProvider: AuthProvider = {
702+
checkAuth: jest.fn().mockResolvedValue(true),
703+
login: () => Promise.resolve(),
704+
logout: () => Promise.resolve(),
705+
checkError: () => Promise.resolve(),
706+
getPermissions: () => Promise.resolve(),
707+
canAccess: jest.fn().mockResolvedValue(false),
708+
};
709+
render(<DisableAuthentication authProvider={authProvider} />);
710+
await screen.findByText('Create view');
711+
expect(authProvider.checkAuth).not.toHaveBeenCalled();
712+
expect(authProvider.canAccess).not.toHaveBeenCalled();
713+
});
714+
715+
it('should not call checkAuth nor canAccess when disableAuthentication is true even if useAuthState was called before', async () => {
716+
const authProvider: AuthProvider = {
717+
checkAuth: jest.fn().mockResolvedValue(true),
718+
login: () => Promise.resolve(),
719+
logout: () => Promise.resolve(),
720+
checkError: () => Promise.resolve(),
721+
getPermissions: () => Promise.resolve(),
722+
canAccess: jest.fn().mockResolvedValue(false),
723+
};
724+
render(<DisableAuthentication authProvider={authProvider} />);
725+
await screen.findByText('Create view');
726+
fireEvent.click(await screen.findByText('List'));
727+
await screen.findByText('List view');
728+
fireEvent.click(await screen.findByText('Create'));
729+
await screen.findByText('Create view');
730+
expect(authProvider.checkAuth).toHaveBeenCalledTimes(1);
731+
expect(authProvider.canAccess).not.toHaveBeenCalled();
732+
});
695733
});
696734
});

0 commit comments

Comments
 (0)