Commit 895f41af authored by Kushal Pandya's avatar Kushal Pandya

Fix new requirement button visibility

- User current user access role to control "New
requirement" button visibility.
- Use `adminRequirement` permission to control
"Reopen" button visibility
parent 3660169a
......@@ -170,7 +170,7 @@ export default {
<gl-loading-icon v-else />
</gl-deprecated-button>
</li>
<li v-if="isArchived" class="requirement-reopen d-sm-block">
<li v-if="canArchive && isArchived" class="requirement-reopen d-sm-block">
<gl-deprecated-button
size="xs"
class="p-2"
......
......@@ -37,7 +37,7 @@
%span.badge.badge-pill.js-all-count= total_requirements
.nav-controls
- if is_open_tab
- if is_open_tab && can?(current_user, :create_requirement, @project)
%button.btn.btn-success.js-new-requirement.qa-new-requirement-button{ type: 'button' }
= _('New requirement')
......
......@@ -4,6 +4,7 @@ require 'spec_helper'
describe 'Requirements list', :js do
let_it_be(:user) { create(:user) }
let_it_be(:user_guest) { create(:user) }
let_it_be(:project) { create(:project, :repository) }
let_it_be(:requirement1) { create(:requirement, project: project, title: 'Some requirement-1', author: user, created_at: 5.days.ago, updated_at: 2.days.ago) }
let_it_be(:requirement2) { create(:requirement, project: project, title: 'Some requirement-2', author: user, created_at: 6.days.ago, updated_at: 2.days.ago) }
......@@ -27,6 +28,7 @@ describe 'Requirements list', :js do
stub_licensed_features(requirements: true)
stub_feature_flags(requirements_management: { enabled: true, thing: project })
project.add_maintainer(user)
project.add_guest(user_guest)
sign_in(user)
end
......@@ -242,4 +244,19 @@ describe 'Requirements list', :js do
end
end
end
context 'when accessing project as guest user' do
before do
sign_in(user_guest)
visit project_requirements_path(project)
wait_for_requests
end
it 'open tab does not show button "New requirement"' do
page.within('.nav-controls') do
expect(page).not_to have_selector('button.js-new-requirement')
end
end
end
end
......@@ -235,7 +235,7 @@ describe('RequirementItem', () => {
});
});
it('renders `Reopen` button when current requirement is archived', () => {
it('renders `Reopen` button when current requirement is archived and `requirement.userPermissions.adminRequirement` is true', () => {
const reopenButton = wrapperArchived.find('.requirement-reopen').find(GlDeprecatedButton);
expect(reopenButton.exists()).toBe(true);
......@@ -243,6 +243,22 @@ describe('RequirementItem', () => {
expect(reopenButton.text()).toBe('Reopen');
});
it('does not render `Reopen` button when current requirement is archived and `requirement.userPermissions.adminRequirement` is false', () => {
wrapperArchived.setProps({
requirement: {
...requirementArchived,
userPermissions: {
...mockUserPermissions,
adminRequirement: false,
},
},
});
return wrapperArchived.vm.$nextTick(() => {
expect(wrapperArchived.contains('.controls .requirement-reopen')).toBe(false);
});
});
it('renders element containing requirement updated at', () => {
const updatedAtEl = wrapper.find('.issuable-meta .issuable-updated-at > span');
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment