From 868cb4307f93b2f8fa0d25d9e47e632d0855881e Mon Sep 17 00:00:00 2001 From: Sean McGivern Date: Fri, 23 Feb 2018 12:10:57 +0000 Subject: Fix subgroup issue and MR pages empty states and counts Previously, these wouldn't count issues or MRs in subgroups - meaning that if _this_ group had no issues or MRs, we'd show the empty state, which was wrong. --- spec/features/groups/empty_states_spec.rb | 124 +++++++++++++++++++----------- 1 file changed, 81 insertions(+), 43 deletions(-) (limited to 'spec/features/groups') diff --git a/spec/features/groups/empty_states_spec.rb b/spec/features/groups/empty_states_spec.rb index 243e8536168..04217fec06c 100644 --- a/spec/features/groups/empty_states_spec.rb +++ b/spec/features/groups/empty_states_spec.rb @@ -1,6 +1,6 @@ require 'spec_helper' -feature 'Groups Merge Requests Empty States' do +feature 'Group empty states' do let(:group) { create(:group) } let(:user) { create(:group_member, :developer, user: create(:user), group: group ).user } @@ -8,62 +8,100 @@ feature 'Groups Merge Requests Empty States' do sign_in(user) end - context 'group has a project' do - let(:project) { create(:project, namespace: group) } + [:issue, :merge_request].each do |issuable| + issuable_name = issuable.to_s.humanize.downcase + project_relation = issuable == :issue ? :project : :source_project - before do - project.add_master(user) - end + context "for #{issuable_name}s" do + let(:path) { public_send(:"#{issuable}s_group_path", group) } - context 'the project has a merge request' do - before do - create(:merge_request, source_project: project) + context 'group has a project' do + let(:project) { create(:project, namespace: group) } - visit merge_requests_group_path(group) - end + before do + project.add_master(user) + end - it 'should not display an empty state' do - expect(page).not_to have_selector('.empty-state') - end - end + context "the project has #{issuable_name}s" do + before do + create(issuable, project_relation => project) - context 'the project has no merge requests', :js do - before do - visit merge_requests_group_path(group) - end + visit path + end - it 'should display an empty state' do - expect(page).to have_selector('.empty-state') - end + it 'does not display an empty state' do + expect(page).not_to have_selector('.empty-state') + end + end + + context "the project has no #{issuable_name}s", :js do + before do + visit path + end + + it 'displays an empty state' do + expect(page).to have_selector('.empty-state') + end + + it "shows a new #{issuable_name} button" do + within '.empty-state' do + expect(page).to have_content("create #{issuable_name}") + end + end + + it "the new #{issuable_name} button opens a project dropdown" do + within '.empty-state' do + find('.new-project-item-select-button').click + end - it 'should show a new merge request button' do - within '.empty-state' do - expect(page).to have_content('create merge request') + expect(page).to have_selector('.ajax-project-dropdown') + end end end - it 'the new merge request button opens a project dropdown' do - within '.empty-state' do - find('.new-project-item-select-button').click - end + context 'group without a project' do + context 'group has a subgroup', :nested_groups do + let(:subgroup) { create(:group, parent: group) } + let(:subgroup_project) { create(:project, namespace: subgroup) } - expect(page).to have_selector('.ajax-project-dropdown') - end - end - end + context "the project has #{issuable_name}s" do + before do + create(issuable, project_relation => subgroup_project) - context 'group without a project' do - before do - visit merge_requests_group_path(group) - end + visit path + end - it 'should display an empty state' do - expect(page).to have_selector('.empty-state') - end + it 'does not display an empty state' do + expect(page).not_to have_selector('.empty-state') + end + end - it 'should not show a new merge request button' do - within '.empty-state' do - expect(page).not_to have_link('create merge request') + context "the project has no #{issuable_name}s" do + before do + visit path + end + + it 'displays an empty state' do + expect(page).to have_selector('.empty-state') + end + end + end + + context 'group has no subgroups' do + before do + visit path + end + + it 'displays an empty state' do + expect(page).to have_selector('.empty-state') + end + + it "shows a new #{issuable_name} button" do + within '.empty-state' do + expect(page).not_to have_link("create #{issuable_name}") + end + end + end end end end -- cgit v1.2.1 From e82f629be4b9c91e2611095cd4296e487ed137ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9my=20Coutable?= Date: Fri, 16 Feb 2018 12:00:25 +0100 Subject: Move the #update action from Project/Member controllers to the MembershipActions concern MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Rémy Coutable --- spec/features/groups/members/manage_members.rb | 138 --------------------- .../features/groups/members/manage_members_spec.rb | 138 +++++++++++++++++++++ 2 files changed, 138 insertions(+), 138 deletions(-) delete mode 100644 spec/features/groups/members/manage_members.rb create mode 100644 spec/features/groups/members/manage_members_spec.rb (limited to 'spec/features/groups') diff --git a/spec/features/groups/members/manage_members.rb b/spec/features/groups/members/manage_members.rb deleted file mode 100644 index 21f7b4999ad..00000000000 --- a/spec/features/groups/members/manage_members.rb +++ /dev/null @@ -1,138 +0,0 @@ -require 'spec_helper' - -feature 'Groups > Members > Manage members' do - include Select2Helper - - let(:user1) { create(:user, name: 'John Doe') } - let(:user2) { create(:user, name: 'Mary Jane') } - let(:group) { create(:group) } - - background do - 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 'do not disclose email addresses', :js do - group.add_owner(user1) - create(:user, email: 'undisclosed_email@gitlab.com', name: "Jane 'invisible' Doe") - - visit group_group_members_path(group) - - find('.select2-container').click - select_input = find('.select2-input') - - select_input.send_keys('@gitlab.com') - wait_for_requests - - expect(page).to have_content('No matches found') - - select_input.native.clear - select_input.send_keys('undisclosed_email@gitlab.com') - wait_for_requests - - expect(page).to have_content("Jane 'invisible' Doe") - end - - scenario 'remove user from group', :js do - group.add_owner(user1) - group.add_developer(user2) - - visit group_group_members_path(group) - - accept_confirm do - find(:css, '.project-members-page li', text: user2.name).find(:css, 'a.btn-remove').click - end - - wait_for_requests - - 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 - - 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 - - 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_spec.rb b/spec/features/groups/members/manage_members_spec.rb new file mode 100644 index 00000000000..21f7b4999ad --- /dev/null +++ b/spec/features/groups/members/manage_members_spec.rb @@ -0,0 +1,138 @@ +require 'spec_helper' + +feature 'Groups > Members > Manage members' do + include Select2Helper + + let(:user1) { create(:user, name: 'John Doe') } + let(:user2) { create(:user, name: 'Mary Jane') } + let(:group) { create(:group) } + + background do + 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 'do not disclose email addresses', :js do + group.add_owner(user1) + create(:user, email: 'undisclosed_email@gitlab.com', name: "Jane 'invisible' Doe") + + visit group_group_members_path(group) + + find('.select2-container').click + select_input = find('.select2-input') + + select_input.send_keys('@gitlab.com') + wait_for_requests + + expect(page).to have_content('No matches found') + + select_input.native.clear + select_input.send_keys('undisclosed_email@gitlab.com') + wait_for_requests + + expect(page).to have_content("Jane 'invisible' Doe") + end + + scenario 'remove user from group', :js do + group.add_owner(user1) + group.add_developer(user2) + + visit group_group_members_path(group) + + accept_confirm do + find(:css, '.project-members-page li', text: user2.name).find(:css, 'a.btn-remove').click + end + + wait_for_requests + + 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 + + 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 + + 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.1