diff options
Diffstat (limited to 'spec/requests/api/search_spec.rb')
-rw-r--r-- | spec/requests/api/search_spec.rb | 252 |
1 files changed, 201 insertions, 51 deletions
diff --git a/spec/requests/api/search_spec.rb b/spec/requests/api/search_spec.rb index 6ff5fbd7925..3894e0bf2d1 100644 --- a/spec/requests/api/search_spec.rb +++ b/spec/requests/api/search_spec.rb @@ -15,10 +15,36 @@ describe API::Search do it { expect(json_response.size).to eq(size) } end - describe 'GET /search' do + shared_examples 'pagination' do |scope:, search: ''| + it 'returns a different result for each page' do + get api(endpoint, user), params: { scope: scope, search: search, page: 1, per_page: 1 } + first = json_response.first + + get api(endpoint, user), params: { scope: scope, search: search, page: 2, per_page: 1 } + second = Gitlab::Json.parse(response.body).first + + expect(first).not_to eq(second) + end + + it 'returns 1 result when per_page is 1' do + get api(endpoint, user), params: { scope: scope, search: search, per_page: 1 } + + expect(json_response.count).to eq(1) + end + + it 'returns 2 results when per_page is 2' do + get api(endpoint, user), params: { scope: scope, search: search, per_page: 2 } + + expect(Gitlab::Json.parse(response.body).count).to eq(2) + end + end + + describe 'GET /search' do + let(:endpoint) { '/search' } + context 'when user is not authenticated' do it 'returns 401 error' do - get api('/search'), params: { scope: 'projects', search: 'awesome' } + get api(endpoint), params: { scope: 'projects', search: 'awesome' } expect(response).to have_gitlab_http_status(:unauthorized) end @@ -26,7 +52,7 @@ describe API::Search do context 'when scope is not supported' do it 'returns 400 error' do - get api('/search', user), params: { scope: 'unsupported', search: 'awesome' } + get api(endpoint, user), params: { scope: 'unsupported', search: 'awesome' } expect(response).to have_gitlab_http_status(:bad_request) end @@ -34,7 +60,7 @@ describe API::Search do context 'when scope is missing' do it 'returns 400 error' do - get api('/search', user), params: { search: 'awesome' } + get api(endpoint, user), params: { search: 'awesome' } expect(response).to have_gitlab_http_status(:bad_request) end @@ -43,30 +69,48 @@ describe API::Search do context 'with correct params' do context 'for projects scope' do before do - get api('/search', user), params: { scope: 'projects', search: 'awesome' } + get api(endpoint, user), params: { scope: 'projects', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/projects' + + it_behaves_like 'pagination', scope: :projects end context 'for issues scope' do before do create(:issue, project: project, title: 'awesome issue') - get api('/search', user), params: { scope: 'issues', search: 'awesome' } + get api(endpoint, user), params: { scope: 'issues', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/issues' + + describe 'pagination' do + before do + create(:issue, project: project, title: 'another issue') + end + + include_examples 'pagination', scope: :issues + end end context 'for merge_requests scope' do before do create(:merge_request, source_project: repo_project, title: 'awesome mr') - get api('/search', user), params: { scope: 'merge_requests', search: 'awesome' } + get api(endpoint, user), params: { scope: 'merge_requests', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/merge_requests' + + describe 'pagination' do + before do + create(:merge_request, source_project: repo_project, title: 'another mr', target_branch: 'another_branch') + end + + include_examples 'pagination', scope: :merge_requests + end end context 'for milestones scope' do @@ -76,10 +120,18 @@ describe API::Search do context 'when user can read project milestones' do before do - get api('/search', user), params: { scope: 'milestones', search: 'awesome' } + get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' + + describe 'pagination' do + before do + create(:milestone, project: project, title: 'another milestone') + end + + include_examples 'pagination', scope: :milestones + end end context 'when user cannot read project milestones' do @@ -89,7 +141,7 @@ describe API::Search do end it 'returns empty array' do - get api('/search', user), params: { scope: 'milestones', search: 'awesome' } + get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' } milestones = json_response @@ -102,16 +154,18 @@ describe API::Search do before do create(:user, name: 'billy') - get api('/search', user), params: { scope: 'users', search: 'billy' } + get api(endpoint, user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + it_behaves_like 'pagination', scope: :users + context 'when users search feature is disabled' do before do - allow(Feature).to receive(:disabled?).with(:users_search, default_enabled: true).and_return(true) + stub_feature_flags(users_search: false) - get api('/search', user), params: { scope: 'users', search: 'billy' } + get api(endpoint, user), params: { scope: 'users', search: 'billy' } end it 'returns 400 error' do @@ -124,28 +178,28 @@ describe API::Search do before do create(:snippet, :public, title: 'awesome snippet', content: 'snippet content') - get api('/search', user), params: { scope: 'snippet_titles', search: 'awesome' } + get api(endpoint, user), params: { scope: 'snippet_titles', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/snippets' - end - context 'for snippet_blobs scope' do - before do - create(:snippet, :public, title: 'awesome snippet', content: 'snippet content') + describe 'pagination' do + before do + create(:snippet, :public, title: 'another snippet', content: 'snippet content') + end - get api('/search', user), params: { scope: 'snippet_blobs', search: 'content' } + include_examples 'pagination', scope: :snippet_titles end - - it_behaves_like 'response is correct', schema: 'public_api/v4/snippets' end end end describe "GET /groups/:id/search" do + let(:endpoint) { "/groups/#{group.id}/-/search" } + context 'when user is not authenticated' do it 'returns 401 error' do - get api("/groups/#{group.id}/search"), params: { scope: 'projects', search: 'awesome' } + get api(endpoint), params: { scope: 'projects', search: 'awesome' } expect(response).to have_gitlab_http_status(:unauthorized) end @@ -153,7 +207,7 @@ describe API::Search do context 'when scope is not supported' do it 'returns 400 error' do - get api("/groups/#{group.id}/search", user), params: { scope: 'unsupported', search: 'awesome' } + get api(endpoint, user), params: { scope: 'unsupported', search: 'awesome' } expect(response).to have_gitlab_http_status(:bad_request) end @@ -161,7 +215,7 @@ describe API::Search do context 'when scope is missing' do it 'returns 400 error' do - get api("/groups/#{group.id}/search", user), params: { search: 'awesome' } + get api(endpoint, user), params: { search: 'awesome' } expect(response).to have_gitlab_http_status(:bad_request) end @@ -188,40 +242,66 @@ describe API::Search do context 'with correct params' do context 'for projects scope' do before do - get api("/groups/#{group.id}/search", user), params: { scope: 'projects', search: 'awesome' } + get api(endpoint, user), params: { scope: 'projects', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/projects' + + it_behaves_like 'pagination', scope: :projects end context 'for issues scope' do before do create(:issue, project: project, title: 'awesome issue') - get api("/groups/#{group.id}/search", user), params: { scope: 'issues', search: 'awesome' } + get api(endpoint, user), params: { scope: 'issues', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/issues' + + describe 'pagination' do + before do + create(:issue, project: project, title: 'another issue') + end + + include_examples 'pagination', scope: :issues + end end context 'for merge_requests scope' do before do create(:merge_request, source_project: repo_project, title: 'awesome mr') - get api("/groups/#{group.id}/search", user), params: { scope: 'merge_requests', search: 'awesome' } + get api(endpoint, user), params: { scope: 'merge_requests', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/merge_requests' + + describe 'pagination' do + before do + create(:merge_request, source_project: repo_project, title: 'another mr', target_branch: 'another_branch') + end + + include_examples 'pagination', scope: :merge_requests + end end context 'for milestones scope' do before do create(:milestone, project: project, title: 'awesome milestone') - get api("/groups/#{group.id}/search", user), params: { scope: 'milestones', search: 'awesome' } + get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' + + describe 'pagination' do + before do + create(:milestone, project: project, title: 'another milestone') + end + + include_examples 'pagination', scope: :milestones + end end context 'for milestones scope with group path as id' do @@ -241,16 +321,24 @@ describe API::Search do user = create(:user, name: 'billy') create(:group_member, :developer, user: user, group: group) - get api("/groups/#{group.id}/search", user), params: { scope: 'users', search: 'billy' } + get api(endpoint, user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + describe 'pagination' do + before do + create(:group_member, :developer, group: group) + end + + include_examples 'pagination', scope: :users + end + context 'when users search feature is disabled' do before do - allow(Feature).to receive(:disabled?).with(:users_search, default_enabled: true).and_return(true) + stub_feature_flags(users_search: false) - get api("/groups/#{group.id}/search", user), params: { scope: 'users', search: 'billy' } + get api(endpoint, user), params: { scope: 'users', search: 'billy' } end it 'returns 400 error' do @@ -273,9 +361,11 @@ describe API::Search do end describe "GET /projects/:id/search" do + let(:endpoint) { "/projects/#{project.id}/search" } + context 'when user is not authenticated' do it 'returns 401 error' do - get api("/projects/#{project.id}/search"), params: { scope: 'issues', search: 'awesome' } + get api(endpoint), params: { scope: 'issues', search: 'awesome' } expect(response).to have_gitlab_http_status(:unauthorized) end @@ -283,7 +373,7 @@ describe API::Search do context 'when scope is not supported' do it 'returns 400 error' do - get api("/projects/#{project.id}/search", user), params: { scope: 'unsupported', search: 'awesome' } + get api(endpoint, user), params: { scope: 'unsupported', search: 'awesome' } expect(response).to have_gitlab_http_status(:bad_request) end @@ -291,7 +381,7 @@ describe API::Search do context 'when scope is missing' do it 'returns 400 error' do - get api("/projects/#{project.id}/search", user), params: { search: 'awesome' } + get api(endpoint, user), params: { search: 'awesome' } expect(response).to have_gitlab_http_status(:bad_request) end @@ -309,7 +399,7 @@ describe API::Search do it 'returns 404 error' do project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE) - get api("/projects/#{project.id}/search", user), params: { scope: 'issues', search: 'awesome' } + get api(endpoint, user), params: { scope: 'issues', search: 'awesome' } expect(response).to have_gitlab_http_status(:not_found) end @@ -320,20 +410,38 @@ describe API::Search do before do create(:issue, project: project, title: 'awesome issue') - get api("/projects/#{project.id}/search", user), params: { scope: 'issues', search: 'awesome' } + get api(endpoint, user), params: { scope: 'issues', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/issues' + + describe 'pagination' do + before do + create(:issue, project: project, title: 'another issue') + end + + include_examples 'pagination', scope: :issues + end end context 'for merge_requests scope' do + let(:endpoint) { "/projects/#{repo_project.id}/search" } + before do create(:merge_request, source_project: repo_project, title: 'awesome mr') - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'merge_requests', search: 'awesome' } + get api(endpoint, user), params: { scope: 'merge_requests', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/merge_requests' + + describe 'pagination' do + before do + create(:merge_request, source_project: repo_project, title: 'another mr', target_branch: 'another_branch') + end + + include_examples 'pagination', scope: :merge_requests + end end context 'for milestones scope' do @@ -343,10 +451,18 @@ describe API::Search do context 'when user can read milestones' do before do - get api("/projects/#{project.id}/search", user), params: { scope: 'milestones', search: 'awesome' } + get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/milestones' + + describe 'pagination' do + before do + create(:milestone, project: project, title: 'another milestone') + end + + include_examples 'pagination', scope: :milestones + end end context 'when user cannot read project milestones' do @@ -356,7 +472,7 @@ describe API::Search do end it 'returns empty array' do - get api("/projects/#{project.id}/search", user), params: { scope: 'milestones', search: 'awesome' } + get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' } milestones = json_response @@ -370,16 +486,24 @@ describe API::Search do user1 = create(:user, name: 'billy') create(:project_member, :developer, user: user1, project: project) - get api("/projects/#{project.id}/search", user), params: { scope: 'users', search: 'billy' } + get api(endpoint, user), params: { scope: 'users', search: 'billy' } end it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics' + describe 'pagination' do + before do + create(:project_member, :developer, project: project) + end + + include_examples 'pagination', scope: :users + end + context 'when users search feature is disabled' do before do - allow(Feature).to receive(:disabled?).with(:users_search, default_enabled: true).and_return(true) + stub_feature_flags(users_search: false) - get api("/projects/#{project.id}/search", user), params: { scope: 'users', search: 'billy' } + get api(endpoint, user), params: { scope: 'users', search: 'billy' } end it 'returns 400 error' do @@ -392,29 +516,51 @@ describe API::Search do before do create(:note_on_merge_request, project: project, note: 'awesome note') - get api("/projects/#{project.id}/search", user), params: { scope: 'notes', search: 'awesome' } + get api(endpoint, user), params: { scope: 'notes', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/notes' + + describe 'pagination' do + before do + mr = create(:merge_request, source_project: project, target_branch: 'another_branch') + create(:note, project: project, noteable: mr, note: 'another note') + end + + include_examples 'pagination', scope: :notes + end end context 'for wiki_blobs scope' do + let(:wiki) { create(:project_wiki, project: project) } + before do - wiki = create(:project_wiki, project: project) - create(:wiki_page, wiki: wiki, attrs: { title: 'home', content: "Awesome page" }) + create(:wiki_page, wiki: wiki, title: 'home', content: "Awesome page") - get api("/projects/#{project.id}/search", user), params: { scope: 'wiki_blobs', search: 'awesome' } + get api(endpoint, user), params: { scope: 'wiki_blobs', search: 'awesome' } end it_behaves_like 'response is correct', schema: 'public_api/v4/blobs' + + describe 'pagination' do + before do + create(:wiki_page, wiki: wiki, title: 'home 2', content: 'Another page') + end + + include_examples 'pagination', scope: :wiki_blobs, search: 'page' + end end context 'for commits scope' do + let(:endpoint) { "/projects/#{repo_project.id}/search" } + before do - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6' } + get api(endpoint, user), params: { scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6' } end it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details' + + it_behaves_like 'pagination', scope: :commits, search: 'merge' end context 'for commits scope with project path as id' do @@ -426,15 +572,19 @@ describe API::Search do end context 'for blobs scope' do + let(:endpoint) { "/projects/#{repo_project.id}/search" } + before do - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'monitors' } + get api(endpoint, user), params: { scope: 'blobs', search: 'monitors' } end it_behaves_like 'response is correct', schema: 'public_api/v4/blobs', size: 2 + it_behaves_like 'pagination', scope: :blobs, search: 'monitors' + context 'filters' do it 'by filename' do - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'mon filename:PROCESS.md' } + get api(endpoint, user), params: { scope: 'blobs', search: 'mon filename:PROCESS.md' } expect(response).to have_gitlab_http_status(:ok) expect(json_response.size).to eq(2) @@ -443,21 +593,21 @@ describe API::Search do end it 'by path' do - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'mon path:markdown' } + get api(endpoint, user), params: { scope: 'blobs', search: 'mon path:markdown' } expect(response).to have_gitlab_http_status(:ok) expect(json_response.size).to eq(8) end it 'by extension' do - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'mon extension:md' } + get api(endpoint, user), params: { scope: 'blobs', search: 'mon extension:md' } expect(response).to have_gitlab_http_status(:ok) expect(json_response.size).to eq(11) end it 'by ref' do - get api("/projects/#{repo_project.id}/search", user), params: { scope: 'blobs', search: 'This file is used in tests for ci_environments_status', ref: 'pages-deploy' } + get api(endpoint, user), params: { scope: 'blobs', search: 'This file is used in tests for ci_environments_status', ref: 'pages-deploy' } expect(response).to have_gitlab_http_status(:ok) expect(json_response.size).to eq(1) |