Merge pull request #8659 from mabashian/7989-group-action-buttons

Hide edit/delete buttons on group details view for users that don't have permissions

Reviewed-by: https://github.com/apps/softwarefactory-project-zuul
This commit is contained in:
softwarefactory-project-zuul[bot]
2020-11-30 13:37:35 +00:00
committed by GitHub
2 changed files with 135 additions and 78 deletions

View File

@@ -17,7 +17,7 @@ import InventoryGroupsDeleteModal from '../shared/InventoryGroupsDeleteModal';
function InventoryGroupDetail({ i18n, inventoryGroup }) { function InventoryGroupDetail({ i18n, inventoryGroup }) {
const { const {
summary_fields: { created_by, modified_by }, summary_fields: { created_by, modified_by, user_capabilities },
created, created,
modified, modified,
name, name,
@@ -54,6 +54,7 @@ function InventoryGroupDetail({ i18n, inventoryGroup }) {
/> />
</DetailList> </DetailList>
<CardActionsRow> <CardActionsRow>
{user_capabilities?.edit && (
<Button <Button
variant="primary" variant="primary"
aria-label={i18n._(t`Edit`)} aria-label={i18n._(t`Edit`)}
@@ -65,6 +66,8 @@ function InventoryGroupDetail({ i18n, inventoryGroup }) {
> >
{i18n._(t`Edit`)} {i18n._(t`Edit`)}
</Button> </Button>
)}
{user_capabilities?.delete && (
<InventoryGroupsDeleteModal <InventoryGroupsDeleteModal
groups={[inventoryGroup]} groups={[inventoryGroup]}
isDisabled={false} isDisabled={false}
@@ -72,6 +75,7 @@ function InventoryGroupDetail({ i18n, inventoryGroup }) {
history.push(`/inventories/inventory/${params.id}/groups`) history.push(`/inventories/inventory/${params.id}/groups`)
} }
/> />
)}
</CardActionsRow> </CardActionsRow>
{error && ( {error && (
<AlertModal <AlertModal

View File

@@ -27,12 +27,18 @@ const inventoryGroup = {
username: 'Bond', username: 'Bond',
id: 14, id: 14,
}, },
user_capabilities: {
delete: true,
edit: true,
},
}, },
}; };
describe('<InventoryGroupDetail />', () => { describe('<InventoryGroupDetail />', () => {
let wrapper; let wrapper;
let history; let history;
describe('User has full permissions', () => {
beforeEach(async () => { beforeEach(async () => {
await act(async () => { await act(async () => {
history = createMemoryHistory({ history = createMemoryHistory({
@@ -91,7 +97,7 @@ describe('<InventoryGroupDetail />', () => {
); );
}); });
test('details should render with the proper values', () => { test('details should render with the proper values and action buttons shown', () => {
expect(wrapper.find('Detail[label="Name"]').prop('value')).toBe('Foo'); expect(wrapper.find('Detail[label="Name"]').prop('value')).toBe('Foo');
expect(wrapper.find('Detail[label="Description"]').prop('value')).toBe( expect(wrapper.find('Detail[label="Description"]').prop('value')).toBe(
'Bar' 'Bar'
@@ -99,5 +105,52 @@ describe('<InventoryGroupDetail />', () => {
expect(wrapper.find('Detail[label="Created"]').length).toBe(1); expect(wrapper.find('Detail[label="Created"]').length).toBe(1);
expect(wrapper.find('Detail[label="Last Modified"]').length).toBe(1); expect(wrapper.find('Detail[label="Last Modified"]').length).toBe(1);
expect(wrapper.find('VariablesDetail').prop('value')).toBe('bizz: buzz'); expect(wrapper.find('VariablesDetail').prop('value')).toBe('bizz: buzz');
expect(wrapper.find('button[aria-label="Edit"]').length).toBe(1);
expect(wrapper.find('button[aria-label="Delete"]').length).toBe(1);
});
});
describe('User has read-only permissions', () => {
test('should hide edit/delete buttons', async () => {
const readOnlyGroup = {
...inventoryGroup,
summary_fields: {
...inventoryGroup.summary_fields,
user_capabilities: {
delete: false,
edit: false,
},
},
};
await act(async () => {
history = createMemoryHistory({
initialEntries: ['/inventories/inventory/1/groups/1/details'],
});
wrapper = mountWithContexts(
<Route path="/inventories/inventory/:id/groups/:groupId">
<InventoryGroupDetail inventoryGroup={readOnlyGroup} />
</Route>,
{
context: {
router: {
history,
route: {
location: history.location,
match: { params: { id: 1 } },
},
},
},
}
);
await waitForElement(wrapper, 'ContentLoading', el => el.length === 0);
});
expect(wrapper.find('button[aria-label="Edit"]').length).toBe(0);
expect(wrapper.find('button[aria-label="Delete"]').length).toBe(0);
wrapper.unmount();
});
}); });
}); });