summaryrefslogtreecommitdiff
path: root/spec/features/projects/members/invite_group_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/features/projects/members/invite_group_spec.rb')
-rw-r--r--spec/features/projects/members/invite_group_spec.rb116
1 files changed, 92 insertions, 24 deletions
diff --git a/spec/features/projects/members/invite_group_spec.rb b/spec/features/projects/members/invite_group_spec.rb
index 9c256504934..a48229249e0 100644
--- a/spec/features/projects/members/invite_group_spec.rb
+++ b/spec/features/projects/members/invite_group_spec.rb
@@ -17,20 +17,18 @@ RSpec.describe 'Project > Members > Invite group', :js do
visit project_project_members_path(project)
- expect(page).to have_selector('button[data-test-id="invite-group-button"]')
+ expect(page).to have_selector(invite_group_selector)
end
- it 'does not display the button when visiting the page not signed in' do
+ it 'does not display the button when visiting the page not signed in' do
project = create(:project, namespace: create(:group))
visit project_project_members_path(project)
- expect(page).not_to have_selector('button[data-test-id="invite-group-button"]')
+ expect(page).not_to have_selector(invite_group_selector)
end
describe 'Share with group lock' do
- let(:invite_group_selector) { 'button[data-test-id="invite-group-button"]' }
-
shared_examples 'the project can be shared with groups' do
it 'the "Invite a group" button exists' do
visit project_project_members_path(project)
@@ -158,21 +156,95 @@ RSpec.describe 'Project > Members > Invite group', :js do
describe 'the groups dropdown' do
let_it_be(:parent_group) { create(:group, :public) }
let_it_be(:project_group) { create(:group, :public, parent: parent_group) }
- let_it_be(:public_sub_subgroup) { create(:group, :public, parent: project_group) }
- let_it_be(:public_sibbling_group) { create(:group, :public, parent: parent_group) }
- let_it_be(:private_sibbling_group) { create(:group, :private, parent: parent_group) }
- let_it_be(:private_membership_group) { create(:group, :private) }
- let_it_be(:public_membership_group) { create(:group, :public) }
let_it_be(:project) { create(:project, group: project_group) }
- before do
- private_membership_group.add_guest(maintainer)
- public_membership_group.add_maintainer(maintainer)
+ context 'with instance admin considerations' do
+ let_it_be(:group_to_share) { create(:group) }
- sign_in(maintainer)
+ context 'when user is an admin' do
+ let_it_be(:admin) { create(:admin) }
+
+ before do
+ sign_in(admin)
+ gitlab_enable_admin_mode_sign_in(admin)
+ end
+
+ it 'shows groups where the admin has no direct membership' do
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ end
+ end
+
+ it 'shows groups where the admin has at least guest level membership' do
+ group_to_share.add_guest(admin)
+
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ end
+ end
+ end
+
+ context 'when user is not an admin' do
+ before do
+ project.add_maintainer(maintainer)
+ sign_in(maintainer)
+ end
+
+ it 'does not show groups where the user has no direct membership' do
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_not_to_have_group(group_to_share)
+ end
+ end
+
+ it 'shows groups where the user has at least guest level membership' do
+ group_to_share.add_guest(maintainer)
+
+ visit project_project_members_path(project)
+
+ click_on 'Invite a group'
+ click_on 'Select a group'
+ wait_for_requests
+
+ page.within(group_dropdown_selector) do
+ expect_to_have_group(group_to_share)
+ end
+ end
+ end
end
context 'for a project in a nested group' do
+ let_it_be(:public_sub_subgroup) { create(:group, :public, parent: project_group) }
+ let_it_be(:public_sibbling_group) { create(:group, :public, parent: parent_group) }
+ let_it_be(:private_sibbling_group) { create(:group, :private, parent: parent_group) }
+ let_it_be(:private_membership_group) { create(:group, :private) }
+ let_it_be(:public_membership_group) { create(:group, :public) }
+ let_it_be(:project) { create(:project, group: project_group) }
+
+ before do
+ private_membership_group.add_guest(maintainer)
+ public_membership_group.add_maintainer(maintainer)
+
+ sign_in(maintainer)
+ end
+
it 'does not show the groups inherited from projects' do
project.add_maintainer(maintainer)
public_sibbling_group.add_maintainer(maintainer)
@@ -183,7 +255,7 @@ RSpec.describe 'Project > Members > Invite group', :js do
click_on 'Select a group'
wait_for_requests
- page.within('[data-testid="group-select-dropdown"]') do
+ page.within(group_dropdown_selector) do
expect_to_have_group(public_membership_group)
expect_to_have_group(public_sibbling_group)
expect_to_have_group(private_membership_group)
@@ -204,7 +276,7 @@ RSpec.describe 'Project > Members > Invite group', :js do
click_on 'Select a group'
wait_for_requests
- page.within('[data-testid="group-select-dropdown"]') do
+ page.within(group_dropdown_selector) do
expect_to_have_group(public_membership_group)
expect_to_have_group(public_sibbling_group)
expect_to_have_group(private_membership_group)
@@ -215,14 +287,10 @@ RSpec.describe 'Project > Members > Invite group', :js do
expect_not_to_have_group(project_group)
end
end
-
- def expect_to_have_group(group)
- expect(page).to have_selector("[entity-id='#{group.id}']")
- end
-
- def expect_not_to_have_group(group)
- expect(page).not_to have_selector("[entity-id='#{group.id}']")
- end
end
end
+
+ def invite_group_selector
+ 'button[data-test-id="invite-group-button"]'
+ end
end