Fix #7646 UI: Non-admin user should not be allowed to add a bot (#7681)

* Fix #7646 UI: Non-admin user should not be allowed to add a bot

* Add tests
This commit is contained in:
Sachin Chaurasiya 2022-09-23 16:50:18 +05:30 committed by GitHub
parent d54279bc16
commit 8869da7a57
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 85 additions and 18 deletions

View File

@ -59,10 +59,15 @@ const BotListV1 = ({
const [handleErrorPlaceholder, setHandleErrorPlaceholder] = useState(false); const [handleErrorPlaceholder, setHandleErrorPlaceholder] = useState(false);
const [searchedData, setSearchedData] = useState<Bot[]>([]); const [searchedData, setSearchedData] = useState<Bot[]>([]);
const createPermission = checkPermission( /**
Operation.Create, * Bot creation is two step process so here we should check for
ResourceEntity.BOT, * Create User and Create Bot both permissions
permissions */
const createPermission = useMemo(
() =>
checkPermission(Operation.Create, ResourceEntity.BOT, permissions) &&
checkPermission(Operation.Create, ResourceEntity.USER, permissions),
[permissions]
); );
const deletePermission = useMemo( const deletePermission = useMemo(

View File

@ -105,6 +105,32 @@ const mockUserData = {
], ],
}; };
const mockUserRole = {
data: [
{
id: '3ed7b995-ce8b-4720-9beb-6f4a9c626920',
name: 'DataConsumer',
fullyQualifiedName: 'DataConsumer',
displayName: 'Data Consumer',
description:
'Users with Data Consumer role use different data assets for their day to day work.',
version: 0.1,
updatedAt: 1663825430544,
updatedBy: 'admin',
href: 'http://localhost:8585/api/v1/roles/3ed7b995-ce8b-4720-9beb-6f4a9c626920',
allowDelete: false,
deleted: false,
},
],
paging: {
total: 1,
},
};
jest.mock('../../axiosAPIs/rolesAPIV1.ts', () => ({
getRoles: jest.fn().mockImplementation(() => Promise.resolve(mockUserRole)),
}));
jest.mock('../common/ProfilePicture/ProfilePicture', () => { jest.mock('../common/ProfilePicture/ProfilePicture', () => {
return jest.fn().mockReturnValue(<p>ProfilePicture</p>); return jest.fn().mockReturnValue(<p>ProfilePicture</p>);
}); });

View File

@ -25,6 +25,7 @@ const jsonData = {
'check-status-airflow': 'Error while connecting to Airflow instance!', 'check-status-airflow': 'Error while connecting to Airflow instance!',
'create-user-error': 'Error while creating user!', 'create-user-error': 'Error while creating user!',
'create-bot-error': 'Error while creating bot!',
'create-conversation-error': 'Error while creating conversation!', 'create-conversation-error': 'Error while creating conversation!',
'create-message-error': 'Error while creating message!', 'create-message-error': 'Error while creating message!',
'create-role-error': 'Error While creating role!', 'create-role-error': 'Error While creating role!',

View File

@ -87,7 +87,8 @@ const CreateUserPage = () => {
name: res.name, name: res.name,
displayName: res.displayName, displayName: res.displayName,
description: res.description, description: res.description,
} as Bot).then((res) => { } as Bot)
.then((res) => {
setStatus('success'); setStatus('success');
res && showSuccessToast(`Bot created successfully`); res && showSuccessToast(`Bot created successfully`);
setTimeout(() => { setTimeout(() => {
@ -95,6 +96,12 @@ const CreateUserPage = () => {
goToUserListPage(); goToUserListPage();
}, 500); }, 500);
})
.catch((err: AxiosError) => {
handleSaveFailure(
err,
jsonData['api-error-messages']['create-bot-error']
);
}); });
} else { } else {
setStatus('success'); setStatus('success');

View File

@ -23,6 +23,32 @@ import { MemoryRouter } from 'react-router-dom';
import { createUser } from '../../axiosAPIs/userAPI'; import { createUser } from '../../axiosAPIs/userAPI';
import AddUserPageComponent from './CreateUserPage.component'; import AddUserPageComponent from './CreateUserPage.component';
const mockUserRole = {
data: [
{
id: '3ed7b995-ce8b-4720-9beb-6f4a9c626920',
name: 'DataConsumer',
fullyQualifiedName: 'DataConsumer',
displayName: 'Data Consumer',
description:
'Users with Data Consumer role use different data assets for their day to day work.',
version: 0.1,
updatedAt: 1663825430544,
updatedBy: 'admin',
href: 'http://localhost:8585/api/v1/roles/3ed7b995-ce8b-4720-9beb-6f4a9c626920',
allowDelete: false,
deleted: false,
},
],
paging: {
total: 1,
},
};
jest.mock('../../axiosAPIs/rolesAPIV1', () => ({
getRoles: jest.fn().mockImplementation(() => Promise.resolve(mockUserRole)),
}));
jest.mock('../../components/containers/PageContainerV1', () => { jest.mock('../../components/containers/PageContainerV1', () => {
return jest return jest
.fn() .fn()
@ -53,7 +79,6 @@ jest.mock('../../axiosAPIs/userAPI', () => ({
jest.mock('../../AppState', () => jest.mock('../../AppState', () =>
jest.fn().mockReturnValue({ jest.fn().mockReturnValue({
userRoles: [],
userTeams: [], userTeams: [],
}) })
); );

View File

@ -238,6 +238,13 @@ const AuthenticatedAppRouter: FunctionComponent = () => {
[permissions] [permissions]
); );
const createBotPermission = useMemo(
() =>
checkPermission(Operation.Create, ResourceEntity.USER, permissions) &&
checkPermission(Operation.Create, ResourceEntity.BOT, permissions),
[permissions]
);
return ( return (
<Switch> <Switch>
<Route exact component={MyDataPage} path={ROUTES.MY_DATA} /> <Route exact component={MyDataPage} path={ROUTES.MY_DATA} />
@ -412,11 +419,7 @@ const AuthenticatedAppRouter: FunctionComponent = () => {
<AdminProtectedRoute <AdminProtectedRoute
exact exact
component={CreateUserPage} component={CreateUserPage}
hasPermission={checkPermission( hasPermission={createBotPermission}
Operation.Create,
ResourceEntity.BOT,
permissions
)}
path={ROUTES.CREATE_USER_WITH_BOT} path={ROUTES.CREATE_USER_WITH_BOT}
/> />
<Route exact component={BotDetailsPage} path={ROUTES.BOTS_PROFILE} /> <Route exact component={BotDetailsPage} path={ROUTES.BOTS_PROFILE} />