2019-10-28 20:06:10 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
require 'spec_helper'
|
|
|
|
|
2020-06-24 02:09:01 -04:00
|
|
|
RSpec.describe API::Search do
|
2020-02-17 10:09:01 -05:00
|
|
|
let_it_be(:user) { create(:user) }
|
|
|
|
let_it_be(:group) { create(:group) }
|
|
|
|
let_it_be(:project, reload: true) { create(:project, :wiki_repo, :public, name: 'awesome project', group: group) }
|
|
|
|
let_it_be(:repo_project) { create(:project, :public, :repository, group: group) }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
|
|
|
shared_examples 'response is correct' do |schema:, size: 1|
|
2020-03-02 13:07:42 -05:00
|
|
|
it { expect(response).to have_gitlab_http_status(:ok) }
|
2018-01-31 09:59:59 -05:00
|
|
|
it { expect(response).to match_response_schema(schema) }
|
2018-02-06 11:53:42 -05:00
|
|
|
it { expect(response).to include_limited_pagination_headers }
|
2018-01-31 09:59:59 -05:00
|
|
|
it { expect(json_response.size).to eq(size) }
|
|
|
|
end
|
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
shared_examples 'ping counters' do |scope:, search: ''|
|
|
|
|
it 'increases usage ping searches counter' do
|
|
|
|
expect(Gitlab::UsageDataCounters::SearchCounter).to receive(:count).with(:all_searches)
|
|
|
|
|
|
|
|
get api(endpoint, user), params: { scope: scope, search: search }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
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
|
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
shared_examples 'filter by state' do |scope:, search:|
|
|
|
|
it 'respects scope filtering' do
|
|
|
|
get api(endpoint, user), params: { scope: scope, search: search, state: state }
|
|
|
|
|
|
|
|
documents = Gitlab::Json.parse(response.body)
|
|
|
|
|
|
|
|
expect(documents.count).to eq(1)
|
|
|
|
expect(documents.first['state']).to eq(state)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-10-15 08:09:06 -04:00
|
|
|
shared_examples 'filter by confidentiality' do |scope:, search:|
|
|
|
|
it 'respects confidentiality filtering' do
|
|
|
|
get api(endpoint, user), params: { scope: scope, search: search, confidential: confidential.to_s }
|
|
|
|
|
|
|
|
documents = Gitlab::Json.parse(response.body)
|
|
|
|
|
|
|
|
expect(documents.count).to eq(1)
|
|
|
|
expect(documents.first['confidential']).to eq(confidential)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'GET /search' do
|
|
|
|
let(:endpoint) { '/search' }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'when user is not authenticated' do
|
|
|
|
it 'returns 401 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint), params: { scope: 'projects', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:unauthorized)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when scope is not supported' do
|
|
|
|
it 'returns 400 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'unsupported', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when scope is missing' do
|
|
|
|
it 'returns 400 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with correct params' do
|
|
|
|
context 'for projects scope' do
|
|
|
|
before do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'projects', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/projects'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
|
|
|
it_behaves_like 'pagination', scope: :projects
|
2020-05-25 02:08:38 -04:00
|
|
|
|
|
|
|
it_behaves_like 'ping counters', scope: :projects
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for issues scope' do
|
2020-09-14 23:09:24 -04:00
|
|
|
context 'without filtering by state' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, title: 'awesome issue')
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'issues', search: 'awesome' }
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/issues'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :issues
|
2020-05-25 02:08:38 -04:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, title: 'another issue')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :issues
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'filter by state' do
|
2020-05-07 17:09:26 -04:00
|
|
|
before do
|
2020-09-14 23:09:24 -04:00
|
|
|
create(:issue, project: project, title: 'awesome opened issue')
|
|
|
|
create(:issue, :closed, project: project, title: 'awesome closed issue')
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'state: opened' do
|
|
|
|
let(:state) { 'opened' }
|
|
|
|
|
|
|
|
include_examples 'filter by state', scope: :issues, search: 'awesome'
|
2020-05-07 17:09:26 -04:00
|
|
|
end
|
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
context 'state: closed' do
|
|
|
|
let(:state) { 'closed' }
|
|
|
|
|
|
|
|
include_examples 'filter by state', scope: :issues, search: 'awesome'
|
|
|
|
end
|
2020-10-15 08:09:06 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'filter by confidentiality' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, author: user, title: 'awesome non-confidential issue')
|
|
|
|
create(:issue, :confidential, project: project, author: user, title: 'awesome confidential issue')
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'confidential: true' do
|
|
|
|
let(:confidential) { true }
|
|
|
|
|
|
|
|
include_examples 'filter by confidentiality', scope: :issues, search: 'awesome'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'confidential: false' do
|
|
|
|
let(:confidential) { false }
|
|
|
|
|
|
|
|
include_examples 'filter by confidentiality', scope: :issues, search: 'awesome'
|
|
|
|
end
|
2020-05-07 17:09:26 -04:00
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for merge_requests scope' do
|
2020-09-14 23:09:24 -04:00
|
|
|
context 'without filtering by state' do
|
|
|
|
before do
|
|
|
|
create(:merge_request, source_project: repo_project, title: 'awesome mr')
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'merge_requests', search: 'awesome' }
|
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/merge_requests'
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :merge_requests
|
|
|
|
|
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:merge_request, source_project: repo_project, title: 'another mr', target_branch: 'another_branch')
|
|
|
|
end
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
include_examples 'pagination', scope: :merge_requests
|
|
|
|
end
|
|
|
|
end
|
2020-05-25 02:08:38 -04:00
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
context 'filter by state' do
|
2020-05-07 17:09:26 -04:00
|
|
|
before do
|
2020-09-14 23:09:24 -04:00
|
|
|
create(:merge_request, source_project: project, title: 'awesome opened mr')
|
|
|
|
create(:merge_request, :closed, project: project, title: 'awesome closed mr')
|
2020-05-07 17:09:26 -04:00
|
|
|
end
|
|
|
|
|
2020-09-14 23:09:24 -04:00
|
|
|
context 'state: opened' do
|
|
|
|
let(:state) { 'opened' }
|
|
|
|
|
|
|
|
include_examples 'filter by state', scope: :merge_requests, search: 'awesome'
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'state: closed' do
|
|
|
|
let(:state) { 'closed' }
|
|
|
|
|
|
|
|
include_examples 'filter by state', scope: :merge_requests, search: 'awesome'
|
|
|
|
end
|
2020-05-07 17:09:26 -04:00
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for milestones scope' do
|
|
|
|
before do
|
|
|
|
create(:milestone, project: project, title: 'awesome milestone')
|
2019-05-20 10:08:31 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when user can read project milestones' do
|
|
|
|
before do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' }
|
2019-05-20 10:08:31 -04:00
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2019-05-20 10:08:31 -04:00
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/milestones'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :milestones
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:milestone, project: project, title: 'another milestone')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :milestones
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2019-05-20 10:08:31 -04:00
|
|
|
context 'when user cannot read project milestones' do
|
|
|
|
before do
|
|
|
|
project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
|
|
|
|
project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns empty array' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' }
|
2019-05-20 10:08:31 -04:00
|
|
|
|
2019-07-16 04:03:49 -04:00
|
|
|
milestones = json_response
|
2019-05-20 10:08:31 -04:00
|
|
|
|
|
|
|
expect(milestones).to be_empty
|
|
|
|
end
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2018-09-17 08:54:32 -04:00
|
|
|
context 'for users scope' do
|
|
|
|
before do
|
|
|
|
create(:user, name: 'billy')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'users', search: 'billy' }
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics'
|
2019-01-17 13:27:20 -05:00
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
it_behaves_like 'pagination', scope: :users
|
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :users
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'for snippet_titles scope' do
|
|
|
|
before do
|
|
|
|
create(:snippet, :public, title: 'awesome snippet', content: 'snippet content')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'snippet_titles', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/snippets'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :snippet_titles
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:snippet, :public, title: 'another snippet', content: 'snippet content')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :snippet_titles
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-03-14 11:49:21 -04:00
|
|
|
describe "GET /groups/:id/search" do
|
2020-05-07 17:09:26 -04:00
|
|
|
let(:endpoint) { "/groups/#{group.id}/-/search" }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'when user is not authenticated' do
|
|
|
|
it 'returns 401 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint), params: { scope: 'projects', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:unauthorized)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when scope is not supported' do
|
|
|
|
it 'returns 400 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'unsupported', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when scope is missing' do
|
|
|
|
it 'returns 400 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when group does not exist' do
|
|
|
|
it 'returns 404 error' do
|
2019-02-26 18:18:40 -05:00
|
|
|
get api('/groups/0/search', user), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when user does can not see the group' do
|
|
|
|
it 'returns 404 error' do
|
|
|
|
private_group = create(:group, :private)
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
get api("/groups/#{private_group.id}/search", user), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with correct params' do
|
|
|
|
context 'for projects scope' do
|
|
|
|
before do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'projects', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/projects'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
|
|
|
it_behaves_like 'pagination', scope: :projects
|
2020-05-25 02:08:38 -04:00
|
|
|
|
|
|
|
it_behaves_like 'ping counters', scope: :projects
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for issues scope' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, title: 'awesome issue')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/issues'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :issues
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, title: 'another issue')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :issues
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for merge_requests scope' do
|
|
|
|
before do
|
|
|
|
create(:merge_request, source_project: repo_project, title: 'awesome mr')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'merge_requests', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/merge_requests'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :merge_requests
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
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
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for milestones scope' do
|
|
|
|
before do
|
|
|
|
create(:milestone, project: project, title: 'awesome milestone')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/milestones'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :milestones
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:milestone, project: project, title: 'another milestone')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :milestones
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
2018-02-09 09:38:52 -05:00
|
|
|
|
|
|
|
context 'for milestones scope with group path as id' do
|
|
|
|
before do
|
|
|
|
another_project = create(:project, :public)
|
|
|
|
create(:milestone, project: project, title: 'awesome milestone')
|
|
|
|
create(:milestone, project: another_project, title: 'awesome milestone other project')
|
|
|
|
|
2018-12-17 17:52:17 -05:00
|
|
|
get api("/groups/#{CGI.escape(group.full_path)}/search", user), params: { scope: 'milestones', search: 'awesome' }
|
2018-02-09 09:38:52 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/milestones'
|
|
|
|
end
|
2018-09-17 08:54:32 -04:00
|
|
|
|
2019-01-17 13:27:20 -05:00
|
|
|
context 'for users scope' do
|
2018-09-17 08:54:32 -04:00
|
|
|
before do
|
|
|
|
user = create(:user, name: 'billy')
|
|
|
|
create(:group_member, :developer, user: user, group: group)
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'users', search: 'billy' }
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics'
|
2019-01-17 13:27:20 -05:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :users
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:group_member, :developer, group: group)
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :users
|
|
|
|
end
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for users scope with group path as id' do
|
|
|
|
before do
|
|
|
|
user1 = create(:user, name: 'billy')
|
|
|
|
create(:group_member, :developer, user: user1, group: group)
|
|
|
|
|
2019-01-17 13:27:20 -05:00
|
|
|
get api("/groups/#{CGI.escape(group.full_path)}/search", user), params: { scope: 'users', search: 'billy' }
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics'
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
describe "GET /projects/:id/search" do
|
2020-05-07 17:09:26 -04:00
|
|
|
let(:endpoint) { "/projects/#{project.id}/search" }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'when user is not authenticated' do
|
|
|
|
it 'returns 401 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:unauthorized)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when scope is not supported' do
|
|
|
|
it 'returns 400 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'unsupported', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when scope is missing' do
|
|
|
|
it 'returns 400 error' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:bad_request)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'when project does not exist' do
|
|
|
|
it 'returns 404 error' do
|
2019-02-26 18:18:40 -05:00
|
|
|
get api('/projects/0/search', user), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
context 'when user can not see the project' do
|
2018-01-31 09:59:59 -05:00
|
|
|
it 'returns 404 error' do
|
|
|
|
project.update!(visibility_level: Gitlab::VisibilityLevel::PRIVATE)
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:not_found)
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
context 'with correct params' do
|
|
|
|
context 'for issues scope' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, title: 'awesome issue')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'issues', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/issues'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :issues
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:issue, project: project, title: 'another issue')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :issues
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2020-10-23 20:08:35 -04:00
|
|
|
context 'when requesting basic search' do
|
|
|
|
it 'passes the parameter to search service' do
|
|
|
|
expect(SearchService).to receive(:new).with(user, hash_including(basic_search: 'true'))
|
|
|
|
|
|
|
|
get api(endpoint, user), params: { scope: 'issues', search: 'awesome', basic_search: 'true' }
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'for merge_requests scope' do
|
2020-05-07 17:09:26 -04:00
|
|
|
let(:endpoint) { "/projects/#{repo_project.id}/search" }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
before do
|
|
|
|
create(:merge_request, source_project: repo_project, title: 'awesome mr')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'merge_requests', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/merge_requests'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :merge_requests
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
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
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for milestones scope' do
|
|
|
|
before do
|
|
|
|
create(:milestone, project: project, title: 'awesome milestone')
|
2019-05-20 10:08:31 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'when user can read milestones' do
|
|
|
|
before do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' }
|
2019-05-20 10:08:31 -04:00
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2019-05-20 10:08:31 -04:00
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/milestones'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :milestones
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:milestone, project: project, title: 'another milestone')
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :milestones
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2019-05-20 10:08:31 -04:00
|
|
|
context 'when user cannot read project milestones' do
|
|
|
|
before do
|
|
|
|
project.project_feature.update!(merge_requests_access_level: ProjectFeature::PRIVATE)
|
|
|
|
project.project_feature.update!(issues_access_level: ProjectFeature::PRIVATE)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'returns empty array' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'milestones', search: 'awesome' }
|
2019-05-20 10:08:31 -04:00
|
|
|
|
2019-07-16 04:03:49 -04:00
|
|
|
milestones = json_response
|
2019-05-20 10:08:31 -04:00
|
|
|
|
|
|
|
expect(milestones).to be_empty
|
|
|
|
end
|
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2018-09-17 08:54:32 -04:00
|
|
|
context 'for users scope' do
|
|
|
|
before do
|
|
|
|
user1 = create(:user, name: 'billy')
|
|
|
|
create(:project_member, :developer, user: user1, project: project)
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'users', search: 'billy' }
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/user/basics'
|
2019-01-17 13:27:20 -05:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :users
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
describe 'pagination' do
|
|
|
|
before do
|
|
|
|
create(:project_member, :developer, project: project)
|
|
|
|
end
|
|
|
|
|
|
|
|
include_examples 'pagination', scope: :users
|
|
|
|
end
|
2018-09-17 08:54:32 -04:00
|
|
|
end
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'for notes scope' do
|
|
|
|
before do
|
|
|
|
create(:note_on_merge_request, project: project, note: 'awesome note')
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'notes', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/notes'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :notes
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
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
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for wiki_blobs scope' do
|
2020-05-07 17:09:26 -04:00
|
|
|
let(:wiki) { create(:project_wiki, project: project) }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
before do
|
2020-04-27 05:09:51 -04:00
|
|
|
create(:wiki_page, wiki: wiki, title: 'home', content: "Awesome page")
|
2018-01-31 09:59:59 -05:00
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'wiki_blobs', search: 'awesome' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/blobs'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :wiki_blobs
|
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
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
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
context 'for commits scope' do
|
2020-05-07 17:09:26 -04:00
|
|
|
let(:endpoint) { "/projects/#{repo_project.id}/search" }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
before do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2018-02-13 07:41:35 -05:00
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details'
|
2020-05-07 17:09:26 -04:00
|
|
|
|
|
|
|
it_behaves_like 'pagination', scope: :commits, search: 'merge'
|
2020-05-25 02:08:38 -04:00
|
|
|
|
|
|
|
it_behaves_like 'ping counters', scope: :commits
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
2018-02-09 09:38:52 -05:00
|
|
|
context 'for commits scope with project path as id' do
|
|
|
|
before do
|
2018-12-17 17:52:17 -05:00
|
|
|
get api("/projects/#{CGI.escape(repo_project.full_path)}/search", user), params: { scope: 'commits', search: '498214de67004b1da3d820901307bed2a68a8ef6' }
|
2018-02-09 09:38:52 -05:00
|
|
|
end
|
|
|
|
|
2018-02-13 07:41:35 -05:00
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/commits_details'
|
2018-02-09 09:38:52 -05:00
|
|
|
end
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
context 'for blobs scope' do
|
2020-05-07 17:09:26 -04:00
|
|
|
let(:endpoint) { "/projects/#{repo_project.id}/search" }
|
|
|
|
|
2018-01-31 09:59:59 -05:00
|
|
|
before do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'blobs', search: 'monitors' }
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
|
|
|
|
it_behaves_like 'response is correct', schema: 'public_api/v4/blobs', size: 2
|
2018-06-06 20:14:10 -04:00
|
|
|
|
2020-05-07 17:09:26 -04:00
|
|
|
it_behaves_like 'pagination', scope: :blobs, search: 'monitors'
|
|
|
|
|
2020-05-25 02:08:38 -04:00
|
|
|
it_behaves_like 'ping counters', scope: :blobs
|
|
|
|
|
2018-06-06 20:14:10 -04:00
|
|
|
context 'filters' do
|
|
|
|
it 'by filename' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'blobs', search: 'mon filename:PROCESS.md' }
|
2018-06-06 20:14:10 -04:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2018-06-06 20:14:10 -04:00
|
|
|
expect(json_response.size).to eq(2)
|
2019-10-23 20:07:18 -04:00
|
|
|
expect(json_response.first['path']).to eq('PROCESS.md')
|
2018-06-06 20:14:10 -04:00
|
|
|
expect(json_response.first['filename']).to eq('PROCESS.md')
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'by path' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'blobs', search: 'mon path:markdown' }
|
2018-06-06 20:14:10 -04:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2018-06-06 20:14:10 -04:00
|
|
|
expect(json_response.size).to eq(8)
|
|
|
|
end
|
|
|
|
|
|
|
|
it 'by extension' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'blobs', search: 'mon extension:md' }
|
2018-06-06 20:14:10 -04:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2018-06-06 20:14:10 -04:00
|
|
|
expect(json_response.size).to eq(11)
|
|
|
|
end
|
2019-05-17 02:10:08 -04:00
|
|
|
|
|
|
|
it 'by ref' do
|
2020-05-07 17:09:26 -04:00
|
|
|
get api(endpoint, user), params: { scope: 'blobs', search: 'This file is used in tests for ci_environments_status', ref: 'pages-deploy' }
|
2019-05-17 02:10:08 -04:00
|
|
|
|
2020-03-02 13:07:42 -05:00
|
|
|
expect(response).to have_gitlab_http_status(:ok)
|
2019-05-17 02:10:08 -04:00
|
|
|
expect(json_response.size).to eq(1)
|
|
|
|
end
|
2018-06-06 20:14:10 -04:00
|
|
|
end
|
2018-01-31 09:59:59 -05:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|