2018-01-31 09:59:59 -05:00
require 'spec_helper'
describe API :: Search do
set ( :user ) { create ( :user ) }
set ( :group ) { create ( :group ) }
2018-05-04 05:45:16 -04:00
set ( :project ) { create ( :project , :wiki_repo , :public , name : 'awesome project' , group : group ) }
2018-01-31 09:59:59 -05:00
set ( :repo_project ) { create ( :project , :public , :repository , group : group ) }
shared_examples 'response is correct' do | schema : , size : 1 |
it { expect ( response ) . to have_gitlab_http_status ( 200 ) }
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
describe 'GET /search' do
context 'when user is not authenticated' do
it 'returns 401 error' do
2018-12-17 17:52:17 -05:00
get api ( '/search' ) , params : { scope : 'projects' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 401 )
end
end
context 'when scope is not supported' do
it 'returns 400 error' do
2018-12-17 17:52:17 -05:00
get api ( '/search' , user ) , params : { scope : 'unsupported' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 400 )
end
end
context 'when scope is missing' do
it 'returns 400 error' do
2018-12-17 17:52:17 -05:00
get api ( '/search' , user ) , params : { search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 400 )
end
end
context 'with correct params' do
context 'for projects scope' do
before do
2018-12-17 17:52:17 -05:00
get api ( '/search' , 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'
end
context 'for issues scope' do
before do
create ( :issue , project : project , title : 'awesome issue' )
2018-12-17 17:52:17 -05:00
get api ( '/search' , 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'
end
context 'for merge_requests scope' do
before do
create ( :merge_request , source_project : repo_project , title : 'awesome mr' )
2018-12-17 17:52:17 -05:00
get api ( '/search' , 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'
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
get api ( '/search' , user ) , params : { scope : 'milestones' , search : 'awesome' }
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'
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
get api ( '/search' , user ) , params : { scope : 'milestones' , search : 'awesome' }
milestones = JSON . parse ( response . body )
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' )
2019-01-17 13:27:20 -05:00
get api ( '/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'
2019-01-17 13:27:20 -05:00
context 'when users search feature is disabled' do
before do
allow ( Feature ) . to receive ( :disabled? ) . with ( :users_search , default_enabled : true ) . and_return ( true )
get api ( '/search' , user ) , params : { scope : 'users' , search : 'billy' }
end
it 'returns 400 error' do
expect ( response ) . to have_gitlab_http_status ( 400 )
end
end
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' )
2018-12-17 17:52:17 -05:00
get api ( '/search' , 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'
end
context 'for snippet_blobs scope' do
before do
create ( :snippet , :public , title : 'awesome snippet' , content : 'snippet content' )
2018-12-17 17:52:17 -05:00
get api ( '/search' , user ) , params : { scope : 'snippet_blobs' , search : 'content' }
2018-01-31 09:59:59 -05:00
end
it_behaves_like 'response is correct' , schema : 'public_api/v4/snippets'
end
end
end
2018-03-14 11:49:21 -04:00
describe " GET /groups/:id/search " do
2018-01-31 09:59:59 -05:00
context 'when user is not authenticated' do
it 'returns 401 error' do
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " ) , params : { scope : 'projects' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 401 )
end
end
context 'when scope is not supported' do
it 'returns 400 error' do
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " , user ) , params : { scope : 'unsupported' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 400 )
end
end
context 'when scope is missing' do
it 'returns 400 error' do
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " , user ) , params : { search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 400 )
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
expect ( response ) . to have_gitlab_http_status ( 404 )
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
expect ( response ) . to have_gitlab_http_status ( 404 )
end
end
context 'with correct params' do
context 'for projects scope' do
before do
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " , 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'
end
context 'for issues scope' do
before do
create ( :issue , project : project , title : 'awesome issue' )
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " , 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'
end
context 'for merge_requests scope' do
before do
create ( :merge_request , source_project : repo_project , title : 'awesome mr' )
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " , 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'
end
context 'for milestones scope' do
before do
create ( :milestone , project : project , title : 'awesome milestone' )
2018-12-17 17:52:17 -05:00
get api ( " /groups/ #{ group . id } /search " , 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'
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 )
2019-01-17 13:27:20 -05:00
get api ( " /groups/ #{ group . id } /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'
2019-01-17 13:27:20 -05:00
context 'when users search feature is disabled' do
before do
allow ( Feature ) . to receive ( :disabled? ) . with ( :users_search , default_enabled : true ) . and_return ( true )
get api ( " /groups/ #{ group . id } /search " , user ) , params : { scope : 'users' , search : 'billy' }
end
it 'returns 400 error' do
expect ( response ) . to have_gitlab_http_status ( 400 )
end
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
context 'when user is not authenticated' do
it 'returns 401 error' do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " ) , params : { scope : 'issues' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 401 )
end
end
context 'when scope is not supported' do
it 'returns 400 error' do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " , user ) , params : { scope : 'unsupported' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 400 )
end
end
context 'when scope is missing' do
it 'returns 400 error' do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " , user ) , params : { search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 400 )
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
expect ( response ) . to have_gitlab_http_status ( 404 )
end
end
context 'when user does can not see the project' do
it 'returns 404 error' do
project . update! ( visibility_level : Gitlab :: VisibilityLevel :: PRIVATE )
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " , user ) , params : { scope : 'issues' , search : 'awesome' }
2018-01-31 09:59:59 -05:00
expect ( response ) . to have_gitlab_http_status ( 404 )
end
end
context 'with correct params' do
context 'for issues scope' do
before do
create ( :issue , project : project , title : 'awesome issue' )
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " , 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'
end
context 'for merge_requests scope' do
before do
create ( :merge_request , source_project : repo_project , title : 'awesome mr' )
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ repo_project . id } /search " , 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'
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
get api ( " /projects/ #{ project . id } /search " , user ) , params : { scope : 'milestones' , search : 'awesome' }
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'
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
get api ( " /projects/ #{ project . id } /search " , user ) , params : { scope : 'milestones' , search : 'awesome' }
milestones = JSON . parse ( response . body )
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 )
2019-01-17 13:27:20 -05:00
get api ( " /projects/ #{ project . id } /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'
2019-01-17 13:27:20 -05:00
context 'when users search feature is disabled' do
before do
allow ( Feature ) . to receive ( :disabled? ) . with ( :users_search , default_enabled : true ) . and_return ( true )
get api ( " /projects/ #{ project . id } /search " , user ) , params : { scope : 'users' , search : 'billy' }
end
it 'returns 400 error' do
expect ( response ) . to have_gitlab_http_status ( 400 )
end
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' )
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " , 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'
end
context 'for wiki_blobs scope' do
before do
wiki = create ( :project_wiki , project : project )
create ( :wiki_page , wiki : wiki , attrs : { title : 'home' , content : " Awesome page " } )
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ project . id } /search " , 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'
end
context 'for commits scope' do
before do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ repo_project . id } /search " , 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'
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
before do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ repo_project . id } /search " , 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
context 'filters' do
it 'by filename' do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ repo_project . id } /search " , user ) , params : { scope : 'blobs' , search : 'mon filename:PROCESS.md' }
2018-06-06 20:14:10 -04:00
expect ( response ) . to have_gitlab_http_status ( 200 )
expect ( json_response . size ) . to eq ( 2 )
expect ( json_response . first [ 'filename' ] ) . to eq ( 'PROCESS.md' )
end
it 'by path' do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ repo_project . id } /search " , user ) , params : { scope : 'blobs' , search : 'mon path:markdown' }
2018-06-06 20:14:10 -04:00
expect ( response ) . to have_gitlab_http_status ( 200 )
expect ( json_response . size ) . to eq ( 8 )
end
it 'by extension' do
2018-12-17 17:52:17 -05:00
get api ( " /projects/ #{ repo_project . id } /search " , user ) , params : { scope : 'blobs' , search : 'mon extension:md' }
2018-06-06 20:14:10 -04:00
expect ( response ) . to have_gitlab_http_status ( 200 )
expect ( json_response . size ) . to eq ( 11 )
end
2019-05-17 02:10:08 -04:00
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' }
expect ( response ) . to have_gitlab_http_status ( 200 )
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