summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSean McGivern <sean@mcgivern.me.uk>2017-07-14 16:41:11 +0000
committerSean McGivern <sean@mcgivern.me.uk>2017-07-14 16:41:11 +0000
commit0f393724e7de8d764577b6622ccf43964539cb2b (patch)
treef192f64badd0ab5b662c50a2ace3b49f349da5b9
parente318afbed70da9780c5deeb735f6acc8ab9327a1 (diff)
parent574b3efd6bfe7df64ec704844f2619c547731aa6 (diff)
downloadgitlab-ce-0f393724e7de8d764577b6622ccf43964539cb2b.tar.gz
Merge branch 'fix-exact-matches-of-username-and-email-on-top-of-the-user-search' into 'master'
Fixes the user order being overriden in the autocomplete controller See merge request !12868
-rw-r--r--app/controllers/autocomplete_controller.rb4
-rw-r--r--app/models/user.rb2
-rw-r--r--changelogs/unreleased/fix-exact-matches-of-username-and-email-on-top-of-the-user-search.yml4
-rw-r--r--spec/controllers/autocomplete_controller_spec.rb15
-rw-r--r--spec/models/user_spec.rb6
5 files changed, 25 insertions, 6 deletions
diff --git a/app/controllers/autocomplete_controller.rb b/app/controllers/autocomplete_controller.rb
index fe331a883c1..3120916c5bb 100644
--- a/app/controllers/autocomplete_controller.rb
+++ b/app/controllers/autocomplete_controller.rb
@@ -5,10 +5,10 @@ class AutocompleteController < ApplicationController
def users
@users ||= User.none
- @users = @users.search(params[:search]) if params[:search].present?
- @users = @users.where.not(id: params[:skip_users]) if params[:skip_users].present?
@users = @users.active
@users = @users.reorder(:name)
+ @users = @users.search(params[:search]) if params[:search].present?
+ @users = @users.where.not(id: params[:skip_users]) if params[:skip_users].present?
@users = @users.page(params[:page]).per(params[:per_page])
if params[:todo_filter].present? && current_user
diff --git a/app/models/user.rb b/app/models/user.rb
index dd1a391773a..8f40af24e20 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -314,7 +314,7 @@ class User < ActiveRecord::Base
table[:name].matches(pattern)
.or(table[:email].matches(pattern))
.or(table[:username].matches(pattern))
- ).reorder(order % { query: ActiveRecord::Base.connection.quote(query) }, id: :desc)
+ ).reorder(order % { query: ActiveRecord::Base.connection.quote(query) }, :name)
end
# searches user by given pattern
diff --git a/changelogs/unreleased/fix-exact-matches-of-username-and-email-on-top-of-the-user-search.yml b/changelogs/unreleased/fix-exact-matches-of-username-and-email-on-top-of-the-user-search.yml
new file mode 100644
index 00000000000..2e0573beab6
--- /dev/null
+++ b/changelogs/unreleased/fix-exact-matches-of-username-and-email-on-top-of-the-user-search.yml
@@ -0,0 +1,4 @@
+---
+title: Exact matches of username and email are now on top of the user search
+merge_request: 12868
+author:
diff --git a/spec/controllers/autocomplete_controller_spec.rb b/spec/controllers/autocomplete_controller_spec.rb
index b40f647644d..58486f33229 100644
--- a/spec/controllers/autocomplete_controller_spec.rb
+++ b/spec/controllers/autocomplete_controller_spec.rb
@@ -97,6 +97,21 @@ describe AutocompleteController do
it { expect(body.size).to eq User.count }
end
+ context 'user order' do
+ it 'shows exact matches first' do
+ reported_user = create(:user, username: 'reported_user', name: 'Doug')
+ user = create(:user, username: 'user', name: 'User')
+ user1 = create(:user, username: 'user1', name: 'Ian')
+
+ sign_in(user)
+ get(:users, search: 'user')
+
+ response_usernames = JSON.parse(response.body).map { |user| user['username'] }
+
+ expect(response_usernames.take(3)).to match_array([user.username, reported_user.username, user1.username])
+ end
+ end
+
context 'limited users per page' do
let(:per_page) { 2 }
diff --git a/spec/models/user_spec.rb b/spec/models/user_spec.rb
index c614df8e98a..69f2570eec2 100644
--- a/spec/models/user_spec.rb
+++ b/spec/models/user_spec.rb
@@ -763,7 +763,7 @@ describe User, models: true do
end
it 'returns users with a partially matching name' do
- expect(described_class.search(user.name[0..2])).to eq([user2, user])
+ expect(described_class.search(user.name[0..2])).to eq([user, user2])
end
it 'returns users with a matching name regardless of the casing' do
@@ -777,7 +777,7 @@ describe User, models: true do
end
it 'returns users with a partially matching Email' do
- expect(described_class.search(user.email[0..2])).to eq([user2, user])
+ expect(described_class.search(user.email[0..2])).to eq([user, user2])
end
it 'returns users with a matching Email regardless of the casing' do
@@ -791,7 +791,7 @@ describe User, models: true do
end
it 'returns users with a partially matching username' do
- expect(described_class.search(user.username[0..2])).to eq([user2, user])
+ expect(described_class.search(user.username[0..2])).to eq([user, user2])
end
it 'returns users with a matching username regardless of the casing' do