From 9f87b34f667582c0df82b0a79b07ad2a0c1931bb Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:23:46 +0200 Subject: Combine group leave feature specs in one file Signed-off-by: Dmitriy Zaporozhets --- .../members/last_owner_cannot_leave_group_spec.rb | 16 ------ spec/features/groups/members/leave_group_spec.rb | 62 ++++++++++++++++++++++ .../groups/members/member_leaves_group_spec.rb | 21 -------- 3 files changed, 62 insertions(+), 37 deletions(-) delete mode 100644 spec/features/groups/members/last_owner_cannot_leave_group_spec.rb create mode 100644 spec/features/groups/members/leave_group_spec.rb delete mode 100644 spec/features/groups/members/member_leaves_group_spec.rb diff --git a/spec/features/groups/members/last_owner_cannot_leave_group_spec.rb b/spec/features/groups/members/last_owner_cannot_leave_group_spec.rb deleted file mode 100644 index 5af94e4069b..00000000000 --- a/spec/features/groups/members/last_owner_cannot_leave_group_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Last owner cannot leave group', feature: true do - let(:owner) { create(:user) } - let(:group) { create(:group) } - - background do - group.add_owner(owner) - gitlab_sign_in(owner) - visit group_path(group) - end - - scenario 'user does not see a "Leave group" link' do - expect(page).not_to have_content 'Leave group' - end -end diff --git a/spec/features/groups/members/leave_group_spec.rb b/spec/features/groups/members/leave_group_spec.rb new file mode 100644 index 00000000000..5b812891281 --- /dev/null +++ b/spec/features/groups/members/leave_group_spec.rb @@ -0,0 +1,62 @@ +require 'spec_helper' + +feature 'Groups > Members > Leave group', feature: true do + let(:user) { create(:user) } + let(:other_user) { create(:user) } + let(:group) { create(:group) } + + background do + gitlab_sign_in(user) + end + + scenario 'guest leaves the group' do + group.add_guest(user) + group.add_owner(other_user) + + visit group_path(group) + click_link 'Leave group' + + expect(current_path).to eq(dashboard_groups_path) + expect(page).to have_content left_group_message(group) + expect(group.members).not_to include(user) + end + + scenario 'guest leaves the group as last member' do + group.add_guest(user) + + visit group_path(group) + click_link 'Leave group' + + expect(current_path).to eq(dashboard_groups_path) + expect(page).to have_content left_group_message(group) + expect(group.members).not_to include(user) + end + + scenario 'owner leaves the group if they is not the last owner' do + group.add_owner(user) + group.add_owner(other_user) + + visit group_path(group) + click_link 'Leave group' + + expect(current_path).to eq(dashboard_groups_path) + expect(page).to have_content left_group_message(group) + expect(group.members).not_to include(user) + end + + scenario 'owner can not leave the group if they is a last owner' do + group.add_owner(user) + + visit group_path(group) + + expect(page).not_to have_content 'Leave group' + + visit group_group_members_path(group) + + expect(find(:css, '.project-members-page li', text: user.name)).not_to have_selector(:css, 'a.btn-remove') + end + + def left_group_message(group) + "You left the \"#{group.name}\"" + end +end diff --git a/spec/features/groups/members/member_leaves_group_spec.rb b/spec/features/groups/members/member_leaves_group_spec.rb deleted file mode 100644 index 40f3b166e74..00000000000 --- a/spec/features/groups/members/member_leaves_group_spec.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Member leaves group', feature: true do - let(:user) { create(:user) } - let(:owner) { create(:user) } - let(:group) { create(:group, :public) } - - background do - group.add_owner(owner) - group.add_developer(user) - gitlab_sign_in(user) - visit group_path(group) - end - - scenario 'user leaves group' do - click_link 'Leave group' - - expect(current_path).to eq(dashboard_groups_path) - expect(group.users.exists?(user.id)).to be_falsey - end -end -- cgit v1.2.3 From 5300a8944e850a2aa75ba051ef12adcd176c3dcc Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:26:55 +0200 Subject: Remove group members spinach tests that we already covered with rspec Signed-off-by: Dmitriy Zaporozhets --- features/group/members.feature | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/features/group/members.feature b/features/group/members.feature index e539f6a1273..5ff75ab3a5b 100644 --- a/features/group/members.feature +++ b/features/group/members.feature @@ -4,46 +4,6 @@ Feature: Group Members And "John Doe" is owner of group "Owned" And "John Doe" is guest of group "Guest" - # Leave - - @javascript - Scenario: Owner should be able to remove himself from group if he is not the last owner - Given "Mary Jane" is owner of group "Owned" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - When I click on the "Remove User From Group" button for "John Doe" - And I visit group "Owned" members page - Then I should not see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - - @javascript - Scenario: Owner should not be able to remove himself from group if he is the last owner - Given "Mary Jane" is guest of group "Owned" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - Then I should not see the "Remove User From Group" button for "John Doe" - - @javascript - Scenario: Guest should be able to remove himself from group - Given "Mary Jane" is guest of group "Guest" - When I visit group "Guest" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - When I click on the "Remove User From Group" button for "John Doe" - When I visit group "Guest" members page - Then I should not see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - - @javascript - Scenario: Guest should be able to remove himself from group even if he is the only user in the group - When I visit group "Guest" members page - Then I should see user "John Doe" in team list - When I click on the "Remove User From Group" button for "John Doe" - When I visit group "Guest" members page - Then I should not see user "John Doe" in team list - # Remove others Scenario: Owner should be able to remove other users from group -- cgit v1.2.3 From f2174f2dd07e83a02fd4bf8bb86deae8ce8fe122 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:33:49 +0200 Subject: Merge group request access specs under one file Signed-off-by: Dmitriy Zaporozhets --- ...er_cannot_request_access_to_his_project_spec.rb | 16 ----- .../groups/members/requests_access_spec.rb | 78 ++++++++++++++++++++++ .../groups/members/user_requests_access_spec.rb | 71 -------------------- 3 files changed, 78 insertions(+), 87 deletions(-) delete mode 100644 spec/features/groups/members/member_cannot_request_access_to_his_project_spec.rb create mode 100644 spec/features/groups/members/requests_access_spec.rb delete mode 100644 spec/features/groups/members/user_requests_access_spec.rb diff --git a/spec/features/groups/members/member_cannot_request_access_to_his_project_spec.rb b/spec/features/groups/members/member_cannot_request_access_to_his_project_spec.rb deleted file mode 100644 index 135bb3572bc..00000000000 --- a/spec/features/groups/members/member_cannot_request_access_to_his_project_spec.rb +++ /dev/null @@ -1,16 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Member cannot request access to his project', feature: true do - let(:member) { create(:user) } - let(:group) { create(:group) } - - background do - group.add_developer(member) - gitlab_sign_in(member) - visit group_path(group) - end - - scenario 'member does not see the request access button' do - expect(page).not_to have_content 'Request Access' - end -end diff --git a/spec/features/groups/members/requests_access_spec.rb b/spec/features/groups/members/requests_access_spec.rb new file mode 100644 index 00000000000..eaf9d163896 --- /dev/null +++ b/spec/features/groups/members/requests_access_spec.rb @@ -0,0 +1,78 @@ +require 'spec_helper' + +feature 'Groups > Members > Requests access', feature: true do + let(:user) { create(:user) } + let(:owner) { create(:user) } + let(:group) { create(:group, :public, :access_requestable) } + let!(:project) { create(:project, :private, namespace: group) } + + background do + group.add_owner(owner) + gitlab_sign_in(user) + visit group_path(group) + end + + scenario 'request access feature is disabled' do + group.update_attributes(request_access_enabled: false) + visit group_path(group) + + expect(page).not_to have_content 'Request Access' + end + + scenario 'user can request access to a group' do + perform_enqueued_jobs { click_link 'Request Access' } + + expect(ActionMailer::Base.deliveries.last.to).to eq [owner.notification_email] + expect(ActionMailer::Base.deliveries.last.subject).to match "Request to join the #{group.name} group" + + expect(group.requesters.exists?(user_id: user)).to be_truthy + expect(page).to have_content 'Your request for access has been queued for review.' + + expect(page).to have_content 'Withdraw Access Request' + expect(page).not_to have_content 'Leave group' + end + + scenario 'user does not see private projects' do + perform_enqueued_jobs { click_link 'Request Access' } + + expect(page).not_to have_content project.name + end + + scenario 'user does not see group in the Dashboard > Groups page' do + perform_enqueued_jobs { click_link 'Request Access' } + + visit dashboard_groups_path + + expect(page).not_to have_content group.name + end + + scenario 'user is not listed in the group members page' do + click_link 'Request Access' + + expect(group.requesters.exists?(user_id: user)).to be_truthy + + click_link 'Members' + + page.within('.content') do + expect(page).not_to have_content(user.name) + end + end + + scenario 'user can withdraw its request for access' do + click_link 'Request Access' + + expect(group.requesters.exists?(user_id: user)).to be_truthy + + click_link 'Withdraw Access Request' + + expect(group.requesters.exists?(user_id: user)).to be_falsey + expect(page).to have_content 'Your access request to the group has been withdrawn.' + end + + scenario 'member does not see the request access button' do + group.add_owner(user) + visit group_path(group) + + expect(page).not_to have_content 'Request Access' + end +end diff --git a/spec/features/groups/members/user_requests_access_spec.rb b/spec/features/groups/members/user_requests_access_spec.rb deleted file mode 100644 index 3813308c237..00000000000 --- a/spec/features/groups/members/user_requests_access_spec.rb +++ /dev/null @@ -1,71 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > User requests access', feature: true do - let(:user) { create(:user) } - let(:owner) { create(:user) } - let(:group) { create(:group, :public, :access_requestable) } - let!(:project) { create(:project, :private, namespace: group) } - - background do - group.add_owner(owner) - gitlab_sign_in(user) - visit group_path(group) - end - - scenario 'request access feature is disabled' do - group.update_attributes(request_access_enabled: false) - visit group_path(group) - - expect(page).not_to have_content 'Request Access' - end - - scenario 'user can request access to a group' do - perform_enqueued_jobs { click_link 'Request Access' } - - expect(ActionMailer::Base.deliveries.last.to).to eq [owner.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to match "Request to join the #{group.name} group" - - expect(group.requesters.exists?(user_id: user)).to be_truthy - expect(page).to have_content 'Your request for access has been queued for review.' - - expect(page).to have_content 'Withdraw Access Request' - expect(page).not_to have_content 'Leave group' - end - - scenario 'user does not see private projects' do - perform_enqueued_jobs { click_link 'Request Access' } - - expect(page).not_to have_content project.name - end - - scenario 'user does not see group in the Dashboard > Groups page' do - perform_enqueued_jobs { click_link 'Request Access' } - - visit dashboard_groups_path - - expect(page).not_to have_content group.name - end - - scenario 'user is not listed in the group members page' do - click_link 'Request Access' - - expect(group.requesters.exists?(user_id: user)).to be_truthy - - click_link 'Members' - - page.within('.content') do - expect(page).not_to have_content(user.name) - end - end - - scenario 'user can withdraw its request for access' do - click_link 'Request Access' - - expect(group.requesters.exists?(user_id: user)).to be_truthy - - click_link 'Withdraw Access Request' - - expect(group.requesters.exists?(user_id: user)).to be_falsey - expect(page).to have_content 'Your access request to the group has been withdrawn.' - end -end -- cgit v1.2.3 From 195cf2a7125d82edb5f82ae73d269d885aae6c04 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:34:35 +0200 Subject: Fix wrong scenario title to owner_manages_access_requests_spec.rb Signed-off-by: Dmitriy Zaporozhets --- spec/features/groups/members/owner_manages_access_requests_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/features/groups/members/owner_manages_access_requests_spec.rb b/spec/features/groups/members/owner_manages_access_requests_spec.rb index 4e4cf12e8af..db656d244c0 100644 --- a/spec/features/groups/members/owner_manages_access_requests_spec.rb +++ b/spec/features/groups/members/owner_manages_access_requests_spec.rb @@ -17,7 +17,7 @@ feature 'Groups > Members > Owner manages access requests', feature: true do expect_visible_access_request(group, user) end - scenario 'master can grant access' do + scenario 'owner can grant access' do visit group_group_members_path(group) expect_visible_access_request(group, user) @@ -28,7 +28,7 @@ feature 'Groups > Members > Owner manages access requests', feature: true do expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{group.name} group was granted" end - scenario 'master can deny access' do + scenario 'owner can deny access' do visit group_group_members_path(group) expect_visible_access_request(group, user) -- cgit v1.2.3 From c56f7876028e7eb3b9a116d1dc26ae229f8b2ca0 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:43:14 +0200 Subject: Rename group member specs for consistent naming Signed-off-by: Dmitriy Zaporozhets --- spec/features/groups/members/list_members_spec.rb | 105 +++++++++++++++++++++ spec/features/groups/members/list_spec.rb | 105 --------------------- .../groups/members/manage_access_requests_spec.rb | 47 +++++++++ spec/features/groups/members/manage_members.rb | 4 + .../members/owner_manages_access_requests_spec.rb | 47 --------- .../features/groups/members/request_access_spec.rb | 78 +++++++++++++++ .../groups/members/requests_access_spec.rb | 78 --------------- spec/features/groups/members/sort_members_spec.rb | 98 +++++++++++++++++++ spec/features/groups/members/sorting_spec.rb | 98 ------------------- 9 files changed, 332 insertions(+), 328 deletions(-) create mode 100644 spec/features/groups/members/list_members_spec.rb delete mode 100644 spec/features/groups/members/list_spec.rb create mode 100644 spec/features/groups/members/manage_access_requests_spec.rb create mode 100644 spec/features/groups/members/manage_members.rb delete mode 100644 spec/features/groups/members/owner_manages_access_requests_spec.rb create mode 100644 spec/features/groups/members/request_access_spec.rb delete mode 100644 spec/features/groups/members/requests_access_spec.rb create mode 100644 spec/features/groups/members/sort_members_spec.rb delete mode 100644 spec/features/groups/members/sorting_spec.rb diff --git a/spec/features/groups/members/list_members_spec.rb b/spec/features/groups/members/list_members_spec.rb new file mode 100644 index 00000000000..69cbeb4a35a --- /dev/null +++ b/spec/features/groups/members/list_members_spec.rb @@ -0,0 +1,105 @@ +require 'spec_helper' + +feature 'Groups > Members > List members', feature: true do + include Select2Helper + + let(:user1) { create(:user, name: 'John Doe') } + let(:user2) { create(:user, name: 'Mary Jane') } + let(:group) { create(:group) } + let(:nested_group) { create(:group, parent: group) } + + background do + gitlab_sign_in(user1) + end + + scenario 'show members from current group and parent', :nested_groups do + group.add_developer(user1) + nested_group.add_developer(user2) + + visit group_group_members_path(nested_group) + + expect(first_row.text).to include(user1.name) + expect(second_row.text).to include(user2.name) + end + + scenario 'show user once if member of both current group and parent', :nested_groups do + group.add_developer(user1) + nested_group.add_developer(user1) + + visit group_group_members_path(nested_group) + + expect(first_row.text).to include(user1.name) + expect(second_row).to be_blank + end + + scenario 'update user to owner level', :js do + group.add_owner(user1) + group.add_developer(user2) + + visit group_group_members_path(group) + + page.within(second_row) do + click_button('Developer') + click_link('Owner') + + expect(page).to have_button('Owner') + end + end + + scenario 'add user to group', :js do + group.add_owner(user1) + + visit group_group_members_path(group) + + add_user(user2.id, 'Reporter') + + page.within(second_row) do + expect(page).to have_content(user2.name) + expect(page).to have_button('Reporter') + end + end + + scenario 'add yourself to group when already an owner', :js do + group.add_owner(user1) + + visit group_group_members_path(group) + + add_user(user1.id, 'Reporter') + + page.within(first_row) do + expect(page).to have_content(user1.name) + expect(page).to have_content('Owner') + end + end + + scenario 'invite user to group', :js do + group.add_owner(user1) + + visit group_group_members_path(group) + + add_user('test@example.com', 'Reporter') + + page.within(second_row) do + expect(page).to have_content('test@example.com') + expect(page).to have_content('Invited') + expect(page).to have_button('Reporter') + end + end + + def first_row + page.all('ul.content-list > li')[0] + end + + def second_row + page.all('ul.content-list > li')[1] + end + + def add_user(id, role) + page.within ".users-group-form" do + select2(id, from: "#user_ids", multiple: true) + select(role, from: "access_level") + end + + click_button "Add to group" + end +end diff --git a/spec/features/groups/members/list_spec.rb b/spec/features/groups/members/list_spec.rb deleted file mode 100644 index 5d00ed30c83..00000000000 --- a/spec/features/groups/members/list_spec.rb +++ /dev/null @@ -1,105 +0,0 @@ -require 'spec_helper' - -feature 'Groups members list', feature: true do - include Select2Helper - - let(:user1) { create(:user, name: 'John Doe') } - let(:user2) { create(:user, name: 'Mary Jane') } - let(:group) { create(:group) } - let(:nested_group) { create(:group, parent: group) } - - background do - gitlab_sign_in(user1) - end - - scenario 'show members from current group and parent', :nested_groups do - group.add_developer(user1) - nested_group.add_developer(user2) - - visit group_group_members_path(nested_group) - - expect(first_row.text).to include(user1.name) - expect(second_row.text).to include(user2.name) - end - - scenario 'show user once if member of both current group and parent', :nested_groups do - group.add_developer(user1) - nested_group.add_developer(user1) - - visit group_group_members_path(nested_group) - - expect(first_row.text).to include(user1.name) - expect(second_row).to be_blank - end - - scenario 'update user to owner level', :js do - group.add_owner(user1) - group.add_developer(user2) - - visit group_group_members_path(group) - - page.within(second_row) do - click_button('Developer') - click_link('Owner') - - expect(page).to have_button('Owner') - end - end - - scenario 'add user to group', :js do - group.add_owner(user1) - - visit group_group_members_path(group) - - add_user(user2.id, 'Reporter') - - page.within(second_row) do - expect(page).to have_content(user2.name) - expect(page).to have_button('Reporter') - end - end - - scenario 'add yourself to group when already an owner', :js do - group.add_owner(user1) - - visit group_group_members_path(group) - - add_user(user1.id, 'Reporter') - - page.within(first_row) do - expect(page).to have_content(user1.name) - expect(page).to have_content('Owner') - end - end - - scenario 'invite user to group', :js do - group.add_owner(user1) - - visit group_group_members_path(group) - - add_user('test@example.com', 'Reporter') - - page.within(second_row) do - expect(page).to have_content('test@example.com') - expect(page).to have_content('Invited') - expect(page).to have_button('Reporter') - end - end - - def first_row - page.all('ul.content-list > li')[0] - end - - def second_row - page.all('ul.content-list > li')[1] - end - - def add_user(id, role) - page.within ".users-group-form" do - select2(id, from: "#user_ids", multiple: true) - select(role, from: "access_level") - end - - click_button "Add to group" - end -end diff --git a/spec/features/groups/members/manage_access_requests_spec.rb b/spec/features/groups/members/manage_access_requests_spec.rb new file mode 100644 index 00000000000..f84d8594c65 --- /dev/null +++ b/spec/features/groups/members/manage_access_requests_spec.rb @@ -0,0 +1,47 @@ +require 'spec_helper' + +feature 'Groups > Members > Manage access requests', feature: true do + let(:user) { create(:user) } + let(:owner) { create(:user) } + let(:group) { create(:group, :public, :access_requestable) } + + background do + group.request_access(user) + group.add_owner(owner) + gitlab_sign_in(owner) + end + + scenario 'owner can see access requests' do + visit group_group_members_path(group) + + expect_visible_access_request(group, user) + end + + scenario 'owner can grant access' do + visit group_group_members_path(group) + + expect_visible_access_request(group, user) + + perform_enqueued_jobs { click_on 'Grant access' } + + expect(ActionMailer::Base.deliveries.last.to).to eq [user.notification_email] + expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{group.name} group was granted" + end + + scenario 'owner can deny access' do + visit group_group_members_path(group) + + expect_visible_access_request(group, user) + + perform_enqueued_jobs { click_on 'Deny access' } + + expect(ActionMailer::Base.deliveries.last.to).to eq [user.notification_email] + expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{group.name} group was denied" + end + + def expect_visible_access_request(group, user) + expect(group.requesters.exists?(user_id: user)).to be_truthy + expect(page).to have_content "Users requesting access to #{group.name} 1" + expect(page).to have_content user.name + end +end diff --git a/spec/features/groups/members/manage_members.rb b/spec/features/groups/members/manage_members.rb new file mode 100644 index 00000000000..ff0a09709e5 --- /dev/null +++ b/spec/features/groups/members/manage_members.rb @@ -0,0 +1,4 @@ +require 'spec_helper' + +feature 'Groups > Members > Manage members', feature: true do +end diff --git a/spec/features/groups/members/owner_manages_access_requests_spec.rb b/spec/features/groups/members/owner_manages_access_requests_spec.rb deleted file mode 100644 index db656d244c0..00000000000 --- a/spec/features/groups/members/owner_manages_access_requests_spec.rb +++ /dev/null @@ -1,47 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Owner manages access requests', feature: true do - let(:user) { create(:user) } - let(:owner) { create(:user) } - let(:group) { create(:group, :public, :access_requestable) } - - background do - group.request_access(user) - group.add_owner(owner) - gitlab_sign_in(owner) - end - - scenario 'owner can see access requests' do - visit group_group_members_path(group) - - expect_visible_access_request(group, user) - end - - scenario 'owner can grant access' do - visit group_group_members_path(group) - - expect_visible_access_request(group, user) - - perform_enqueued_jobs { click_on 'Grant access' } - - expect(ActionMailer::Base.deliveries.last.to).to eq [user.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{group.name} group was granted" - end - - scenario 'owner can deny access' do - visit group_group_members_path(group) - - expect_visible_access_request(group, user) - - perform_enqueued_jobs { click_on 'Deny access' } - - expect(ActionMailer::Base.deliveries.last.to).to eq [user.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to match "Access to the #{group.name} group was denied" - end - - def expect_visible_access_request(group, user) - expect(group.requesters.exists?(user_id: user)).to be_truthy - expect(page).to have_content "Users requesting access to #{group.name} 1" - expect(page).to have_content user.name - end -end diff --git a/spec/features/groups/members/request_access_spec.rb b/spec/features/groups/members/request_access_spec.rb new file mode 100644 index 00000000000..41c31b62e18 --- /dev/null +++ b/spec/features/groups/members/request_access_spec.rb @@ -0,0 +1,78 @@ +require 'spec_helper' + +feature 'Groups > Members > Request access', feature: true do + let(:user) { create(:user) } + let(:owner) { create(:user) } + let(:group) { create(:group, :public, :access_requestable) } + let!(:project) { create(:project, :private, namespace: group) } + + background do + group.add_owner(owner) + gitlab_sign_in(user) + visit group_path(group) + end + + scenario 'request access feature is disabled' do + group.update_attributes(request_access_enabled: false) + visit group_path(group) + + expect(page).not_to have_content 'Request Access' + end + + scenario 'user can request access to a group' do + perform_enqueued_jobs { click_link 'Request Access' } + + expect(ActionMailer::Base.deliveries.last.to).to eq [owner.notification_email] + expect(ActionMailer::Base.deliveries.last.subject).to match "Request to join the #{group.name} group" + + expect(group.requesters.exists?(user_id: user)).to be_truthy + expect(page).to have_content 'Your request for access has been queued for review.' + + expect(page).to have_content 'Withdraw Access Request' + expect(page).not_to have_content 'Leave group' + end + + scenario 'user does not see private projects' do + perform_enqueued_jobs { click_link 'Request Access' } + + expect(page).not_to have_content project.name + end + + scenario 'user does not see group in the Dashboard > Groups page' do + perform_enqueued_jobs { click_link 'Request Access' } + + visit dashboard_groups_path + + expect(page).not_to have_content group.name + end + + scenario 'user is not listed in the group members page' do + click_link 'Request Access' + + expect(group.requesters.exists?(user_id: user)).to be_truthy + + click_link 'Members' + + page.within('.content') do + expect(page).not_to have_content(user.name) + end + end + + scenario 'user can withdraw its request for access' do + click_link 'Request Access' + + expect(group.requesters.exists?(user_id: user)).to be_truthy + + click_link 'Withdraw Access Request' + + expect(group.requesters.exists?(user_id: user)).to be_falsey + expect(page).to have_content 'Your access request to the group has been withdrawn.' + end + + scenario 'member does not see the request access button' do + group.add_owner(user) + visit group_path(group) + + expect(page).not_to have_content 'Request Access' + end +end diff --git a/spec/features/groups/members/requests_access_spec.rb b/spec/features/groups/members/requests_access_spec.rb deleted file mode 100644 index eaf9d163896..00000000000 --- a/spec/features/groups/members/requests_access_spec.rb +++ /dev/null @@ -1,78 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Requests access', feature: true do - let(:user) { create(:user) } - let(:owner) { create(:user) } - let(:group) { create(:group, :public, :access_requestable) } - let!(:project) { create(:project, :private, namespace: group) } - - background do - group.add_owner(owner) - gitlab_sign_in(user) - visit group_path(group) - end - - scenario 'request access feature is disabled' do - group.update_attributes(request_access_enabled: false) - visit group_path(group) - - expect(page).not_to have_content 'Request Access' - end - - scenario 'user can request access to a group' do - perform_enqueued_jobs { click_link 'Request Access' } - - expect(ActionMailer::Base.deliveries.last.to).to eq [owner.notification_email] - expect(ActionMailer::Base.deliveries.last.subject).to match "Request to join the #{group.name} group" - - expect(group.requesters.exists?(user_id: user)).to be_truthy - expect(page).to have_content 'Your request for access has been queued for review.' - - expect(page).to have_content 'Withdraw Access Request' - expect(page).not_to have_content 'Leave group' - end - - scenario 'user does not see private projects' do - perform_enqueued_jobs { click_link 'Request Access' } - - expect(page).not_to have_content project.name - end - - scenario 'user does not see group in the Dashboard > Groups page' do - perform_enqueued_jobs { click_link 'Request Access' } - - visit dashboard_groups_path - - expect(page).not_to have_content group.name - end - - scenario 'user is not listed in the group members page' do - click_link 'Request Access' - - expect(group.requesters.exists?(user_id: user)).to be_truthy - - click_link 'Members' - - page.within('.content') do - expect(page).not_to have_content(user.name) - end - end - - scenario 'user can withdraw its request for access' do - click_link 'Request Access' - - expect(group.requesters.exists?(user_id: user)).to be_truthy - - click_link 'Withdraw Access Request' - - expect(group.requesters.exists?(user_id: user)).to be_falsey - expect(page).to have_content 'Your access request to the group has been withdrawn.' - end - - scenario 'member does not see the request access button' do - group.add_owner(user) - visit group_path(group) - - expect(page).not_to have_content 'Request Access' - end -end diff --git a/spec/features/groups/members/sort_members_spec.rb b/spec/features/groups/members/sort_members_spec.rb new file mode 100644 index 00000000000..8ee61953844 --- /dev/null +++ b/spec/features/groups/members/sort_members_spec.rb @@ -0,0 +1,98 @@ +require 'spec_helper' + +feature 'Groups > Members > Sort members', feature: true do + let(:owner) { create(:user, name: 'John Doe') } + let(:developer) { create(:user, name: 'Mary Jane', last_sign_in_at: 5.days.ago) } + let(:group) { create(:group) } + + background do + create(:group_member, :owner, user: owner, group: group, created_at: 5.days.ago) + create(:group_member, :developer, user: developer, group: group, created_at: 3.days.ago) + + gitlab_sign_in(owner) + end + + scenario 'sorts alphabetically by default' do + visit_members_list(sort: nil) + + expect(first_member).to include(owner.name) + expect(second_member).to include(developer.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Name, ascending') + end + + scenario 'sorts by access level ascending' do + visit_members_list(sort: :access_level_asc) + + expect(first_member).to include(developer.name) + expect(second_member).to include(owner.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Access level, ascending') + end + + scenario 'sorts by access level descending' do + visit_members_list(sort: :access_level_desc) + + expect(first_member).to include(owner.name) + expect(second_member).to include(developer.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Access level, descending') + end + + scenario 'sorts by last joined' do + visit_members_list(sort: :last_joined) + + expect(first_member).to include(developer.name) + expect(second_member).to include(owner.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Last joined') + end + + scenario 'sorts by oldest joined' do + visit_members_list(sort: :oldest_joined) + + expect(first_member).to include(owner.name) + expect(second_member).to include(developer.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Oldest joined') + end + + scenario 'sorts by name ascending' do + visit_members_list(sort: :name_asc) + + expect(first_member).to include(owner.name) + expect(second_member).to include(developer.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Name, ascending') + end + + scenario 'sorts by name descending' do + visit_members_list(sort: :name_desc) + + expect(first_member).to include(developer.name) + expect(second_member).to include(owner.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Name, descending') + end + + scenario 'sorts by recent sign in', :redis do + visit_members_list(sort: :recent_sign_in) + + expect(first_member).to include(owner.name) + expect(second_member).to include(developer.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Recent sign in') + end + + scenario 'sorts by oldest sign in', :redis do + visit_members_list(sort: :oldest_sign_in) + + expect(first_member).to include(developer.name) + expect(second_member).to include(owner.name) + expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Oldest sign in') + end + + def visit_members_list(sort:) + visit group_group_members_path(group.to_param, sort: sort) + end + + def first_member + page.all('ul.content-list > li').first.text + end + + def second_member + page.all('ul.content-list > li').last.text + end +end diff --git a/spec/features/groups/members/sorting_spec.rb b/spec/features/groups/members/sorting_spec.rb deleted file mode 100644 index 719fa0b40b8..00000000000 --- a/spec/features/groups/members/sorting_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Sorting', feature: true do - let(:owner) { create(:user, name: 'John Doe') } - let(:developer) { create(:user, name: 'Mary Jane', last_sign_in_at: 5.days.ago) } - let(:group) { create(:group) } - - background do - create(:group_member, :owner, user: owner, group: group, created_at: 5.days.ago) - create(:group_member, :developer, user: developer, group: group, created_at: 3.days.ago) - - gitlab_sign_in(owner) - end - - scenario 'sorts alphabetically by default' do - visit_members_list(sort: nil) - - expect(first_member).to include(owner.name) - expect(second_member).to include(developer.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Name, ascending') - end - - scenario 'sorts by access level ascending' do - visit_members_list(sort: :access_level_asc) - - expect(first_member).to include(developer.name) - expect(second_member).to include(owner.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Access level, ascending') - end - - scenario 'sorts by access level descending' do - visit_members_list(sort: :access_level_desc) - - expect(first_member).to include(owner.name) - expect(second_member).to include(developer.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Access level, descending') - end - - scenario 'sorts by last joined' do - visit_members_list(sort: :last_joined) - - expect(first_member).to include(developer.name) - expect(second_member).to include(owner.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Last joined') - end - - scenario 'sorts by oldest joined' do - visit_members_list(sort: :oldest_joined) - - expect(first_member).to include(owner.name) - expect(second_member).to include(developer.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Oldest joined') - end - - scenario 'sorts by name ascending' do - visit_members_list(sort: :name_asc) - - expect(first_member).to include(owner.name) - expect(second_member).to include(developer.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Name, ascending') - end - - scenario 'sorts by name descending' do - visit_members_list(sort: :name_desc) - - expect(first_member).to include(developer.name) - expect(second_member).to include(owner.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Name, descending') - end - - scenario 'sorts by recent sign in', :redis do - visit_members_list(sort: :recent_sign_in) - - expect(first_member).to include(owner.name) - expect(second_member).to include(developer.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Recent sign in') - end - - scenario 'sorts by oldest sign in', :redis do - visit_members_list(sort: :oldest_sign_in) - - expect(first_member).to include(developer.name) - expect(second_member).to include(owner.name) - expect(page).to have_css('.member-sort-dropdown .dropdown-toggle-text', text: 'Oldest sign in') - end - - def visit_members_list(sort:) - visit group_group_members_path(group.to_param, sort: sort) - end - - def first_member - page.all('ul.content-list > li').first.text - end - - def second_member - page.all('ul.content-list > li').last.text - end -end -- cgit v1.2.3 From a67ff8e8835e3594783de0d198f5dcce24145c6d Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:50:16 +0200 Subject: Move "remove group member" spec from spinach to rspec Signed-off-by: Dmitriy Zaporozhets --- features/group/members.feature | 12 --- spec/features/groups/members/list_members_spec.rb | 63 ---------------- spec/features/groups/members/manage_members.rb | 92 +++++++++++++++++++++++ 3 files changed, 92 insertions(+), 75 deletions(-) diff --git a/features/group/members.feature b/features/group/members.feature index 5ff75ab3a5b..a7e51339e12 100644 --- a/features/group/members.feature +++ b/features/group/members.feature @@ -4,18 +4,6 @@ Feature: Group Members And "John Doe" is owner of group "Owned" And "John Doe" is guest of group "Guest" - # Remove others - - Scenario: Owner should be able to remove other users from group - Given "Mary Jane" is owner of group "Owned" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - When I click on the "Remove User From Group" button for "Mary Jane" - When I visit group "Owned" members page - Then I should see user "John Doe" in team list - Then I should not see user "Mary Jane" in team list - Scenario: Guest should not be able to remove other users from group Given "Mary Jane" is guest of group "Guest" When I visit group "Guest" members page diff --git a/spec/features/groups/members/list_members_spec.rb b/spec/features/groups/members/list_members_spec.rb index 69cbeb4a35a..f6493c4c50e 100644 --- a/spec/features/groups/members/list_members_spec.rb +++ b/spec/features/groups/members/list_members_spec.rb @@ -32,60 +32,6 @@ feature 'Groups > Members > List members', feature: true do expect(second_row).to be_blank end - scenario 'update user to owner level', :js do - group.add_owner(user1) - group.add_developer(user2) - - visit group_group_members_path(group) - - page.within(second_row) do - click_button('Developer') - click_link('Owner') - - expect(page).to have_button('Owner') - end - end - - scenario 'add user to group', :js do - group.add_owner(user1) - - visit group_group_members_path(group) - - add_user(user2.id, 'Reporter') - - page.within(second_row) do - expect(page).to have_content(user2.name) - expect(page).to have_button('Reporter') - end - end - - scenario 'add yourself to group when already an owner', :js do - group.add_owner(user1) - - visit group_group_members_path(group) - - add_user(user1.id, 'Reporter') - - page.within(first_row) do - expect(page).to have_content(user1.name) - expect(page).to have_content('Owner') - end - end - - scenario 'invite user to group', :js do - group.add_owner(user1) - - visit group_group_members_path(group) - - add_user('test@example.com', 'Reporter') - - page.within(second_row) do - expect(page).to have_content('test@example.com') - expect(page).to have_content('Invited') - expect(page).to have_button('Reporter') - end - end - def first_row page.all('ul.content-list > li')[0] end @@ -93,13 +39,4 @@ feature 'Groups > Members > List members', feature: true do def second_row page.all('ul.content-list > li')[1] end - - def add_user(id, role) - page.within ".users-group-form" do - select2(id, from: "#user_ids", multiple: true) - select(role, from: "access_level") - end - - click_button "Add to group" - end end diff --git a/spec/features/groups/members/manage_members.rb b/spec/features/groups/members/manage_members.rb index ff0a09709e5..d5925a13401 100644 --- a/spec/features/groups/members/manage_members.rb +++ b/spec/features/groups/members/manage_members.rb @@ -1,4 +1,96 @@ require 'spec_helper' feature 'Groups > Members > Manage members', feature: true do + include Select2Helper + + let(:user1) { create(:user, name: 'John Doe') } + let(:user2) { create(:user, name: 'Mary Jane') } + let(:group) { create(:group) } + + background do + gitlab_sign_in(user1) + end + + scenario 'update user to owner level', :js do + group.add_owner(user1) + group.add_developer(user2) + + visit group_group_members_path(group) + + page.within(second_row) do + click_button('Developer') + click_link('Owner') + + expect(page).to have_button('Owner') + end + end + + scenario 'add user to group', :js do + group.add_owner(user1) + + visit group_group_members_path(group) + + add_user(user2.id, 'Reporter') + + page.within(second_row) do + expect(page).to have_content(user2.name) + expect(page).to have_button('Reporter') + end + end + + scenario 'remove user from group', :js do + group.add_owner(user1) + group.add_developer(user2) + + visit group_group_members_path(group) + + find(:css, '.project-members-page li', text: user2.name).find(:css, 'a.btn-remove').click + + expect(page).not_to have_content(user2.name) + expect(group.users).not_to include(user2) + end + + scenario 'add yourself to group when already an owner', :js do + group.add_owner(user1) + + visit group_group_members_path(group) + + add_user(user1.id, 'Reporter') + + page.within(first_row) do + expect(page).to have_content(user1.name) + expect(page).to have_content('Owner') + end + end + + scenario 'invite user to group', :js do + group.add_owner(user1) + + visit group_group_members_path(group) + + add_user('test@example.com', 'Reporter') + + page.within(second_row) do + expect(page).to have_content('test@example.com') + expect(page).to have_content('Invited') + expect(page).to have_button('Reporter') + end + end + + def first_row + page.all('ul.content-list > li')[0] + end + + def second_row + page.all('ul.content-list > li')[1] + end + + def add_user(id, role) + page.within ".users-group-form" do + select2(id, from: "#user_ids", multiple: true) + select(role, from: "access_level") + end + + click_button "Add to group" + end end -- cgit v1.2.3 From 69043814b40fb1203e77c75b4bb082dd67501222 Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 16:51:05 +0200 Subject: Fix leave_group_spec.rb Signed-off-by: Dmitriy Zaporozhets --- spec/features/groups/members/leave_group_spec.rb | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/spec/features/groups/members/leave_group_spec.rb b/spec/features/groups/members/leave_group_spec.rb index 5b812891281..b438f57753c 100644 --- a/spec/features/groups/members/leave_group_spec.rb +++ b/spec/features/groups/members/leave_group_spec.rb @@ -18,7 +18,7 @@ feature 'Groups > Members > Leave group', feature: true do expect(current_path).to eq(dashboard_groups_path) expect(page).to have_content left_group_message(group) - expect(group.members).not_to include(user) + expect(group.users).not_to include(user) end scenario 'guest leaves the group as last member' do @@ -29,7 +29,7 @@ feature 'Groups > Members > Leave group', feature: true do expect(current_path).to eq(dashboard_groups_path) expect(page).to have_content left_group_message(group) - expect(group.members).not_to include(user) + expect(group.users).not_to include(user) end scenario 'owner leaves the group if they is not the last owner' do @@ -41,7 +41,7 @@ feature 'Groups > Members > Leave group', feature: true do expect(current_path).to eq(dashboard_groups_path) expect(page).to have_content left_group_message(group) - expect(group.members).not_to include(user) + expect(group.users).not_to include(user) end scenario 'owner can not leave the group if they is a last owner' do -- cgit v1.2.3 From 0aa5f08988547678c2a32a5ad85332bbc165d3bf Mon Sep 17 00:00:00 2001 From: Dmitriy Zaporozhets Date: Mon, 26 Jun 2017 17:00:07 +0200 Subject: Move another group member spec from spinach Signed-off-by: Dmitriy Zaporozhets --- features/group/members.feature | 7 ------- spec/features/groups/members/manage_members.rb | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 7 deletions(-) diff --git a/features/group/members.feature b/features/group/members.feature index a7e51339e12..49a44f57cbb 100644 --- a/features/group/members.feature +++ b/features/group/members.feature @@ -4,13 +4,6 @@ Feature: Group Members And "John Doe" is owner of group "Owned" And "John Doe" is guest of group "Guest" - Scenario: Guest should not be able to remove other users from group - Given "Mary Jane" is guest of group "Guest" - When I visit group "Guest" members page - Then I should see user "John Doe" in team list - Then I should see user "Mary Jane" in team list - Then I should not see the "Remove User From Group" button for "Mary Jane" - Scenario: Search member by name Given "Mary Jane" is guest of group "Guest" And I visit group "Guest" members page diff --git a/spec/features/groups/members/manage_members.rb b/spec/features/groups/members/manage_members.rb index d5925a13401..a9a654b20e2 100644 --- a/spec/features/groups/members/manage_members.rb +++ b/spec/features/groups/members/manage_members.rb @@ -77,6 +77,23 @@ feature 'Groups > Members > Manage members', feature: true do end end + scenario 'guest can not manage other users' do + group.add_guest(user1) + group.add_developer(user2) + + visit group_group_members_path(group) + + expect(page).not_to have_button 'Add to group' + + page.within(second_row) do + # Can not modify user2 role + expect(page).not_to have_button 'Developer' + + # Can not remove user2 + expect(page).not_to have_css('a.btn-remove') + end + end + def first_row page.all('ul.content-list > li')[0] end -- cgit v1.2.3