+ .project-code-holder.d-none.d-sm-inline-block>
= render "projects/buttons/code", dropdown_class: 'dropdown-menu-right', ref: @ref
- .project-code-holder.d-block.d-md-none.mt-sm-2.mt-md-0.ml-md-2>
+ .project-code-holder.d-block.d-sm-none.mt-sm-2.mt-md-0.ml-md-2>
= render 'projects/buttons/download', project: @project, ref: @ref
= render "shared/mobile_clone_panel", ref: @ref
diff --git a/app/views/shared/_groups_projects_more_actions_dropdown.html.haml b/app/views/shared/_groups_projects_more_actions_dropdown.html.haml
new file mode 100644
index 0000000000000000000000000000000000000000..5189dc54f0c07e6db1225e06e4077d1a88672c58
--- /dev/null
+++ b/app/views/shared/_groups_projects_more_actions_dropdown.html.haml
@@ -0,0 +1,16 @@
+- dropdown_data = groups_projects_more_actions_dropdown_data(source)
+
+- if dropdown_data[:is_group] && can?(current_user, :read_group, @group)
+ - id = @group.id
+
+ %span.gl-sr-only{ itemprop: 'identifier', data: { testid: 'group-id-content' } }
+ = s_('GroupPage|Group ID: %{id}') % { id: id }
+
+- elsif can?(current_user, :read_project, @project)
+ - id = @project.id
+
+ %span.gl-sr-only{ itemprop: 'identifier', data: { testid: 'project-id-content' } }
+ = s_('ProjectPage|Project ID: %{id}') % { id: id }
+
+- if id || current_user
+ .js-groups-projects-more-actions-dropdown{ data: dropdown_data }
diff --git a/app/views/shared/members/_access_request_links.html.haml b/app/views/shared/members/_access_request_links.html.haml
deleted file mode 100644
index 0d692ee753a3535e72bbe18def1ff14403861052..0000000000000000000000000000000000000000
--- a/app/views/shared/members/_access_request_links.html.haml
+++ /dev/null
@@ -1,18 +0,0 @@
-- model_name = source.model_name.to_s.downcase
-
-- if can?(current_user, :"destroy_#{model_name}_member", source.members.find_by(user_id: current_user.id)) # rubocop: disable CodeReuse/ActiveRecord
- - link_text = source.is_a?(Group) ? _('Leave group') : _('Leave project')
- = link_to link_text, polymorphic_path([:leave, source, :members]),
- method: :delete,
- aria: { label: link_text },
- data: { confirm: leave_confirmation_message(source), confirm_btn_variant: 'danger', qa_selector: 'leave_group_link' },
- class: 'js-leave-link'
-- elsif requester = source.requesters.find_by(user_id: current_user.id) # rubocop: disable CodeReuse/ActiveRecord
- - if can?(current_user, :withdraw_member_access_request, requester)
- = link_to _('Withdraw Access Request'), polymorphic_path([:leave, source, :members]),
- method: :delete,
- data: { confirm: remove_member_message(requester) }
-- elsif source.request_access_enabled && can?(current_user, :request_access, source)
- = link_to _('Request Access'), polymorphic_path([:request_access, source, :members]),
- method: :post,
- data: { testid: 'request-access-link' }
diff --git a/ee/spec/features/groups/members/leave_group_spec.rb b/ee/spec/features/groups/members/leave_group_spec.rb
index 8cfcfe05c6628ca35b0f96215443e7be295cc082..a50721a5c4d2b0197e791b5055f95e08164db49b 100644
--- a/ee/spec/features/groups/members/leave_group_spec.rb
+++ b/ee/spec/features/groups/members/leave_group_spec.rb
@@ -10,6 +10,9 @@
let_it_be(:group) { create(:group) }
let(:user) { create(:user) }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
user.update!(provisioned_by_group: group)
@@ -17,15 +20,17 @@
end
context 'with block_password_auth_for_saml_users feature flag switched on' do
- it 'guest provisoned by this group leaves the group and is signed off' do
+ it 'guest provisoned by this group leaves the group and is signed off', :js do
group.add_guest(user)
group.add_owner(other_user)
visit group_path(group)
+ more_actions_dropdown.click
click_link 'Leave group'
+ accept_gl_confirm(button_text: 'Leave group')
- expect(group.users).not_to include(user)
expect(page).to have_current_path(new_user_session_path, ignore_query: true)
+ expect(group.users).not_to include(user)
end
it 'guest leaves the group by url param and is signed off', :js do
@@ -33,10 +38,9 @@
group.add_owner(other_user)
visit group_path(group, leave: 1)
-
accept_gl_confirm(button_text: 'Leave group')
-
wait_for_all_requests
+
expect(page).to have_current_path(new_user_session_path, ignore_query: true)
expect(group.users).not_to include(user)
end
@@ -52,19 +56,20 @@
group.add_owner(other_user)
visit group_path(group, leave: 1)
-
accept_gl_confirm(button_text: 'Leave group')
-
wait_for_all_requests
+
expect(page).to have_current_path(dashboard_groups_path, ignore_query: true)
expect(group.users).not_to include(user)
end
- it 'guest leaves the group as last member' do
+ it 'guest leaves the group as last member', :js do
group.add_guest(user)
visit group_path(group)
+ more_actions_dropdown.click
click_link 'Leave group'
+ accept_gl_confirm(button_text: 'Leave group')
expect(page).to have_current_path(dashboard_groups_path, ignore_query: true)
expect(group.users).not_to include(user)
diff --git a/ee/spec/features/namespace_user_cap_reached_alert_spec.rb b/ee/spec/features/namespace_user_cap_reached_alert_spec.rb
index 55bae4e3a0a8ff16377c64fa5d944cf1a8d94f25..fe07ffce4f5495c92eea9b994a786b6ee482cf63 100644
--- a/ee/spec/features/namespace_user_cap_reached_alert_spec.rb
+++ b/ee/spec/features/namespace_user_cap_reached_alert_spec.rb
@@ -195,7 +195,6 @@ def dismiss_button
def expect_group_page_for(group)
expect(page).to have_text group.name
- expect(page).to have_text "Group ID: #{group.id}"
end
def expect_project_page_for(project)
diff --git a/ee/spec/features/projects/members/member_leaves_project_spec.rb b/ee/spec/features/projects/members/member_leaves_project_spec.rb
index c3693612bff6db2acc08084c877b7bd6232c6224..72876117cfaf843a27953222a8bf5e49ac7b220a 100644
--- a/ee/spec/features/projects/members/member_leaves_project_spec.rb
+++ b/ee/spec/features/projects/members/member_leaves_project_spec.rb
@@ -3,8 +3,13 @@
require 'spec_helper'
RSpec.describe 'Projects > Members > Member leaves project', feature_category: :groups_and_projects do
+ include Spec::Support::Helpers::ModalHelpers
+
let(:user) { create(:user) }
let(:project) { create(:project, :repository) }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
project.add_developer(user)
@@ -19,8 +24,10 @@
let!(:non_matching_protected_branch) { create(:protected_branch, authorize_user_to_push: other_user, authorize_user_to_merge: other_user, project: project) }
context 'user leaves project' do
- it "removes the user's branch permissions" do
+ it "removes the user's branch permissions", :js do
+ more_actions_dropdown.click
click_link 'Leave project'
+ accept_gl_confirm(button_text: 'Leave project')
expect(page).to have_current_path(dashboard_projects_path, ignore_query: true)
expect(matching_protected_branch.push_access_levels.where(user: user)).not_to exist
diff --git a/locale/gitlab.pot b/locale/gitlab.pot
index 66468232633e2d3a10dc27e2d861b35d219509b6..198e7906a5176b13aa2c134c386f344ded46f9d1 100644
--- a/locale/gitlab.pot
+++ b/locale/gitlab.pot
@@ -23026,10 +23026,13 @@ msgstr ""
msgid "GroupImport|Unable to process group import file"
msgstr ""
-msgid "GroupPage|Copy group ID"
+msgid "GroupPage|Copy group ID: %{id}"
msgstr ""
-msgid "GroupPage|Group ID: %{group_id}"
+msgid "GroupPage|Group ID copied to clipboard."
+msgstr ""
+
+msgid "GroupPage|Group ID: %{id}"
msgstr ""
msgid "GroupRoadmap|%{dateWord} – No end date"
@@ -37470,10 +37473,13 @@ msgstr ""
msgid "ProjectOverview|You must sign in to star a project"
msgstr ""
-msgid "ProjectPage|Copy project ID"
+msgid "ProjectPage|Copy project ID: %{id}"
+msgstr ""
+
+msgid "ProjectPage|Project ID copied to clipboard."
msgstr ""
-msgid "ProjectPage|Project ID: %{project_id}"
+msgid "ProjectPage|Project ID: %{id}"
msgstr ""
msgid "ProjectPage|Project information"
diff --git a/qa/qa/page/group/show.rb b/qa/qa/page/group/show.rb
index 4dd0f3a57044b2fd8e365262bc749e3944476b79..100b9f7fa6dee35de3c253aa495322c3597b9cd9 100644
--- a/qa/qa/page/group/show.rb
+++ b/qa/qa/page/group/show.rb
@@ -10,12 +10,6 @@ class Show < Page::Base
view 'app/views/groups/_home_panel.html.haml' do
element 'new-project-button'
element :new_subgroup_button
- element :group_id_content
- end
-
- view 'app/views/shared/members/_access_request_links.html.haml' do
- element :leave_group_link
- element 'request-access-link'
end
def click_subgroup(name)
@@ -40,15 +34,21 @@ def go_to_new_project
end
def group_id
- find_element(:group_id_content).text.delete('Group ID: ').sub(/\n.*/, '')
+ find_element('group-id-content').text.delete('Group ID: ').sub(/\n.*/, '')
end
def leave_group
- click_element :leave_group_link
+ click_element 'groups-projects-more-actions-dropdown'
+ wait_for_requests
+
+ click_element 'leave-group-link'
click_confirmation_ok_button
end
def click_request_access
+ click_element 'groups-projects-more-actions-dropdown'
+ wait_for_requests
+
click_element 'request-access-link'
end
end
diff --git a/qa/qa/page/project/show.rb b/qa/qa/page/project/show.rb
index dce20c9cba153f2b0e5603dd707479f939a050c5..6106e582b2f1c206dedef5422b01abff1ac343e2 100644
--- a/qa/qa/page/project/show.rb
+++ b/qa/qa/page/project/show.rb
@@ -32,7 +32,6 @@ class Show < Page::Base
view 'app/views/projects/_home_panel.html.haml' do
element 'project-name-content'
- element 'project-id-content'
end
view 'app/views/projects/_sidebar.html.haml' do
diff --git a/spec/features/groups/members/leave_group_spec.rb b/spec/features/groups/members/leave_group_spec.rb
index 27ceec05fe3ab2af0018521fc67e29ae6a84e79b..632155cd7e45d0ac4aa9cc3eae86cacab3fc1f22 100644
--- a/spec/features/groups/members/leave_group_spec.rb
+++ b/spec/features/groups/members/leave_group_spec.rb
@@ -9,17 +9,22 @@
let(:user) { create(:user) }
let(:other_user) { create(:user) }
let(:group) { create(:group) }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
sign_in(user)
end
- it 'guest leaves the group' do
+ it 'guest leaves the group', :js do
group.add_guest(user)
group.add_owner(other_user)
visit group_path(group)
+ more_actions_dropdown.click
click_link 'Leave group'
+ accept_gl_confirm(button_text: 'Leave group')
expect(page).to have_current_path(dashboard_groups_path, ignore_query: true)
expect(page).to have_content left_group_message(group)
@@ -31,31 +36,33 @@
group.add_owner(other_user)
visit group_path(group, leave: 1)
-
accept_gl_confirm(button_text: 'Leave group')
- wait_for_all_requests
expect(page).to have_current_path(dashboard_groups_path, ignore_query: true)
expect(group.users).not_to include(user)
end
- it 'guest leaves the group as last member' do
+ it 'guest leaves the group as last member', :js do
group.add_guest(user)
visit group_path(group)
+ more_actions_dropdown.click
click_link 'Leave group'
+ accept_gl_confirm(button_text: 'Leave group')
expect(page).to have_current_path(dashboard_groups_path, ignore_query: true)
expect(page).to have_content left_group_message(group)
expect(group.users).not_to include(user)
end
- it 'owner leaves the group if they are not the last owner' do
+ it 'owner leaves the group if they are not the last owner', :js do
group.add_owner(user)
group.add_owner(other_user)
visit group_path(group)
+ more_actions_dropdown.click
click_link 'Leave group'
+ accept_gl_confirm(button_text: 'Leave group')
expect(page).to have_current_path(dashboard_groups_path, ignore_query: true)
expect(page).to have_content left_group_message(group)
@@ -66,6 +73,7 @@
group.add_owner(user)
visit group_path(group)
+ more_actions_dropdown.click
expect(page).not_to have_content 'Leave group'
diff --git a/spec/features/groups/members/request_access_spec.rb b/spec/features/groups/members/request_access_spec.rb
index 2d0b2e483c5986b6d5aa5abcfb8628131a790011..e6da2ce7cec3ae621155ca88badfeb72627bd3a7 100644
--- a/spec/features/groups/members/request_access_spec.rb
+++ b/spec/features/groups/members/request_access_spec.rb
@@ -3,10 +3,15 @@
require 'spec_helper'
RSpec.describe 'Groups > Members > Request access', feature_category: :groups_and_projects do
+ include Spec::Support::Helpers::ModalHelpers
+
let(:user) { create(:user) }
let(:owner) { create(:user) }
let(:group) { create(:group, :public) }
let!(:project) { create(:project, :private, namespace: group) }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
group.add_owner(owner)
@@ -14,15 +19,19 @@
visit group_path(group)
end
- it 'request access feature is disabled' do
+ it 'request access feature is disabled', :js do
group.update!(request_access_enabled: false)
visit group_path(group)
+ more_actions_dropdown.click
expect(page).not_to have_content 'Request Access'
end
- it 'user can request access to a group' do
- perform_enqueued_jobs { click_link 'Request Access' }
+ it 'user can request access to a group', :js do
+ perform_enqueued_jobs do
+ more_actions_dropdown.click
+ click_link 'Request Access'
+ end
expect(ActionMailer::Base.deliveries.last.to).to eq [owner.notification_email_or_default]
expect(ActionMailer::Base.deliveries.last.subject).to match "Request to join the #{group.name} group"
@@ -30,18 +39,26 @@
expect(group.requesters.exists?(user_id: user)).to be_truthy
expect(page).to have_content 'Your request for access has been queued for review.'
+ more_actions_dropdown.click
+
expect(page).to have_content 'Withdraw Access Request'
expect(page).not_to have_content 'Leave group'
end
- it 'user does not see private projects' do
- perform_enqueued_jobs { click_link 'Request Access' }
+ it 'user does not see private projects', :js do
+ perform_enqueued_jobs do
+ more_actions_dropdown.click
+ click_link 'Request Access'
+ end
expect(page).not_to have_content project.name
end
- it 'user does not see group in the Dashboard > Groups page' do
- perform_enqueued_jobs { click_link 'Request Access' }
+ it 'user does not see group in the Dashboard > Groups page', :js do
+ perform_enqueued_jobs do
+ more_actions_dropdown.click
+ click_link 'Request Access'
+ end
visit dashboard_groups_path
@@ -49,6 +66,7 @@
end
it 'user is not listed in the group members page', :js do
+ more_actions_dropdown.click
click_link 'Request Access'
expect(group.requesters.exists?(user_id: user)).to be_truthy
@@ -63,20 +81,24 @@
end
end
- it 'user can withdraw its request for access' do
+ it 'user can withdraw its request for access', :js do
+ more_actions_dropdown.click
click_link 'Request Access'
expect(group.requesters.exists?(user_id: user)).to be_truthy
+ more_actions_dropdown.click
click_link 'Withdraw Access Request'
+ accept_gl_confirm
- expect(group.requesters.exists?(user_id: user)).to be_falsey
expect(page).to have_content 'Your access request to the group has been withdrawn.'
+ expect(group.requesters.exists?(user_id: user)).to be_falsey
end
- it 'member does not see the request access button' do
+ it 'member does not see the request access button', :js do
group.add_owner(user)
visit group_path(group)
+ more_actions_dropdown.click
expect(page).not_to have_content 'Request Access'
end
diff --git a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
index 47cd0d612b529dacd56f27a5b71e85c51c97f760..08de3d95060f234f2e1944f413210f9faaae28ca 100644
--- a/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
+++ b/spec/features/projects/members/group_requester_cannot_request_access_to_project_spec.rb
@@ -8,16 +8,23 @@
let(:owner) { create(:user) }
let(:group) { create(:group, :public) }
let(:project) { create(:project, :public, namespace: group) }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
group.add_owner(owner)
sign_in(user)
visit group_path(group)
- perform_enqueued_jobs { click_link 'Request Access' }
+ perform_enqueued_jobs do
+ more_actions_dropdown.click
+ click_link 'Request Access'
+ end
visit project_path(project)
end
it 'group requester does not see the request access / withdraw access request button' do
+ expect(page).not_to have_css '[data-testid="groups-projects-more-actions-dropdown"]'
expect(page).not_to have_content 'Request Access'
expect(page).not_to have_content 'Withdraw Access Request'
end
diff --git a/spec/features/projects/members/member_leaves_project_spec.rb b/spec/features/projects/members/member_leaves_project_spec.rb
index e0c64547e9f6e1210be43364aa62bd1d82304cb5..43c6ba4890606afcb3e8dbd210bf7cc85842a041 100644
--- a/spec/features/projects/members/member_leaves_project_spec.rb
+++ b/spec/features/projects/members/member_leaves_project_spec.rb
@@ -8,16 +8,21 @@
let(:user) { create(:user) }
let(:project) { create(:project, :repository, :with_namespace_settings) }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
project.add_developer(user)
sign_in(user)
end
- it 'user leaves project' do
+ it 'user leaves project', :js do
visit project_path(project)
+ more_actions_dropdown.click
click_link 'Leave project'
+ accept_gl_confirm(button_text: 'Leave project')
expect(page).to have_current_path(dashboard_projects_path, ignore_query: true)
expect(project.users.exists?(user.id)).to be_falsey
diff --git a/spec/features/projects/members/user_requests_access_spec.rb b/spec/features/projects/members/user_requests_access_spec.rb
index e7f99a4048ca7ba701bb97f0920a26dd78913eed..14df7e7bafe4a6ee10c7e3a9af0a1e0140af9ae6 100644
--- a/spec/features/projects/members/user_requests_access_spec.rb
+++ b/spec/features/projects/members/user_requests_access_spec.rb
@@ -10,6 +10,9 @@
let_it_be(:project) { create(:project, :public, :repository) }
let(:owner) { project.first_owner }
+ let(:more_actions_dropdown) do
+ find('[data-testid="groups-projects-more-actions-dropdown"] .gl-new-dropdown-custom-toggle')
+ end
before do
sign_in(user)
@@ -17,39 +20,46 @@
visit project_path(project)
end
- it 'request access feature is disabled' do
+ it 'request access feature is disabled', :js do
project.update!(request_access_enabled: false)
visit project_path(project)
+ more_actions_dropdown.click
expect(page).not_to have_content 'Request Access'
end
- it 'user can request access to a project' do
- perform_enqueued_jobs { click_link 'Request Access' }
+ it 'user can request access to a project', :js do
+ perform_enqueued_jobs do
+ more_actions_dropdown.click
+ click_link 'Request Access'
+ end
expect(ActionMailer::Base.deliveries.map(&:to)).to match_array([[owner.notification_email_or_default], [maintainer.notification_email_or_default]])
expect(ActionMailer::Base.deliveries.last.subject).to eq "Request to join the #{project.full_name} project"
expect(project.requesters.exists?(user_id: user)).to be_truthy
+ more_actions_dropdown.click
expect(page).to have_content 'Withdraw Access Request'
expect(page).not_to have_content 'Leave Project'
end
context 'code access is restricted' do
- it 'user can request access' do
+ it 'user can request access', :js do
project.project_feature.update!(
repository_access_level: ProjectFeature::PRIVATE,
builds_access_level: ProjectFeature::PRIVATE,
merge_requests_access_level: ProjectFeature::PRIVATE
)
visit project_path(project)
+ more_actions_dropdown.click
expect(page).to have_content 'Request Access'
end
end
- it 'user is not listed in the project members page' do
+ it 'user is not listed in the project members page', :js do
+ more_actions_dropdown.click
click_link 'Request Access'
expect(project.requesters.exists?(user_id: user)).to be_truthy
@@ -64,13 +74,16 @@
end
end
- it 'user can withdraw its request for access' do
+ it 'user can withdraw its request for access', :js do
+ more_actions_dropdown.click
click_link 'Request Access'
expect(project.requesters.exists?(user_id: user)).to be_truthy
+ more_actions_dropdown.click
accept_gl_confirm { click_link 'Withdraw Access Request' }
+ more_actions_dropdown.click
expect(page).not_to have_content 'Withdraw Access Request'
expect(page).to have_content 'Request Access'
end
diff --git a/spec/frontend/groups_projects/components/more_actions_dropdown_spec.js b/spec/frontend/groups_projects/components/more_actions_dropdown_spec.js
new file mode 100644
index 0000000000000000000000000000000000000000..1bcff8a44beb74ce5bd236d7c2f2585230ecaac0
--- /dev/null
+++ b/spec/frontend/groups_projects/components/more_actions_dropdown_spec.js
@@ -0,0 +1,173 @@
+import { GlDisclosureDropdownItem, GlDisclosureDropdown } from '@gitlab/ui';
+import { shallowMountExtended } from 'helpers/vue_test_utils_helper';
+import moreActionsDropdown from '~/groups_projects/components/more_actions_dropdown.vue';
+
+describe('moreActionsDropdown', () => {
+ let wrapper;
+
+ const createComponent = ({ provideData = {}, propsData = {} } = {}) => {
+ wrapper = shallowMountExtended(moreActionsDropdown, {
+ provide: {
+ isGroup: false,
+ id: 1,
+ leavePath: '',
+ leaveConfirmMessage: '',
+ withdrawPath: '',
+ withdrawConfirmMessage: '',
+ requestAccessPath: '',
+ ...provideData,
+ },
+ propsData,
+ stubs: {
+ GlDisclosureDropdownItem,
+ },
+ });
+ };
+
+ const findDropdown = () => wrapper.findComponent(GlDisclosureDropdown);
+ const showDropdown = () => {
+ findDropdown().vm.$emit('show');
+ };
+
+ describe('copy id', () => {
+ describe('project namespace type', () => {
+ beforeEach(async () => {
+ createComponent({
+ provideData: {
+ id: 22,
+ },
+ });
+ await showDropdown();
+ });
+
+ it('has correct test id `copy-project-id`', () => {
+ expect(wrapper.findByTestId('copy-project-id').exists()).toBe(true);
+ expect(wrapper.findByTestId('copy-group-id').exists()).toBe(false);
+ });
+
+ it('renders copy project id with correct id', () => {
+ expect(wrapper.findByTestId('copy-project-id').text()).toBe('Copy project ID: 22');
+ });
+ });
+
+ describe('group namespace type', () => {
+ beforeEach(async () => {
+ createComponent({
+ provideData: {
+ isGroup: true,
+ id: 11,
+ },
+ });
+ await showDropdown();
+ });
+
+ it('has correct test id `copy-group-id`', () => {
+ expect(wrapper.findByTestId('copy-project-id').exists()).toBe(false);
+ expect(wrapper.findByTestId('copy-group-id').exists()).toBe(true);
+ });
+
+ it('renders copy group id with correct id', () => {
+ expect(wrapper.findByTestId('copy-group-id').text()).toBe('Copy group ID: 11');
+ });
+ });
+ });
+
+ describe('request access', () => {
+ it('does not render request access link', async () => {
+ createComponent();
+ await showDropdown();
+
+ expect(wrapper.findByTestId('request-access-link').exists()).toBe(false);
+ });
+
+ it('renders request access link', async () => {
+ createComponent({
+ provideData: {
+ requestAccessPath: 'http://request.path/path',
+ },
+ });
+ await showDropdown();
+
+ expect(wrapper.findByTestId('request-access-link').text()).toBe('Request Access');
+ expect(wrapper.findByTestId('request-access-link').attributes('href')).toBe(
+ 'http://request.path/path',
+ );
+ });
+ });
+
+ describe('withdraw access', () => {
+ it('does not render withdraw access link', async () => {
+ createComponent();
+ await showDropdown();
+
+ expect(wrapper.findByTestId('withdraw-access-link').exists()).toBe(false);
+ });
+
+ it('renders withdraw access link', async () => {
+ createComponent({
+ provideData: {
+ withdrawPath: 'http://withdraw.path/path',
+ },
+ });
+ await showDropdown();
+
+ expect(wrapper.findByTestId('withdraw-access-link').text()).toBe('Withdraw Access Request');
+ expect(wrapper.findByTestId('withdraw-access-link').attributes('href')).toBe(
+ 'http://withdraw.path/path',
+ );
+ });
+ });
+
+ describe('leave access', () => {
+ it('does not render leave link', async () => {
+ createComponent();
+ await showDropdown();
+
+ expect(wrapper.findByTestId('leave-project-link').exists()).toBe(false);
+ });
+
+ it('renders leave link', async () => {
+ createComponent({
+ provideData: {
+ leavePath: 'http://leave.path/path',
+ },
+ });
+ await showDropdown();
+
+ expect(wrapper.findByTestId('leave-project-link').exists()).toBe(true);
+ expect(wrapper.findByTestId('leave-project-link').text()).toBe('Leave project');
+ expect(wrapper.findByTestId('leave-project-link').attributes('href')).toBe(
+ 'http://leave.path/path',
+ );
+ });
+
+ describe('when `isGroup` is set to `false`', () => {
+ it('use testid `leave-project-link`', async () => {
+ createComponent({
+ provideData: {
+ leavePath: 'http://leave.path/path',
+ },
+ });
+ await showDropdown();
+
+ expect(wrapper.findByTestId('leave-project-link').exists()).toBe(true);
+ expect(wrapper.findByTestId('leave-group-link').exists()).toBe(false);
+ });
+ });
+
+ describe('when `isGroup` is set to `true`', () => {
+ it('use testid `leave-group-link`', async () => {
+ createComponent({
+ provideData: {
+ isGroup: true,
+ leavePath: 'http://leave.path/path',
+ },
+ });
+ await showDropdown();
+
+ expect(wrapper.findByTestId('leave-project-link').exists()).toBe(false);
+ expect(wrapper.findByTestId('leave-group-link').exists()).toBe(true);
+ });
+ });
+ });
+});
diff --git a/spec/views/groups/_home_panel.html.haml_spec.rb b/spec/views/groups/_home_panel.html.haml_spec.rb
index e76862cdaeac65a99473b084f325a9530646c8e6..ab556a3db01baec8a700355167ef352026f9e6b3 100644
--- a/spec/views/groups/_home_panel.html.haml_spec.rb
+++ b/spec/views/groups/_home_panel.html.haml_spec.rb
@@ -9,12 +9,6 @@
assign(:group, group)
end
- it 'renders the group ID' do
- render
-
- expect(rendered).to have_content("Group ID: #{group.id}")
- end
-
context 'admin area link' do
it 'renders admin area link for admin' do
allow(view).to receive(:current_user).and_return(create(:admin))
diff --git a/spec/views/projects/_home_panel.html.haml_spec.rb b/spec/views/projects/_home_panel.html.haml_spec.rb
index a35c87cb4b33c53a81fd57bce0f645f40ea93f46..0282e149b255211b2b4c3e0858cde2ee8ae9a728 100644
--- a/spec/views/projects/_home_panel.html.haml_spec.rb
+++ b/spec/views/projects/_home_panel.html.haml_spec.rb
@@ -148,38 +148,6 @@
end
end
- context 'project id' do
- let(:project) { create(:project) }
- let(:user) { create(:user) }
-
- before do
- assign(:project, project)
-
- allow(view).to receive(:current_user).and_return(user)
- allow(project).to receive(:license_anchor_data).and_return(false)
- end
-
- context 'user can read project' do
- it 'is shown' do
- allow(view).to receive(:can?).with(user, :read_project, project).and_return(true)
-
- render
-
- expect(rendered).to have_content("Project ID: #{project.id}")
- end
- end
-
- context 'user cannot read project' do
- it 'is not shown' do
- allow(view).to receive(:can?).with(user, :read_project, project).and_return(false)
-
- render
-
- expect(rendered).not_to have_content("Project ID: #{project.id}")
- end
- end
- end
-
context 'forks' do
let(:source_project) { create(:project, :repository) }
let(:project) { fork_project(source_project) }