2014-02-18 05:41:21 -05:00
require 'spec_helper'
require 'mime/types'
2016-11-23 15:14:08 -05:00
describe API :: Commits , api : true do
2014-02-18 05:41:21 -05:00
include ApiHelpers
let ( :user ) { create ( :user ) }
let ( :user2 ) { create ( :user ) }
2017-01-26 18:51:57 -05:00
let! ( :project ) { create ( :project , :repository , creator : user , namespace : user . namespace ) }
2016-03-06 16:53:22 -05:00
let! ( :master ) { create ( :project_member , :master , user : user , project : project ) }
let! ( :guest ) { create ( :project_member , :guest , user : user2 , project : project ) }
2014-06-27 10:48:30 -04:00
let! ( :note ) { create ( :note_on_commit , author : user , project : project , commit_id : project . repository . commit . id , note : 'a comment on a commit' ) }
2015-05-08 08:34:10 -04:00
let! ( :another_note ) { create ( :note_on_commit , author : user , project : project , commit_id : project . repository . commit . id , note : 'another comment on a commit' ) }
2014-02-18 05:41:21 -05:00
before { project . team << [ user , :reporter ] }
2016-08-29 19:58:32 -04:00
describe " List repository commits " do
2014-02-18 05:41:21 -05:00
context " authorized user " do
before { project . team << [ user2 , :reporter ] }
2016-08-01 11:00:44 -04:00
it " returns project commits " do
2016-11-30 12:02:58 -05:00
commit = project . repository . commit
2017-03-02 21:06:06 -05:00
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits " , user )
2016-11-30 12:02:58 -05:00
expect ( response ) . to have_http_status ( 200 )
2015-02-12 13:17:35 -05:00
expect ( json_response ) . to be_an Array
2016-11-30 12:02:58 -05:00
expect ( json_response . first [ 'id' ] ) . to eq ( commit . id )
expect ( json_response . first [ 'committer_name' ] ) . to eq ( commit . committer_name )
expect ( json_response . first [ 'committer_email' ] ) . to eq ( commit . committer_email )
2014-02-18 05:41:21 -05:00
end
2017-03-02 21:06:06 -05:00
it 'include correct pagination headers' do
commit_count = project . repository . count_commits ( ref : 'master' ) . to_s
get api ( " /projects/ #{ project . id } /repository/commits " , user )
expect ( response ) . to include_pagination_headers
expect ( response . headers [ 'X-Total' ] ) . to eq ( commit_count )
expect ( response . headers [ 'X-Page' ] ) . to eql ( '1' )
end
2014-02-18 05:41:21 -05:00
end
context " unauthorized user " do
2016-08-01 11:00:44 -04:00
it " does not return project commits " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits " )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 401 )
2014-02-18 05:41:21 -05:00
end
end
2016-04-22 08:07:25 -04:00
context " since optional parameter " do
2016-08-01 11:00:44 -04:00
it " returns project commits since provided parameter " do
2016-04-22 08:07:25 -04:00
commits = project . repository . commits ( " master " )
2017-03-02 21:06:06 -05:00
after = commits . second . created_at
2016-04-22 08:07:25 -04:00
2017-03-02 21:06:06 -05:00
get api ( " /projects/ #{ project . id } /repository/commits?since= #{ after . utc . iso8601 } " , user )
2016-04-22 08:07:25 -04:00
expect ( json_response . size ) . to eq 2
expect ( json_response . first [ " id " ] ) . to eq ( commits . first . id )
expect ( json_response . second [ " id " ] ) . to eq ( commits . second . id )
end
2017-03-02 21:06:06 -05:00
it 'include correct pagination headers' do
commits = project . repository . commits ( " master " )
after = commits . second . created_at
commit_count = project . repository . count_commits ( ref : 'master' , after : after ) . to_s
get api ( " /projects/ #{ project . id } /repository/commits?since= #{ after . utc . iso8601 } " , user )
expect ( response ) . to include_pagination_headers
expect ( response . headers [ 'X-Total' ] ) . to eq ( commit_count )
expect ( response . headers [ 'X-Page' ] ) . to eql ( '1' )
end
2016-04-22 08:07:25 -04:00
end
context " until optional parameter " do
2016-08-01 11:00:44 -04:00
it " returns project commits until provided parameter " do
2016-04-22 08:07:25 -04:00
commits = project . repository . commits ( " master " )
before = commits . second . created_at
get api ( " /projects/ #{ project . id } /repository/commits?until= #{ before . utc . iso8601 } " , user )
2016-10-03 08:11:16 -04:00
if commits . size > = 20
expect ( json_response . size ) . to eq ( 20 )
else
expect ( json_response . size ) . to eq ( commits . size - 1 )
end
2016-04-22 08:07:25 -04:00
expect ( json_response . first [ " id " ] ) . to eq ( commits . second . id )
expect ( json_response . second [ " id " ] ) . to eq ( commits . third . id )
end
2017-03-02 21:06:06 -05:00
it 'include correct pagination headers' do
commits = project . repository . commits ( " master " )
before = commits . second . created_at
commit_count = project . repository . count_commits ( ref : 'master' , before : before ) . to_s
get api ( " /projects/ #{ project . id } /repository/commits?until= #{ before . utc . iso8601 } " , user )
expect ( response ) . to include_pagination_headers
expect ( response . headers [ 'X-Total' ] ) . to eq ( commit_count )
expect ( response . headers [ 'X-Page' ] ) . to eql ( '1' )
end
2016-04-22 08:07:25 -04:00
end
context " invalid xmlschema date parameters " do
2016-08-01 11:00:44 -04:00
it " returns an invalid parameter error message " do
2016-04-22 08:07:25 -04:00
get api ( " /projects/ #{ project . id } /repository/commits?since=invalid-date " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 400 )
2017-02-20 08:24:09 -05:00
expect ( json_response [ 'error' ] ) . to eq ( 'since is invalid' )
2016-04-22 08:07:25 -04:00
end
end
2016-06-20 21:37:40 -04:00
context " path optional parameter " do
it " returns project commits matching provided path parameter " do
path = 'files/ruby/popen.rb'
2017-03-02 21:06:06 -05:00
commit_count = project . repository . count_commits ( ref : 'master' , path : path ) . to_s
2016-06-20 21:37:40 -04:00
get api ( " /projects/ #{ project . id } /repository/commits?path= #{ path } " , user )
expect ( json_response . size ) . to eq ( 3 )
expect ( json_response . first [ " id " ] ) . to eq ( " 570e7b2abdd848b95f2f578043fc23bd6f6fd24d " )
2017-03-02 21:06:06 -05:00
expect ( response ) . to include_pagination_headers
expect ( response . headers [ 'X-Total' ] ) . to eq ( commit_count )
2016-06-20 21:37:40 -04:00
end
2017-01-20 10:04:16 -05:00
2017-03-02 21:06:06 -05:00
it 'include correct pagination headers' do
path = 'files/ruby/popen.rb'
commit_count = project . repository . count_commits ( ref : 'master' , path : path ) . to_s
get api ( " /projects/ #{ project . id } /repository/commits?path= #{ path } " , user )
expect ( response ) . to include_pagination_headers
expect ( response . headers [ 'X-Total' ] ) . to eq ( commit_count )
expect ( response . headers [ 'X-Page' ] ) . to eql ( '1' )
end
end
2017-01-20 10:04:16 -05:00
2017-03-02 21:06:06 -05:00
context 'with pagination params' do
let ( :page ) { 1 }
2017-01-20 10:04:16 -05:00
let ( :per_page ) { 5 }
let ( :ref_name ) { 'master' }
let! ( :request ) do
get api ( " /projects/ #{ project . id } /repository/commits?page= #{ page } &per_page= #{ per_page } &ref_name= #{ ref_name } " , user )
end
2017-03-02 21:06:06 -05:00
it 'returns correct headers' do
commit_count = project . repository . count_commits ( ref : ref_name ) . to_s
2017-01-20 10:04:16 -05:00
2017-03-02 21:06:06 -05:00
expect ( response ) . to include_pagination_headers
2017-01-20 10:04:16 -05:00
expect ( response . headers [ 'X-Total' ] ) . to eq ( commit_count )
2017-03-02 21:06:06 -05:00
expect ( response . headers [ 'X-Page' ] ) . to eq ( '1' )
expect ( response . headers [ 'Link' ] ) . to match ( / page=1&per_page=5 / )
expect ( response . headers [ 'Link' ] ) . to match ( / page=2&per_page=5 / )
2017-01-20 10:04:16 -05:00
end
context 'viewing the first page' do
it 'returns the first 5 commits' do
commit = project . repository . commit
expect ( json_response . size ) . to eq ( per_page )
expect ( json_response . first [ 'id' ] ) . to eq ( commit . id )
2017-03-02 21:06:06 -05:00
expect ( response . headers [ 'X-Page' ] ) . to eq ( '1' )
2017-01-20 10:04:16 -05:00
end
end
2017-03-02 21:06:06 -05:00
context 'viewing the third page' do
let ( :page ) { 3 }
2017-01-20 10:04:16 -05:00
2017-03-02 21:06:06 -05:00
it 'returns the third 5 commits' do
commit = project . repository . commits ( 'HEAD' , offset : ( page - 1 ) * per_page ) . first
2017-01-20 10:04:16 -05:00
expect ( json_response . size ) . to eq ( per_page )
expect ( json_response . first [ 'id' ] ) . to eq ( commit . id )
2017-03-02 21:06:06 -05:00
expect ( response . headers [ 'X-Page' ] ) . to eq ( '3' )
2017-01-20 10:04:16 -05:00
end
end
end
2014-02-18 05:41:21 -05:00
end
2017-03-14 13:08:50 -04:00
describe " POST /projects/:id/repository/commits " do
2016-08-29 19:58:32 -04:00
let! ( :url ) { " /projects/ #{ project . id } /repository/commits " }
it 'returns a 403 unauthorized for user without permissions' do
post api ( url , user2 )
expect ( response ) . to have_http_status ( 403 )
end
it 'returns a 400 bad request if no params are given' do
post api ( url , user )
expect ( response ) . to have_http_status ( 400 )
end
2017-03-14 13:08:50 -04:00
describe 'create' do
2016-08-29 19:58:32 -04:00
let ( :message ) { 'Created file' }
let! ( :invalid_c_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'master' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'create' ,
file_path : 'files/ruby/popen.rb' ,
content : 'puts 8'
}
]
}
end
let! ( :valid_c_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'master' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'create' ,
file_path : 'foo/bar/baz.txt' ,
content : 'puts 8'
}
]
}
end
it 'a new file in project repo' do
post api ( url , user ) , valid_c_params
expect ( response ) . to have_http_status ( 201 )
expect ( json_response [ 'title' ] ) . to eq ( message )
2016-11-30 12:02:58 -05:00
expect ( json_response [ 'committer_name' ] ) . to eq ( user . name )
expect ( json_response [ 'committer_email' ] ) . to eq ( user . email )
2016-08-29 19:58:32 -04:00
end
it 'returns a 400 bad request if file exists' do
post api ( url , user ) , invalid_c_params
expect ( response ) . to have_http_status ( 400 )
end
2017-01-02 20:14:31 -05:00
2017-03-14 13:08:50 -04:00
context 'with project path containing a dot in URL' do
let ( :url ) { " /projects/ #{ CGI . escape ( project . full_path ) } /repository/commits " }
2017-01-02 20:14:31 -05:00
it 'a new file in project repo' do
post api ( url , user ) , valid_c_params
expect ( response ) . to have_http_status ( 201 )
end
end
2016-08-29 19:58:32 -04:00
end
2017-03-14 13:08:50 -04:00
describe 'delete' do
2016-08-29 19:58:32 -04:00
let ( :message ) { 'Deleted file' }
let! ( :invalid_d_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'markdown' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'delete' ,
file_path : 'doc/api/projects.md'
}
]
}
end
let! ( :valid_d_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'markdown' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'delete' ,
file_path : 'doc/api/users.md'
}
]
}
end
it 'an existing file in project repo' do
post api ( url , user ) , valid_d_params
expect ( response ) . to have_http_status ( 201 )
expect ( json_response [ 'title' ] ) . to eq ( message )
end
it 'returns a 400 bad request if file does not exist' do
post api ( url , user ) , invalid_d_params
expect ( response ) . to have_http_status ( 400 )
end
end
2017-03-14 13:08:50 -04:00
describe 'move' do
2016-08-29 19:58:32 -04:00
let ( :message ) { 'Moved file' }
let! ( :invalid_m_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'feature' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'move' ,
file_path : 'CHANGELOG' ,
previous_path : 'VERSION' ,
content : '6.7.0.pre'
}
]
}
end
let! ( :valid_m_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'feature' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'move' ,
file_path : 'VERSION.txt' ,
previous_path : 'VERSION' ,
content : '6.7.0.pre'
}
]
}
end
it 'an existing file in project repo' do
post api ( url , user ) , valid_m_params
expect ( response ) . to have_http_status ( 201 )
expect ( json_response [ 'title' ] ) . to eq ( message )
end
it 'returns a 400 bad request if file does not exist' do
post api ( url , user ) , invalid_m_params
expect ( response ) . to have_http_status ( 400 )
end
end
2017-03-14 13:08:50 -04:00
describe 'update' do
2016-08-29 19:58:32 -04:00
let ( :message ) { 'Updated file' }
let! ( :invalid_u_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'master' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'update' ,
file_path : 'foo/bar.baz' ,
content : 'puts 8'
}
]
}
end
let! ( :valid_u_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'master' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'update' ,
file_path : 'files/ruby/popen.rb' ,
content : 'puts 8'
}
]
}
end
it 'an existing file in project repo' do
post api ( url , user ) , valid_u_params
expect ( response ) . to have_http_status ( 201 )
expect ( json_response [ 'title' ] ) . to eq ( message )
end
it 'returns a 400 bad request if file does not exist' do
post api ( url , user ) , invalid_u_params
expect ( response ) . to have_http_status ( 400 )
end
end
2017-03-14 13:08:50 -04:00
describe 'multiple operations' do
2016-08-29 19:58:32 -04:00
let ( :message ) { 'Multiple actions' }
let! ( :invalid_mo_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'master' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'create' ,
file_path : 'files/ruby/popen.rb' ,
content : 'puts 8'
} ,
{
action : 'delete' ,
file_path : 'doc/api/projects.md'
} ,
{
action : 'move' ,
file_path : 'CHANGELOG' ,
previous_path : 'VERSION' ,
content : '6.7.0.pre'
} ,
{
action : 'update' ,
file_path : 'foo/bar.baz' ,
content : 'puts 8'
}
]
}
end
let! ( :valid_mo_params ) do
{
2017-02-02 09:24:30 -05:00
branch : 'master' ,
2016-08-29 19:58:32 -04:00
commit_message : message ,
actions : [
{
action : 'create' ,
file_path : 'foo/bar/baz.txt' ,
content : 'puts 8'
} ,
{
action : 'delete' ,
file_path : 'Gemfile.zip'
} ,
{
action : 'move' ,
file_path : 'VERSION.txt' ,
previous_path : 'VERSION' ,
content : '6.7.0.pre'
} ,
{
action : 'update' ,
file_path : 'files/ruby/popen.rb' ,
content : 'puts 8'
}
]
}
end
it 'are commited as one in project repo' do
post api ( url , user ) , valid_mo_params
expect ( response ) . to have_http_status ( 201 )
expect ( json_response [ 'title' ] ) . to eq ( message )
end
it 'return a 400 bad request if there are any issues' do
post api ( url , user ) , invalid_mo_params
expect ( response ) . to have_http_status ( 400 )
end
end
end
describe " Get a single commit " do
2014-02-18 05:41:21 -05:00
context " authorized user " do
2016-08-01 11:00:44 -04:00
it " returns a commit by sha " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } " , user )
2016-07-27 05:02:49 -04:00
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 200 )
2016-10-27 09:26:58 -04:00
commit = project . repository . commit
expect ( json_response [ 'id' ] ) . to eq ( commit . id )
expect ( json_response [ 'short_id' ] ) . to eq ( commit . short_id )
expect ( json_response [ 'title' ] ) . to eq ( commit . title )
expect ( json_response [ 'message' ] ) . to eq ( commit . safe_message )
expect ( json_response [ 'author_name' ] ) . to eq ( commit . author_name )
expect ( json_response [ 'author_email' ] ) . to eq ( commit . author_email )
expect ( json_response [ 'authored_date' ] ) . to eq ( commit . authored_date . iso8601 ( 3 ) )
expect ( json_response [ 'committer_name' ] ) . to eq ( commit . committer_name )
expect ( json_response [ 'committer_email' ] ) . to eq ( commit . committer_email )
expect ( json_response [ 'committed_date' ] ) . to eq ( commit . committed_date . iso8601 ( 3 ) )
expect ( json_response [ 'parent_ids' ] ) . to eq ( commit . parent_ids )
expect ( json_response [ 'stats' ] [ 'additions' ] ) . to eq ( commit . stats . additions )
expect ( json_response [ 'stats' ] [ 'deletions' ] ) . to eq ( commit . stats . deletions )
expect ( json_response [ 'stats' ] [ 'total' ] ) . to eq ( commit . stats . total )
2014-02-18 05:41:21 -05:00
end
2016-08-01 11:00:44 -04:00
it " returns a 404 error if not found " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits/invalid_sha " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 404 )
2014-02-18 05:41:21 -05:00
end
2015-10-06 06:01:16 -04:00
2016-08-01 11:00:44 -04:00
it " returns nil for commit without CI " do
2015-10-06 06:01:16 -04:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } " , user )
2016-08-11 09:22:35 -04:00
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 200 )
2016-04-11 10:55:40 -04:00
expect ( json_response [ 'status' ] ) . to be_nil
2015-10-06 06:01:16 -04:00
end
2016-08-01 11:00:44 -04:00
it " returns status for CI " do
2016-08-15 12:43:06 -04:00
pipeline = project . ensure_pipeline ( 'master' , project . repository . commit . sha )
2016-08-11 09:22:35 -04:00
pipeline . update ( status : 'success' )
2015-10-06 06:01:16 -04:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } " , user )
2016-08-11 09:22:35 -04:00
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 200 )
2016-06-03 10:28:15 -04:00
expect ( json_response [ 'status' ] ) . to eq ( pipeline . status )
2015-10-06 06:01:16 -04:00
end
2016-08-11 09:22:35 -04:00
it " returns status for CI when pipeline is created " do
2016-08-15 12:43:06 -04:00
project . ensure_pipeline ( 'master' , project . repository . commit . sha )
2016-08-11 09:22:35 -04:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } " , user )
expect ( response ) . to have_http_status ( 200 )
2016-09-18 15:41:45 -04:00
expect ( json_response [ 'status' ] ) . to eq ( " created " )
2016-08-11 09:22:35 -04:00
end
2014-02-18 05:41:21 -05:00
end
context " unauthorized user " do
2016-08-01 11:00:44 -04:00
it " does not return the selected commit " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } " )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 401 )
2014-02-18 05:41:21 -05:00
end
end
end
2016-08-29 19:58:32 -04:00
describe " Get the diff of a commit " do
2014-02-18 05:41:21 -05:00
context " authorized user " do
before { project . team << [ user2 , :reporter ] }
2016-08-01 11:00:44 -04:00
it " returns the diff of the selected commit " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /diff " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 200 )
2014-02-18 05:41:21 -05:00
2015-02-12 13:17:35 -05:00
expect ( json_response ) . to be_an Array
expect ( json_response . length ) . to be > = 1
expect ( json_response . first . keys ) . to include " diff "
2014-02-18 05:41:21 -05:00
end
2016-08-01 11:00:44 -04:00
it " returns a 404 error if invalid commit " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits/invalid_sha/diff " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 404 )
2014-02-18 05:41:21 -05:00
end
end
context " unauthorized user " do
2016-08-01 11:00:44 -04:00
it " does not return the diff of the selected commit " do
2014-02-18 05:41:21 -05:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /diff " )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 401 )
2014-02-18 05:41:21 -05:00
end
end
end
2014-06-27 10:48:30 -04:00
2016-08-29 19:58:32 -04:00
describe 'Get the comments of a commit' do
2014-06-27 10:48:30 -04:00
context 'authorized user' do
2016-08-01 11:00:44 -04:00
it 'returns merge_request comments' do
2014-06-27 10:48:30 -04:00
get api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /comments " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 200 )
2017-01-24 15:49:10 -05:00
expect ( response ) . to include_pagination_headers
2015-02-12 13:17:35 -05:00
expect ( json_response ) . to be_an Array
2015-05-08 08:34:10 -04:00
expect ( json_response . length ) . to eq ( 2 )
2015-02-12 13:17:35 -05:00
expect ( json_response . first [ 'note' ] ) . to eq ( 'a comment on a commit' )
expect ( json_response . first [ 'author' ] [ 'id' ] ) . to eq ( user . id )
2014-06-27 10:48:30 -04:00
end
2016-08-01 11:00:44 -04:00
it 'returns a 404 error if merge_request_id not found' do
2014-06-27 10:48:30 -04:00
get api ( " /projects/ #{ project . id } /repository/commits/1234ab/comments " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 404 )
2014-06-27 10:48:30 -04:00
end
end
context 'unauthorized user' do
2016-08-01 11:00:44 -04:00
it 'does not return the diff of the selected commit' do
2014-06-27 10:48:30 -04:00
get api ( " /projects/ #{ project . id } /repository/commits/1234ab/comments " )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 401 )
2014-06-27 10:48:30 -04:00
end
end
2017-02-15 08:24:18 -05:00
context 'when the commit is present on two projects' do
let ( :forked_project ) { create ( :project , :repository , creator : user2 , namespace : user2 . namespace ) }
let! ( :forked_project_note ) { create ( :note_on_commit , author : user2 , project : forked_project , commit_id : forked_project . repository . commit . id , note : 'a comment on a commit for fork' ) }
it 'returns the comments for the target project' do
get api ( " /projects/ #{ forked_project . id } /repository/commits/ #{ forked_project . repository . commit . id } /comments " , user2 )
expect ( response ) . to have_http_status ( 200 )
expect ( json_response . length ) . to eq ( 1 )
expect ( json_response . first [ 'note' ] ) . to eq ( 'a comment on a commit for fork' )
expect ( json_response . first [ 'author' ] [ 'id' ] ) . to eq ( user2 . id )
end
end
2014-06-27 10:48:30 -04:00
end
2016-12-12 07:04:13 -05:00
describe 'POST :id/repository/commits/:sha/cherry_pick' do
let ( :master_pickable_commit ) { project . commit ( '7d3b0f7cff5f37573aea97cebfd5692ea1689924' ) }
context 'authorized user' do
it 'cherry picks a commit' do
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " , user ) , branch : 'master'
expect ( response ) . to have_http_status ( 201 )
expect ( json_response [ 'title' ] ) . to eq ( master_pickable_commit . title )
expect ( json_response [ 'message' ] ) . to eq ( master_pickable_commit . message )
expect ( json_response [ 'author_name' ] ) . to eq ( master_pickable_commit . author_name )
expect ( json_response [ 'committer_name' ] ) . to eq ( user . name )
end
it 'returns 400 if commit is already included in the target branch' do
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " , user ) , branch : 'markdown'
expect ( response ) . to have_http_status ( 400 )
expect ( json_response [ 'message' ] ) . to eq ( ' Sorry , we cannot cherry - pick this commit automatically .
2016-12-14 03:26:19 -05:00
A cherry - pick may have already been performed with this commit , or a more recent commit may have updated some of its content . ' )
2016-12-12 07:04:13 -05:00
end
it 'returns 400 if you are not allowed to push to the target branch' do
project . team << [ user2 , :developer ]
protected_branch = create ( :protected_branch , project : project , name : 'feature' )
2016-12-13 02:26:14 -05:00
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " , user2 ) , branch : protected_branch . name
2016-12-12 07:04:13 -05:00
expect ( response ) . to have_http_status ( 400 )
expect ( json_response [ 'message' ] ) . to eq ( 'You are not allowed to push into this branch' )
end
it 'returns 400 for missing parameters' do
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " , user )
expect ( response ) . to have_http_status ( 400 )
expect ( json_response [ 'error' ] ) . to eq ( 'branch is missing' )
end
it 'returns 404 if commit is not found' do
post api ( " /projects/ #{ project . id } /repository/commits/abcd0123/cherry_pick " , user ) , branch : 'master'
expect ( response ) . to have_http_status ( 404 )
expect ( json_response [ 'message' ] ) . to eq ( '404 Commit Not Found' )
end
it 'returns 404 if branch is not found' do
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " , user ) , branch : 'foo'
expect ( response ) . to have_http_status ( 404 )
expect ( json_response [ 'message' ] ) . to eq ( '404 Branch Not Found' )
end
it 'returns 400 for missing parameters' do
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " , user )
expect ( response ) . to have_http_status ( 400 )
expect ( json_response [ 'error' ] ) . to eq ( 'branch is missing' )
end
end
context 'unauthorized user' do
it 'does not cherry pick the commit' do
post api ( " /projects/ #{ project . id } /repository/commits/ #{ master_pickable_commit . id } /cherry_pick " ) , branch : 'master'
expect ( response ) . to have_http_status ( 401 )
end
end
end
2016-08-29 19:58:32 -04:00
describe 'Post comment to commit' do
2014-06-27 10:48:30 -04:00
context 'authorized user' do
2016-08-01 11:00:44 -04:00
it 'returns comment' do
2014-06-27 10:48:30 -04:00
post api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /comments " , user ) , note : 'My comment'
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 201 )
2015-02-12 13:17:35 -05:00
expect ( json_response [ 'note' ] ) . to eq ( 'My comment' )
expect ( json_response [ 'path' ] ) . to be_nil
expect ( json_response [ 'line' ] ) . to be_nil
expect ( json_response [ 'line_type' ] ) . to be_nil
2014-06-27 10:48:30 -04:00
end
2016-08-01 11:00:44 -04:00
it 'returns the inline comment' do
2016-10-03 08:11:16 -04:00
post api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /comments " , user ) , note : 'My comment' , path : project . repository . commit . raw_diffs . first . new_path , line : 1 , line_type : 'new'
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 201 )
2015-02-12 13:17:35 -05:00
expect ( json_response [ 'note' ] ) . to eq ( 'My comment' )
2016-07-27 13:00:34 -04:00
expect ( json_response [ 'path' ] ) . to eq ( project . repository . commit . raw_diffs . first . new_path )
2016-10-03 08:11:16 -04:00
expect ( json_response [ 'line' ] ) . to eq ( 1 )
2015-02-12 13:17:35 -05:00
expect ( json_response [ 'line_type' ] ) . to eq ( 'new' )
2014-06-27 10:48:30 -04:00
end
2016-08-01 11:00:44 -04:00
it 'returns 400 if note is missing' do
2014-06-27 10:48:30 -04:00
post api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /comments " , user )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 400 )
2014-06-27 10:48:30 -04:00
end
2016-08-01 11:00:44 -04:00
it 'returns 404 if note is attached to non existent commit' do
2014-06-27 10:48:30 -04:00
post api ( " /projects/ #{ project . id } /repository/commits/1234ab/comments " , user ) , note : 'My comment'
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 404 )
2014-06-27 10:48:30 -04:00
end
end
context 'unauthorized user' do
2016-08-01 11:00:44 -04:00
it 'does not return the diff of the selected commit' do
2014-06-27 10:48:30 -04:00
post api ( " /projects/ #{ project . id } /repository/commits/ #{ project . repository . commit . id } /comments " )
2016-06-27 14:10:42 -04:00
expect ( response ) . to have_http_status ( 401 )
2014-06-27 10:48:30 -04:00
end
end
end
2014-02-18 05:41:21 -05:00
end