diff options
Diffstat (limited to 'spec/features/projects/members/invite_group_spec.rb')
-rw-r--r-- | spec/features/projects/members/invite_group_spec.rb | 116 |
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 |