From 70261ff11c93dcad30b0f4b3b61c4289d0ae1bb3 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 14 Aug 2018 15:43:46 +0200 Subject: add users search results to global search --- spec/features/global_search_spec.rb | 18 ++++++++++++++++++ spec/lib/gitlab/search_results_spec.rb | 12 ++++++++++++ 2 files changed, 30 insertions(+) (limited to 'spec') diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb index d7692181453..9ecf2cab3b5 100644 --- a/spec/features/global_search_spec.rb +++ b/spec/features/global_search_spec.rb @@ -25,4 +25,22 @@ describe 'Global search' do expect(page).to have_selector('.gl-pagination .next') end end + + describe 'users search' do + it 'shows the found user under the Users tab' do + create(:user, username: 'gob_bluth', name: 'Gob Bluth') + + visit dashboard_projects_path + + fill_in 'search', with: 'gob' + click_button 'Go' + + expect(page).to have_content('Users 1') + + click_on('Users 1') + + expect(page).to have_content('Gob Bluth') + expect(page).to have_content('@gob_bluth') + end + end end diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb index 87288baedb0..3d14eebc2c1 100644 --- a/spec/lib/gitlab/search_results_spec.rb +++ b/spec/lib/gitlab/search_results_spec.rb @@ -121,6 +121,18 @@ describe Gitlab::SearchResults do results.objects('issues') end end + + describe '#users' do + it 'returns an empty array when the current_user is not allowed to read users list' do + expect(results.objects('users')).to be_empty + end + + it 'calls the UsersFinder' do + expect(UsersFinder).to receive(:new).with(user, search: 'foo').and_call_original + + results.objects('users') + end + end end it 'does not list issues on private projects' do -- cgit v1.2.1 From 22f44b50d8ece6cdb2d83cb8e2b1c5b51f01d70d Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 15 Aug 2018 13:53:23 +0200 Subject: add users search results to project scoped search --- spec/features/global_search_spec.rb | 18 -------- .../search/user_searches_for_users_spec.rb | 53 ++++++++++++++++++++++ spec/lib/gitlab/project_search_results_spec.rb | 16 +++++++ 3 files changed, 69 insertions(+), 18 deletions(-) create mode 100644 spec/features/search/user_searches_for_users_spec.rb (limited to 'spec') diff --git a/spec/features/global_search_spec.rb b/spec/features/global_search_spec.rb index 9ecf2cab3b5..d7692181453 100644 --- a/spec/features/global_search_spec.rb +++ b/spec/features/global_search_spec.rb @@ -25,22 +25,4 @@ describe 'Global search' do expect(page).to have_selector('.gl-pagination .next') end end - - describe 'users search' do - it 'shows the found user under the Users tab' do - create(:user, username: 'gob_bluth', name: 'Gob Bluth') - - visit dashboard_projects_path - - fill_in 'search', with: 'gob' - click_button 'Go' - - expect(page).to have_content('Users 1') - - click_on('Users 1') - - expect(page).to have_content('Gob Bluth') - expect(page).to have_content('@gob_bluth') - end - end end diff --git a/spec/features/search/user_searches_for_users_spec.rb b/spec/features/search/user_searches_for_users_spec.rb new file mode 100644 index 00000000000..ba4b66c78cb --- /dev/null +++ b/spec/features/search/user_searches_for_users_spec.rb @@ -0,0 +1,53 @@ +require 'spec_helper' + +describe 'User searches for users' do + context 'when on the dashboard' do + it 'finds the user' do + create(:user, username: 'gob_bluth', name: 'Gob Bluth') + + sign_in(create(:user)) + + visit dashboard_projects_path + + fill_in 'search', with: 'gob' + click_button 'Go' + + expect(page).to have_content('Users 1') + + click_on('Users 1') + + expect(page).to have_content('Gob Bluth') + expect(page).to have_content('@gob_bluth') + end + end + + context 'when on the project page' do + it 'finds the user belonging to the project' do + project = create(:project) + + user1 = create(:user, username: 'gob_bluth', name: 'Gob Bluth') + create(:project_member, :developer, user: user1, project: project) + + user2 = create(:user, username: 'michael_bluth', name: 'Michael Bluth') + create(:project_member, :developer, user: user2, project: project) + + create(:user, username: 'gob_2018', name: 'George Oscar Bluth') + + sign_in(user1) + + visit projects_path(project) + + fill_in 'search', with: 'gob' + click_button 'Go' + + expect(page).to have_content('Gob Bluth') + expect(page).to have_content('@gob_bluth') + + expect(page).not_to have_content('Michael Bluth') + expect(page).not_to have_content('@michael_bluth') + + expect(page).not_to have_content('George Oscar Bluth') + expect(page).not_to have_content('@gob_2018') + end + end +end diff --git a/spec/lib/gitlab/project_search_results_spec.rb b/spec/lib/gitlab/project_search_results_spec.rb index 6831274d37c..a5495184448 100644 --- a/spec/lib/gitlab/project_search_results_spec.rb +++ b/spec/lib/gitlab/project_search_results_spec.rb @@ -412,4 +412,20 @@ describe Gitlab::ProjectSearchResults do end end end + + describe 'user search' do + let(:project) { create(:project) } + + it 'returns the users belonging to the project matching the search query' do + user1 = create(:user, username: 'gob_bluth') + create(:project_member, :developer, user: user1, project: project) + + user2 = create(:user, username: 'michael_bluth') + create(:project_member, :developer, user: user2, project: project) + + create(:user, username: 'gob_2018') + + expect(described_class.new(user, project, 'gob').objects('users')).to eq [user1] + end + end end -- cgit v1.2.1 From 65df88c4907195ea789bd5b35ddde1305b7c199a Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 15 Aug 2018 13:56:24 +0200 Subject: move ability check from service class to view --- spec/lib/gitlab/search_results_spec.rb | 4 ---- 1 file changed, 4 deletions(-) (limited to 'spec') diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb index 3d14eebc2c1..1a42fd36de0 100644 --- a/spec/lib/gitlab/search_results_spec.rb +++ b/spec/lib/gitlab/search_results_spec.rb @@ -123,10 +123,6 @@ describe Gitlab::SearchResults do end describe '#users' do - it 'returns an empty array when the current_user is not allowed to read users list' do - expect(results.objects('users')).to be_empty - end - it 'calls the UsersFinder' do expect(UsersFinder).to receive(:new).with(user, search: 'foo').and_call_original -- cgit v1.2.1 From a8818bab76fe89bb8ab5960c614e2b734bd2c496 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 15 Aug 2018 15:25:17 +0200 Subject: add users search results to group scoped search --- .../search/user_searches_for_users_spec.rb | 30 +++++++++++++++++++++ spec/lib/gitlab/group_search_results_spec.rb | 31 ++++++++++++++++++++++ 2 files changed, 61 insertions(+) create mode 100644 spec/lib/gitlab/group_search_results_spec.rb (limited to 'spec') diff --git a/spec/features/search/user_searches_for_users_spec.rb b/spec/features/search/user_searches_for_users_spec.rb index ba4b66c78cb..3725143291d 100644 --- a/spec/features/search/user_searches_for_users_spec.rb +++ b/spec/features/search/user_searches_for_users_spec.rb @@ -50,4 +50,34 @@ describe 'User searches for users' do expect(page).not_to have_content('@gob_2018') end end + + context 'when on the group page' do + it 'finds the user belonging to the group' do + group = create(:group) + + user1 = create(:user, username: 'gob_bluth', name: 'Gob Bluth') + create(:group_member, :developer, user: user1, group: group) + + user2 = create(:user, username: 'michael_bluth', name: 'Michael Bluth') + create(:group_member, :developer, user: user2, group: group) + + create(:user, username: 'gob_2018', name: 'George Oscar Bluth') + + sign_in(user1) + + visit group_path(group) + + fill_in 'search', with: 'gob' + click_button 'Go' + + expect(page).to have_content('Gob Bluth') + expect(page).to have_content('@gob_bluth') + + expect(page).not_to have_content('Michael Bluth') + expect(page).not_to have_content('@michael_bluth') + + expect(page).not_to have_content('George Oscar Bluth') + expect(page).not_to have_content('@gob_2018') + end + end end diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb new file mode 100644 index 00000000000..22ea3ebb9a4 --- /dev/null +++ b/spec/lib/gitlab/group_search_results_spec.rb @@ -0,0 +1,31 @@ +require 'spec_helper' + +describe Gitlab::GroupSearchResults do + let(:user) { create(:user) } + + describe 'user search' do + let(:group) { create(:group) } + + it 'returns the users belonging to the group matching the search query' do + user1 = create(:user, username: 'gob_bluth') + create(:group_member, :developer, user: user1, group: group) + + user2 = create(:user, username: 'michael_bluth') + create(:group_member, :developer, user: user2, group: group) + + create(:user, username: 'gob_2018') + + expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [user1] + end + + it 'returns the user belonging to the subgroup matching the search query', :nested_groups do + user1 = create(:user, username: 'gob_bluth') + subgroup = create(:group, parent: group) + create(:group_member, :developer, user: user1, group: subgroup) + + create(:user, username: 'gob_2018') + + expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [user1] + end + end +end -- cgit v1.2.1 From 0592233a1add02c02a706ae1aa2f66661155146a Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 17 Sep 2018 14:54:32 +0200 Subject: add users search to search api --- spec/requests/api/search_spec.rb | 43 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'spec') diff --git a/spec/requests/api/search_spec.rb b/spec/requests/api/search_spec.rb index c48ca832c85..0f539fb6c60 100644 --- a/spec/requests/api/search_spec.rb +++ b/spec/requests/api/search_spec.rb @@ -77,6 +77,16 @@ describe API::Search do it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' end + context 'for users scope' do + before do + create(:user, name: 'billy') + + get api('/search', user), scope: 'users', search: 'billy' + end + + it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + end + context 'for snippet_titles scope' do before do create(:snippet, :public, title: 'awesome snippet', content: 'snippet content') @@ -192,6 +202,28 @@ describe API::Search do it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' end + + context 'for user scope' do + before do + user = create(:user, name: 'billy') + create(:group_member, :developer, user: user, group: group) + + get api("/groups/#{group.id}/search", user), scope: 'users', search: 'billy' + end + + it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + end + + context 'for users scope with group path as id' do + before do + user1 = create(:user, name: 'billy') + create(:group_member, :developer, user: user1, group: group) + + get api("/groups/#{CGI.escape(group.full_path)}/search", user), scope: 'users', search: 'billy' + end + + it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + end end end @@ -269,6 +301,17 @@ describe API::Search do it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' end + context 'for users scope' do + before do + user1 = create(:user, name: 'billy') + create(:project_member, :developer, user: user1, project: project) + + get api("/projects/#{project.id}/search", user), scope: 'users', search: 'billy' + end + + it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + end + context 'for notes scope' do before do create(:note_on_merge_request, project: project, note: 'awesome note') -- cgit v1.2.1 From d7a3e54be4af3206681b3e81c746e3f7c31f52e5 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 17 Sep 2018 17:37:20 +0200 Subject: only users from groups the current user has access --- spec/lib/gitlab/group_search_results_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'spec') diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb index 22ea3ebb9a4..a9f94038524 100644 --- a/spec/lib/gitlab/group_search_results_spec.rb +++ b/spec/lib/gitlab/group_search_results_spec.rb @@ -27,5 +27,15 @@ describe Gitlab::GroupSearchResults do expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [user1] end + + it 'does not return the user belonging to the private subgroup', :nested_groups do + user1 = create(:user, username: 'gob_bluth') + subgroup = create(:group, :private, parent: group) + create(:group_member, :developer, user: user1, group: subgroup) + + create(:user, username: 'gob_2018') + + expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [] + end end end -- cgit v1.2.1 From 241f38b01d6ba3fdbed0a1f8b74b354441d79fb2 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 11 Dec 2018 13:25:52 +0100 Subject: project's user search includes group members too --- spec/lib/gitlab/project_search_results_spec.rb | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/lib/gitlab/project_search_results_spec.rb b/spec/lib/gitlab/project_search_results_spec.rb index a5495184448..4a41d5cf51e 100644 --- a/spec/lib/gitlab/project_search_results_spec.rb +++ b/spec/lib/gitlab/project_search_results_spec.rb @@ -414,9 +414,9 @@ describe Gitlab::ProjectSearchResults do end describe 'user search' do - let(:project) { create(:project) } + it 'returns the user belonging to the project matching the search query' do + project = create(:project) - it 'returns the users belonging to the project matching the search query' do user1 = create(:user, username: 'gob_bluth') create(:project_member, :developer, user: user1, project: project) @@ -425,7 +425,23 @@ describe Gitlab::ProjectSearchResults do create(:user, username: 'gob_2018') - expect(described_class.new(user, project, 'gob').objects('users')).to eq [user1] + result = described_class.new(user, project, 'gob').objects('users') + + expect(result).to eq [user1] + end + + it 'returns the user belonging to the group matching the search query' do + group = create(:group) + project = create(:project, namespace: group) + + user1 = create(:user, username: 'gob_bluth') + create(:group_member, :developer, user: user1, group: group) + + create(:user, username: 'gob_2018') + + result = described_class.new(user, project, 'gob').objects('users') + + expect(result).to eq [user1] end end end -- cgit v1.2.1 From 3b01d23af0a17e269bbd39eab0d54b55d9b84b3e Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 11 Dec 2018 14:05:49 +0100 Subject: spec for group's user search incl. parent group --- spec/lib/gitlab/group_search_results_spec.rb | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) (limited to 'spec') diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb index a9f94038524..02245ca88dc 100644 --- a/spec/lib/gitlab/group_search_results_spec.rb +++ b/spec/lib/gitlab/group_search_results_spec.rb @@ -15,7 +15,9 @@ describe Gitlab::GroupSearchResults do create(:user, username: 'gob_2018') - expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [user1] + result = described_class.new(user, anything, group, 'gob').objects('users') + + expect(result).to eq [user1] end it 'returns the user belonging to the subgroup matching the search query', :nested_groups do @@ -25,7 +27,21 @@ describe Gitlab::GroupSearchResults do create(:user, username: 'gob_2018') - expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [user1] + result = described_class.new(user, anything, group, 'gob').objects('users') + + expect(result).to eq [user1] + end + + it 'returns the user belonging to the parent group matching the search query', :nested_groups do + user1 = create(:user, username: 'gob_bluth') + parent_group = create(:group, children: [group]) + create(:group_member, :developer, user: user1, group: parent_group) + + create(:user, username: 'gob_2018') + + result = described_class.new(user, anything, group, 'gob').objects('users') + + expect(result).to eq [user1] end it 'does not return the user belonging to the private subgroup', :nested_groups do @@ -35,7 +51,9 @@ describe Gitlab::GroupSearchResults do create(:user, username: 'gob_2018') - expect(described_class.new(user, anything, group, 'gob').objects('users')).to eq [] + result = described_class.new(user, anything, group, 'gob').objects('users') + + expect(result).to eq [] end end end -- cgit v1.2.1 From db0cf709703f0cc344351d2a8fd28d7d51046296 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 17 Dec 2018 14:30:49 +0100 Subject: restrict user result set by the scoped group --- spec/lib/gitlab/group_search_results_spec.rb | 10 ++++++++++ 1 file changed, 10 insertions(+) (limited to 'spec') diff --git a/spec/lib/gitlab/group_search_results_spec.rb b/spec/lib/gitlab/group_search_results_spec.rb index 02245ca88dc..2734fcef0a0 100644 --- a/spec/lib/gitlab/group_search_results_spec.rb +++ b/spec/lib/gitlab/group_search_results_spec.rb @@ -55,5 +55,15 @@ describe Gitlab::GroupSearchResults do expect(result).to eq [] end + + it 'does not return the user belonging to an unrelated group' do + user = create(:user, username: 'gob_bluth') + unrelated_group = create(:group) + create(:group_member, :developer, user: user, group: unrelated_group) + + result = described_class.new(user, anything, group, 'gob').objects('users') + + expect(result).to eq [] + end end end -- cgit v1.2.1 From 4c684a8d5c5432a720577486451830f085994fd3 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 18 Dec 2018 13:51:26 +0100 Subject: check ability for user search results --- spec/lib/gitlab/search_results_spec.rb | 8 ++++++++ 1 file changed, 8 insertions(+) (limited to 'spec') diff --git a/spec/lib/gitlab/search_results_spec.rb b/spec/lib/gitlab/search_results_spec.rb index 1a42fd36de0..4b57eecff93 100644 --- a/spec/lib/gitlab/search_results_spec.rb +++ b/spec/lib/gitlab/search_results_spec.rb @@ -123,6 +123,14 @@ describe Gitlab::SearchResults do end describe '#users' do + it 'does not call the UsersFinder when the current_user is not allowed to read users list' do + allow(Ability).to receive(:allowed?).and_return(false) + + expect(UsersFinder).not_to receive(:new).with(user, search: 'foo').and_call_original + + results.objects('users') + end + it 'calls the UsersFinder' do expect(UsersFinder).to receive(:new).with(user, search: 'foo').and_call_original -- cgit v1.2.1 From b0981097c302dd04df23ec557b4dcce5c952f2bf Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 17 Jan 2019 19:27:20 +0100 Subject: return 400 on users search and feature is disabled as the params block is evaluated when loading the class and the db connection is not available yet we can't use the feature toggle inside that block. --- spec/requests/api/search_spec.rb | 46 +++++++++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 5 deletions(-) (limited to 'spec') diff --git a/spec/requests/api/search_spec.rb b/spec/requests/api/search_spec.rb index 0f539fb6c60..49672591b3b 100644 --- a/spec/requests/api/search_spec.rb +++ b/spec/requests/api/search_spec.rb @@ -81,10 +81,22 @@ describe API::Search do before do create(:user, name: 'billy') - get api('/search', user), scope: 'users', search: 'billy' + get api('/search', user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + + context 'when users search feature is disabled' do + before do + allow(Feature).to receive(:disabled?).with(:users_search, default_enabled: true).and_return(true) + + get api('/search', user), params: { scope: 'users', search: 'billy' } + end + + it 'returns 400 error' do + expect(response).to have_gitlab_http_status(400) + end + end end context 'for snippet_titles scope' do @@ -203,15 +215,27 @@ describe API::Search do it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' end - context 'for user scope' do + context 'for users scope' do before do user = create(:user, name: 'billy') create(:group_member, :developer, user: user, group: group) - get api("/groups/#{group.id}/search", user), scope: 'users', search: 'billy' + get api("/groups/#{group.id}/search", user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + + context 'when users search feature is disabled' do + before do + allow(Feature).to receive(:disabled?).with(:users_search, default_enabled: true).and_return(true) + + get api("/groups/#{group.id}/search", user), params: { scope: 'users', search: 'billy' } + end + + it 'returns 400 error' do + expect(response).to have_gitlab_http_status(400) + end + end end context 'for users scope with group path as id' do @@ -219,7 +243,7 @@ describe API::Search do user1 = create(:user, name: 'billy') create(:group_member, :developer, user: user1, group: group) - get api("/groups/#{CGI.escape(group.full_path)}/search", user), scope: 'users', search: 'billy' + get api("/groups/#{CGI.escape(group.full_path)}/search", user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' @@ -306,10 +330,22 @@ describe API::Search do user1 = create(:user, name: 'billy') create(:project_member, :developer, user: user1, project: project) - get api("/projects/#{project.id}/search", user), scope: 'users', search: 'billy' + get api("/projects/#{project.id}/search", user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + + context 'when users search feature is disabled' do + before do + allow(Feature).to receive(:disabled?).with(:users_search, default_enabled: true).and_return(true) + + get api("/projects/#{project.id}/search", user), params: { scope: 'users', search: 'billy' } + end + + it 'returns 400 error' do + expect(response).to have_gitlab_http_status(400) + end + end end context 'for notes scope' do -- cgit v1.2.1