summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJarka Kadlecová <jarka@gitlab.com>2018-07-03 14:23:21 +0200
committerJarka Kadlecová <jarka@gitlab.com>2018-07-03 14:23:21 +0200
commitaa127d93944227b2ba93b943130f96fdc59bd0bd (patch)
tree3d53806f88e933adb24b5f987f31af702430343f
parent48f4ccd31169555d66fed277f30f0001e9b18f4f (diff)
downloadgitlab-ce-45915-search-api-pagination.tar.gz
User per_page param properly in Search services45915-search-api-pagination
-rw-r--r--app/services/search/global_service.rb2
-rw-r--r--app/services/search/project_service.rb3
-rw-r--r--app/services/search/snippet_service.rb2
-rw-r--r--lib/gitlab/snippet_search_results.rb3
-rw-r--r--spec/services/search_service_spec.rb101
5 files changed, 107 insertions, 4 deletions
diff --git a/app/services/search/global_service.rb b/app/services/search/global_service.rb
index 92a32e703af..944f50201cd 100644
--- a/app/services/search/global_service.rb
+++ b/app/services/search/global_service.rb
@@ -10,7 +10,7 @@ module Search
def execute
Gitlab::SearchResults.new(current_user, projects, params[:search],
- default_project_filter: default_project_filter)
+ default_project_filter: default_project_filter, per_page: params[:per_page])
end
def projects
diff --git a/app/services/search/project_service.rb b/app/services/search/project_service.rb
index 9a22abae635..bddd192e6c3 100644
--- a/app/services/search/project_service.rb
+++ b/app/services/search/project_service.rb
@@ -10,7 +10,8 @@ module Search
Gitlab::ProjectSearchResults.new(current_user,
project,
params[:search],
- params[:repository_ref])
+ params[:repository_ref],
+ per_page: params[:per_page])
end
def scope
diff --git a/app/services/search/snippet_service.rb b/app/services/search/snippet_service.rb
index 85da0be6fff..e3e23f64176 100644
--- a/app/services/search/snippet_service.rb
+++ b/app/services/search/snippet_service.rb
@@ -9,7 +9,7 @@ module Search
def execute
snippets = SnippetsFinder.new(current_user).execute
- Gitlab::SnippetSearchResults.new(snippets, params[:search])
+ Gitlab::SnippetSearchResults.new(snippets, params[:search], per_page: params[:per_page])
end
def scope
diff --git a/lib/gitlab/snippet_search_results.rb b/lib/gitlab/snippet_search_results.rb
index 4f86b3e8f73..8a04f63bc2f 100644
--- a/lib/gitlab/snippet_search_results.rb
+++ b/lib/gitlab/snippet_search_results.rb
@@ -4,9 +4,10 @@ module Gitlab
attr_reader :limit_snippets
- def initialize(limit_snippets, query)
+ def initialize(limit_snippets, query, per_page: 20)
@limit_snippets = limit_snippets
@query = query
+ @per_page = per_page
end
def objects(scope, page = nil)
diff --git a/spec/services/search_service_spec.rb b/spec/services/search_service_spec.rb
index 02de83a2df8..e5220022cb4 100644
--- a/spec/services/search_service_spec.rb
+++ b/spec/services/search_service_spec.rb
@@ -235,6 +235,31 @@ describe SearchService do
end
describe '#search_objects' do
+ # this shared example expects 3 results to be returned, can be overrided
+ shared_examples 'pagination' do |params|
+ let(:results_count) { 3 }
+ let(:last_page_count) { 1 }
+
+ def search(per_page: nil, page: nil)
+ params[:per_page] = per_page if per_page
+ params[:page] = page if page
+
+ described_class.new(user, params).search_objects
+ end
+
+ it 'returns all 3 objects with default params' do
+ expect(search.count).to eq(results_count)
+ end
+
+ it 'returns correct count of results ' do
+ expect(search(per_page: 2).count).to eq(2)
+ end
+
+ it 'returns correct result page' do
+ expect(search(per_page: 2, page: 2).count).to eq(last_page_count)
+ end
+ end
+
context 'with accessible project_id' do
it 'returns objects in the project' do
search_objects = described_class.new(
@@ -245,6 +270,26 @@ describe SearchService do
expect(search_objects.first).to eq note
end
+
+ context 'pagination' do
+ before do
+ [
+ create(:note_on_issue, project: accessible_project, note: 'simple note'),
+ create(:note_on_issue, project: accessible_project, note: 'some simple note'),
+ create(:note_on_issue, project: accessible_project, note: 'non simple note')
+ ]
+ end
+
+ let(:params) do
+ {
+ project_id: accessible_project.id,
+ scope: 'notes',
+ search: 'simple'
+ }
+ end
+
+ include_examples 'pagination'
+ end
end
context 'with accessible project_id and \'true\' snippets' do
@@ -269,6 +314,25 @@ describe SearchService do
expect(search_objects.first).to eq snippet
end
+
+ context 'pagination' do
+ before do
+ [
+ create(:snippet, author: user, content: 'simple snippet'),
+ create(:snippet, author: user, content: 'some simple snippet'),
+ create(:snippet, author: user, content: 'non simple snippet')
+ ]
+ end
+
+ let(:params) do
+ {
+ snippets: 'true',
+ search: 'simple'
+ }
+ end
+
+ include_examples 'pagination'
+ end
end
context 'with accessible group_id' do
@@ -280,6 +344,25 @@ describe SearchService do
expect(search_objects.first).to eq group_project
end
+
+ context 'pagination' do
+ before do
+ [
+ create(:project, group: accessible_group, name: 'group_project1'),
+ create(:project, group: accessible_group, name: 'group_project2'),
+ create(:project, group: accessible_group, name: 'group_project3')
+ ]
+ end
+
+ let(:params) do
+ {
+ group_id: accessible_group.id,
+ search: 'group'
+ }
+ end
+
+ include_examples 'pagination'
+ end
end
context 'with no project_id, group_id or snippets' do
@@ -290,6 +373,24 @@ describe SearchService do
expect(search_objects.first).to eq public_project
end
+
+ context 'pagination' do
+ before do
+ [
+ create(:project, :public, name: 'public_project1'),
+ create(:project, :public, name: 'public_project2'),
+ create(:project, :public, name: 'public_project3')
+ ]
+ end
+
+ let(:params) do
+ {
+ search: 'public'
+ }
+ end
+
+ include_examples 'pagination'
+ end
end
end
end