diff options
author | Jan Provaznik <jprovaznik@gitlab.com> | 2019-07-16 11:47:30 +0200 |
---|---|---|
committer | Jan Provaznik <jprovaznik@gitlab.com> | 2019-07-19 18:28:37 +0200 |
commit | f3125faaf021e13adda26a866092da7acfd7b989 (patch) | |
tree | a6f0cc57231024d4d61046cbc5e9ac0d4987ee28 | |
parent | 70735ead43ea9a24bbbed85509f75f3790b0dde5 (diff) | |
download | gitlab-ce-jprovazn-project-search.tar.gz |
Reorder autocompleted projects by namejprovazn-project-search
Ordering projects by name instead of id should make sure that
more accurate results (exact matches primarily) are returned
in the limited list.
-rw-r--r-- | app/finders/autocomplete/move_to_project_finder.rb | 3 | ||||
-rw-r--r-- | app/models/project.rb | 1 | ||||
-rw-r--r-- | changelogs/unreleased/jprovazn-project-search.yml | 5 | ||||
-rw-r--r-- | spec/finders/autocomplete/move_to_project_finder_spec.rb | 25 |
4 files changed, 20 insertions, 14 deletions
diff --git a/app/finders/autocomplete/move_to_project_finder.rb b/app/finders/autocomplete/move_to_project_finder.rb index 90ec1a4bc9c..491cce2232e 100644 --- a/app/finders/autocomplete/move_to_project_finder.rb +++ b/app/finders/autocomplete/move_to_project_finder.rb @@ -28,8 +28,7 @@ module Autocomplete .optionally_search(search) .excluding_project(project_id) .eager_load_namespace_and_owner - .limit(LIMIT) - .to_a + .sorted_by_name_asc_limited(LIMIT) end end end diff --git a/app/models/project.rb b/app/models/project.rb index 3c490b6da00..f36c9c9abda 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -357,6 +357,7 @@ class Project < ApplicationRecord scope :sorted_by_activity, -> { reorder(Arel.sql("GREATEST(COALESCE(last_activity_at, '1970-01-01'), COALESCE(last_repository_updated_at, '1970-01-01')) DESC")) } scope :sorted_by_stars_desc, -> { reorder(star_count: :desc) } scope :sorted_by_stars_asc, -> { reorder(star_count: :asc) } + scope :sorted_by_name_asc_limited, ->(limit) { reorder(name: :asc).limit(limit) } scope :in_namespace, ->(namespace_ids) { where(namespace_id: namespace_ids) } scope :personal, ->(user) { where(namespace_id: user.namespace_id) } diff --git a/changelogs/unreleased/jprovazn-project-search.yml b/changelogs/unreleased/jprovazn-project-search.yml new file mode 100644 index 00000000000..f76d4858924 --- /dev/null +++ b/changelogs/unreleased/jprovazn-project-search.yml @@ -0,0 +1,5 @@ +--- +title: Order projects in 'Move issue' dropdown by name. +merge_request: 30778 +author: +type: fixed diff --git a/spec/finders/autocomplete/move_to_project_finder_spec.rb b/spec/finders/autocomplete/move_to_project_finder_spec.rb index e288f4e1fc6..4a87b47bd08 100644 --- a/spec/finders/autocomplete/move_to_project_finder_spec.rb +++ b/spec/finders/autocomplete/move_to_project_finder_spec.rb @@ -6,9 +6,9 @@ describe Autocomplete::MoveToProjectFinder do let(:no_access_project) { create(:project) } let(:guest_project) { create(:project) } - let(:reporter_project) { create(:project) } - let(:developer_project) { create(:project) } - let(:maintainer_project) { create(:project) } + let(:reporter_project) { create(:project, name: 'name') } + let(:developer_project) { create(:project, name: 'name2') } + let(:maintainer_project) { create(:project, name: 'name3') } describe '#execute' do context 'filter' do @@ -20,14 +20,14 @@ describe Autocomplete::MoveToProjectFinder do expect(finder.execute).to be_empty end - it 'returns projects equal or above Gitlab::Access::REPORTER ordered by id in descending order' do + it 'returns projects equal or above Gitlab::Access::REPORTER ordered by name' do reporter_project.add_reporter(user) developer_project.add_developer(user) maintainer_project.add_maintainer(user) finder = described_class.new(user, project_id: project.id) - expect(finder.execute.to_a).to eq([maintainer_project, developer_project, reporter_project]) + expect(finder.execute.to_a).to eq([reporter_project, developer_project, maintainer_project]) end it 'does not include the source project' do @@ -60,31 +60,32 @@ describe Autocomplete::MoveToProjectFinder do expect(finder.execute.to_a).to eq([other_reporter_project]) end - it 'returns a page of projects ordered by id in descending order' do - allow(Kaminari.config).to receive(:default_per_page).and_return(2) + it 'returns a page of projects ordered by name' do + stub_const('Autocomplete::MoveToProjectFinder::LIMIT', 2) - projects = create_list(:project, 2) do |project| + projects = create_list(:project, 3) do |project| project.add_developer(user) end finder = described_class.new(user, project_id: project.id) page = finder.execute.to_a - expect(page.length).to eq(Kaminari.config.default_per_page) - expect(page[0]).to eq(projects.last) + expected_projects = projects.sort_by(&:name).first(2) + expect(page.length).to eq(2) + expect(page).to eq(expected_projects) end end context 'search' do it 'returns projects matching a search query' do - foo_project = create(:project) + foo_project = create(:project, name: 'foo') foo_project.add_maintainer(user) wadus_project = create(:project, name: 'wadus') wadus_project.add_maintainer(user) expect(described_class.new(user, project_id: project.id).execute.to_a) - .to eq([wadus_project, foo_project]) + .to eq([foo_project, wadus_project]) expect(described_class.new(user, project_id: project.id, search: 'wadus').execute.to_a) .to eq([wadus_project]) |