2012-10-25 06:13:01 -04:00
require " spec_helper "
2014-04-11 15:45:56 -04:00
describe API :: API , api : true do
2012-10-25 06:13:01 -04:00
include ApiHelpers
2013-04-25 10:15:33 -04:00
let ( :user ) { create ( :user ) }
2014-01-22 14:03:52 -05:00
let! ( :project ) { create ( :project , creator_id : user . id , namespace : user . namespace ) }
2014-04-03 05:05:21 -04:00
let! ( :merge_request ) { create ( :merge_request , :simple , author : user , assignee : user , source_project : project , target_project : project , title : " Test " ) }
2014-04-04 12:32:53 -04:00
let! ( :merge_request_closed ) { create ( :merge_request , state : " closed " , author : user , assignee : user , source_project : project , target_project : project , title : " Closed test " ) }
let! ( :merge_request_merged ) { create ( :merge_request , state : " merged " , author : user , assignee : user , source_project : project , target_project : project , title : " Merged test " ) }
2014-03-19 14:07:51 -04:00
let! ( :note ) { create ( :note_on_merge_request , author : user , project : project , noteable : merge_request , note : " a comment on a MR " ) }
2013-04-25 10:15:33 -04:00
before {
project . team << [ user , :reporters ]
}
2012-10-25 06:13:01 -04:00
describe " GET /projects/:id/merge_requests " do
context " when unauthenticated " do
it " should return authentication error " do
2013-09-21 17:46:36 -04:00
get api ( " /projects/ #{ project . id } /merge_requests " )
2012-10-25 06:13:01 -04:00
response . status . should == 401
end
end
context " when authenticated " do
2014-04-04 12:32:53 -04:00
it " should return an array of all merge_requests " do
2013-09-21 17:46:36 -04:00
get api ( " /projects/ #{ project . id } /merge_requests " , user )
2012-10-25 06:13:01 -04:00
response . status . should == 200
json_response . should be_an Array
2014-04-04 12:32:53 -04:00
json_response . length . should == 3
2012-10-25 06:13:01 -04:00
json_response . first [ 'title' ] . should == merge_request . title
end
2014-04-04 12:32:53 -04:00
it " should return an array of all merge_requests " do
get api ( " /projects/ #{ project . id } /merge_requests?state " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 3
json_response . first [ 'title' ] . should == merge_request . title
end
it " should return an array of open merge_requests " do
get api ( " /projects/ #{ project . id } /merge_requests?state=opened " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 1
json_response . first [ 'title' ] . should == merge_request . title
end
it " should return an array of closed merge_requests " do
get api ( " /projects/ #{ project . id } /merge_requests?state=closed " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 2
json_response . first [ 'title' ] . should == merge_request_closed . title
json_response . second [ 'title' ] . should == merge_request_merged . title
end
it " should return an array of merged merge_requests " do
get api ( " /projects/ #{ project . id } /merge_requests?state=merged " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 1
json_response . first [ 'title' ] . should == merge_request_merged . title
end
2014-09-15 05:54:16 -04:00
context " with ordering " do
before do
@mr_later = mr_with_later_created_and_updated_at_time
@mr_earlier = mr_with_earlier_created_and_updated_at_time
end
it " should return an array of merge_requests in ascending order " do
get api ( " /projects/ #{ project . id } /merge_requests?sort=asc " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 3
json_response . first [ 'id' ] . should == @mr_earlier . id
json_response . last [ 'id' ] . should == @mr_later . id
end
it " should return an array of merge_requests in descending order " do
get api ( " /projects/ #{ project . id } /merge_requests?sort=desc " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 3
json_response . first [ 'id' ] . should == @mr_later . id
json_response . last [ 'id' ] . should == @mr_earlier . id
end
it " should return an array of merge_requests ordered by updated_at " do
get api ( " /projects/ #{ project . id } /merge_requests?order_by=updated_at " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 3
json_response . first [ 'id' ] . should == @mr_earlier . id
json_response . last [ 'id' ] . should == @mr_later . id
end
it " should return an array of merge_requests ordered by created_at " do
get api ( " /projects/ #{ project . id } /merge_requests?sort=created_at " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 3
json_response . first [ 'id' ] . should == @mr_earlier . id
json_response . last [ 'id' ] . should == @mr_later . id
end
2014-09-09 11:39:53 -04:00
end
2012-10-25 06:13:01 -04:00
end
end
describe " GET /projects/:id/merge_request/:merge_request_id " do
it " should return merge_request " do
2013-09-21 17:46:36 -04:00
get api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " , user )
2012-10-25 06:13:01 -04:00
response . status . should == 200
json_response [ 'title' ] . should == merge_request . title
2013-10-14 09:39:54 -04:00
json_response [ 'iid' ] . should == merge_request . iid
2012-10-25 06:13:01 -04:00
end
2013-02-13 09:48:52 -05:00
it " should return a 404 error if merge_request_id not found " do
2013-09-21 17:46:36 -04:00
get api ( " /projects/ #{ project . id } /merge_request/999 " , user )
2013-02-13 09:48:52 -05:00
response . status . should == 404
end
2012-10-25 06:13:01 -04:00
end
describe " POST /projects/:id/merge_requests " do
2013-04-25 10:15:33 -04:00
context 'between branches projects' do
it " should return merge_request " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
2014-08-14 04:17:52 -04:00
title : 'Test merge_request' ,
source_branch : 'stable' ,
target_branch : 'master' ,
author : user ,
labels : 'label, label2'
2013-04-25 10:15:33 -04:00
response . status . should == 201
json_response [ 'title' ] . should == 'Test merge_request'
2014-08-14 04:17:52 -04:00
json_response [ 'labels' ] . should == [ 'label' , 'label2' ]
2013-04-25 10:15:33 -04:00
end
2013-02-05 11:13:47 -05:00
2013-04-25 10:15:33 -04:00
it " should return 422 when source_branch equals target_branch " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
2014-01-22 14:59:09 -05:00
title : " Test merge_request " , source_branch : " master " , target_branch : " master " , author : user
2013-04-25 10:15:33 -04:00
response . status . should == 422
end
2013-02-05 11:13:47 -05:00
2013-04-25 10:15:33 -04:00
it " should return 400 when source_branch is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
2014-01-22 14:59:09 -05:00
title : " Test merge_request " , target_branch : " master " , author : user
2013-04-25 10:15:33 -04:00
response . status . should == 400
end
2013-02-05 11:13:47 -05:00
2013-04-25 10:15:33 -04:00
it " should return 400 when target_branch is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
2014-01-22 14:59:09 -05:00
title : " Test merge_request " , source_branch : " stable " , author : user
2013-04-25 10:15:33 -04:00
response . status . should == 400
end
it " should return 400 when title is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
2014-01-22 14:59:09 -05:00
target_branch : 'master' , source_branch : 'stable'
2013-04-25 10:15:33 -04:00
response . status . should == 400
end
2014-08-14 04:17:52 -04:00
2014-08-20 14:34:55 -04:00
it 'should return 400 on invalid label names' do
2014-08-14 04:17:52 -04:00
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
title : 'Test merge_request' ,
source_branch : 'stable' ,
target_branch : 'master' ,
author : user ,
labels : 'label, ?'
2014-08-20 14:34:55 -04:00
response . status . should == 400
json_response [ 'message' ] [ 'labels' ] [ '?' ] [ 'title' ] . should ==
[ 'is invalid' ]
2014-08-14 04:17:52 -04:00
end
2014-08-18 14:09:09 -04:00
context 'with existing MR' do
before do
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
title : 'Test merge_request' ,
source_branch : 'stable' ,
target_branch : 'master' ,
author : user
@mr = MergeRequest . all . last
end
it 'should return 409 when MR already exists for source/target' do
expect do
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
title : 'New test merge_request' ,
source_branch : 'stable' ,
target_branch : 'master' ,
author : user
end . to change { MergeRequest . count } . by ( 0 )
response . status . should == 409
end
end
2013-02-05 11:13:47 -05:00
end
2013-02-27 09:07:42 -05:00
2013-04-25 10:15:33 -04:00
context 'forked projects' do
2014-04-03 05:05:21 -04:00
let! ( :user2 ) { create ( :user ) }
let! ( :fork_project ) { create ( :project , forked_from_project : project , namespace : user2 . namespace , creator_id : user2 . id ) }
let! ( :unrelated_project ) { create ( :project , namespace : create ( :user ) . namespace , creator_id : user2 . id ) }
2013-04-25 10:15:33 -04:00
before :each do | each |
fork_project . team << [ user2 , :reporters ]
end
it " should return merge_request " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
2014-03-10 15:39:29 -04:00
title : 'Test merge_request' , source_branch : " stable " , target_branch : " master " , author : user2 , target_project_id : project . id , description : 'Test description for Test merge_request'
2013-04-25 10:15:33 -04:00
response . status . should == 201
json_response [ 'title' ] . should == 'Test merge_request'
2014-03-10 15:39:29 -04:00
json_response [ 'description' ] . should == 'Test description for Test merge_request'
2013-04-25 10:15:33 -04:00
end
it " should not return 422 when source_branch equals target_branch " do
2013-09-21 17:46:36 -04:00
project . id . should_not == fork_project . id
2013-04-25 10:15:33 -04:00
fork_project . forked? . should be_true
fork_project . forked_from_project . should == project
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
2014-01-22 14:59:09 -05:00
title : 'Test merge_request' , source_branch : " master " , target_branch : " master " , author : user2 , target_project_id : project . id
2013-04-25 10:15:33 -04:00
response . status . should == 201
json_response [ 'title' ] . should == 'Test merge_request'
end
it " should return 400 when source_branch is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
2014-01-22 14:59:09 -05:00
title : 'Test merge_request' , target_branch : " master " , author : user2 , target_project_id : project . id
2013-04-25 10:15:33 -04:00
response . status . should == 400
end
it " should return 400 when target_branch is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
2014-01-22 14:59:09 -05:00
title : 'Test merge_request' , target_branch : " master " , author : user2 , target_project_id : project . id
2013-04-25 10:15:33 -04:00
response . status . should == 400
end
it " should return 400 when title is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
2014-01-22 14:59:09 -05:00
target_branch : 'master' , source_branch : 'stable' , author : user2 , target_project_id : project . id
2013-04-25 10:15:33 -04:00
response . status . should == 400
end
2014-08-18 14:09:09 -04:00
context 'when target_branch is specified' do
it 'should return 422 if not a forked project' do
post api ( " /projects/ #{ project . id } /merge_requests " , user ) ,
title : 'Test merge_request' ,
target_branch : 'master' ,
source_branch : 'stable' ,
author : user ,
target_project_id : fork_project . id
response . status . should == 422
end
2013-06-03 16:20:50 -04:00
2014-08-18 14:09:09 -04:00
it 'should return 422 if targeting a different fork' do
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
title : 'Test merge_request' ,
target_branch : 'master' ,
source_branch : 'stable' ,
author : user2 ,
target_project_id : unrelated_project . id
response . status . should == 422
end
2013-06-03 16:20:50 -04:00
end
it " should return 201 when target_branch is specified and for the same project " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ fork_project . id } /merge_requests " , user2 ) ,
2014-01-22 14:59:09 -05:00
title : 'Test merge_request' , target_branch : 'master' , source_branch : 'stable' , author : user2 , target_project_id : fork_project . id
2013-06-03 16:20:50 -04:00
response . status . should == 201
end
2013-02-27 09:07:42 -05:00
end
2012-10-25 06:13:01 -04:00
end
2013-02-18 04:07:49 -05:00
describe " PUT /projects/:id/merge_request/:merge_request_id to close MR " do
it " should return merge_request " do
2013-09-21 17:46:36 -04:00
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " , user ) , state_event : " close "
2013-02-18 04:07:49 -05:00
response . status . should == 200
json_response [ 'state' ] . should == 'closed'
end
end
2014-05-13 04:01:40 -04:00
describe " PUT /projects/:id/merge_request/:merge_request_id/merge " do
it " should return merge_request in case of success " do
MergeRequest . any_instance . stub ( can_be_merged? : true , automerge! : true )
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /merge " , user )
2013-02-18 04:07:49 -05:00
response . status . should == 200
2014-05-13 04:01:40 -04:00
end
it " should return 405 if branch can't be merged " do
MergeRequest . any_instance . stub ( can_be_merged? : false )
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /merge " , user )
response . status . should == 405
json_response [ 'message' ] . should == 'Branch cannot be merged'
2013-02-18 04:07:49 -05:00
end
2014-05-13 06:20:10 -04:00
it " should return 405 if merge_request is not open " do
merge_request . close
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /merge " , user )
response . status . should == 405
2014-08-18 14:09:09 -04:00
json_response [ 'message' ] . should == '405 Method Not Allowed'
2014-05-13 06:20:10 -04:00
end
it " should return 401 if user has no permissions to merge " do
user2 = create ( :user )
project . team << [ user2 , :reporter ]
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /merge " , user2 )
response . status . should == 401
json_response [ 'message' ] . should == '401 Unauthorized'
end
2013-02-18 04:07:49 -05:00
end
2012-10-25 06:13:01 -04:00
describe " PUT /projects/:id/merge_request/:merge_request_id " do
it " should return merge_request " do
2013-09-21 17:46:36 -04:00
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " , user ) , title : " New title "
2012-10-25 06:13:01 -04:00
response . status . should == 200
2012-11-05 22:31:55 -05:00
json_response [ 'title' ] . should == 'New title'
2012-10-25 06:13:01 -04:00
end
2013-02-05 11:13:47 -05:00
2014-03-10 15:39:29 -04:00
it " should return merge_request " do
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " , user ) , description : " New description "
response . status . should == 200
json_response [ 'description' ] . should == 'New description'
end
2013-02-05 11:13:47 -05:00
it " should return 422 when source_branch and target_branch are renamed the same " do
2013-09-21 17:46:36 -04:00
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " , user ) ,
2014-01-22 14:59:09 -05:00
source_branch : " master " , target_branch : " master "
2013-02-05 11:13:47 -05:00
response . status . should == 422
end
it " should return merge_request with renamed target_branch " do
2013-09-21 17:46:36 -04:00
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " , user ) , target_branch : " wiki "
2013-02-05 11:13:47 -05:00
response . status . should == 200
2013-04-25 10:15:33 -04:00
json_response [ 'target_branch' ] . should == 'wiki'
2013-02-05 11:13:47 -05:00
end
2014-08-14 04:17:52 -04:00
2014-08-20 14:34:55 -04:00
it 'should return 400 on invalid label names' do
2014-08-14 04:17:52 -04:00
put api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } " ,
user ) ,
title : 'new issue' ,
labels : 'label, ?'
2014-08-20 14:34:55 -04:00
response . status . should == 400
json_response [ 'message' ] [ 'labels' ] [ '?' ] [ 'title' ] . should == [ 'is invalid' ]
2014-08-14 04:17:52 -04:00
end
2012-10-25 06:13:01 -04:00
end
describe " POST /projects/:id/merge_request/:merge_request_id/comments " do
it " should return comment " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /comments " , user ) , note : " My comment "
2012-10-25 06:13:01 -04:00
response . status . should == 201
2012-11-05 22:31:55 -05:00
json_response [ 'note' ] . should == 'My comment'
2012-10-25 06:13:01 -04:00
end
2013-02-05 12:37:44 -05:00
it " should return 400 if note is missing " do
2013-09-21 17:46:36 -04:00
post api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /comments " , user )
2013-02-05 12:37:44 -05:00
response . status . should == 400
end
2013-02-06 08:59:47 -05:00
it " should return 404 if note is attached to non existent merge request " do
2014-08-18 14:09:09 -04:00
post api ( " /projects/ #{ project . id } /merge_request/404/comments " , user ) ,
note : 'My comment'
2013-02-06 08:59:47 -05:00
response . status . should == 404
end
2012-10-25 06:13:01 -04:00
end
2014-03-19 14:07:51 -04:00
describe " GET :id/merge_request/:merge_request_id/comments " do
it " should return merge_request comments " do
get api ( " /projects/ #{ project . id } /merge_request/ #{ merge_request . id } /comments " , user )
response . status . should == 200
json_response . should be_an Array
json_response . length . should == 1
json_response . first [ 'note' ] . should == " a comment on a MR "
json_response . first [ 'author' ] [ 'id' ] . should == user . id
end
it " should return a 404 error if merge_request_id not found " do
get api ( " /projects/ #{ project . id } /merge_request/999/comments " , user )
response . status . should == 404
end
end
2014-09-15 05:54:16 -04:00
def mr_with_later_created_and_updated_at_time
merge_request
merge_request . created_at += 1 . hour
merge_request . updated_at += 30 . minutes
merge_request . save
merge_request
end
def mr_with_earlier_created_and_updated_at_time
merge_request_closed
merge_request_closed . created_at -= 1 . hour
merge_request_closed . updated_at -= 30 . minutes
merge_request_closed . save
merge_request_closed
end
2012-10-25 06:13:01 -04:00
end