diff --git a/app/services/search/project_service.rb b/app/services/search/project_service.rb index f223c8be103..0d82c5cd5b2 100644 --- a/app/services/search/project_service.rb +++ b/app/services/search/project_service.rb @@ -16,7 +16,7 @@ module Search end def scope - @scope ||= %w[notes issues merge_requests milestones wiki_blobs commits].delete(params[:scope]) { 'blobs' } + @scope ||= %w[notes issues merge_requests milestones wiki_blobs commits users].delete(params[:scope]) { 'blobs' } end end end diff --git a/app/views/search/_category.html.haml b/app/views/search/_category.html.haml index 65c1a30716b..79923aeeebf 100644 --- a/app/views/search/_category.html.haml +++ b/app/views/search/_category.html.haml @@ -45,6 +45,12 @@ = _("Commits") %span.badge.badge-pill = @search_results.commits_count + - if can?(current_user, :read_users_list) + %li{ class: active_when(@scope == 'users') } + = link_to search_filter_path(scope: 'users') do + Users + %span.badge.badge-pill + = limited_count(@search_results.limited_users_count) - elsif @show_snippets %li{ class: active_when(@scope == 'snippet_blobs') } diff --git a/lib/gitlab/project_search_results.rb b/lib/gitlab/project_search_results.rb index a68f8801c2a..0957d1b6149 100644 --- a/lib/gitlab/project_search_results.rb +++ b/lib/gitlab/project_search_results.rb @@ -22,11 +22,17 @@ module Gitlab paginated_blobs(wiki_blobs, page) when 'commits' Kaminari.paginate_array(commits).page(page).per(per_page) + when 'users' + users.page(page).per(per_page) else super(scope, page, false) end end + def users + super.where(id: @project.users) + end + def blobs_count @blobs_count ||= blobs.count end 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