OSDN Git Service

f31b4da90cd320f9e2273e1c7ada14eca894e72e
[wvm/gitlab.git] / spec / requests / api / merge_requests_spec.rb
1 require "spec_helper"
2
3 describe API::API do
4   include ApiHelpers
5   before(:each) { ActiveRecord::Base.observers.enable(:user_observer) }
6   after(:each) { ActiveRecord::Base.observers.disable(:user_observer) }
7   let(:user) { create(:user) }
8   let!(:project) {create(:project_with_code, creator_id: user.id, namespace: user.namespace) }
9   let!(:merge_request) { create(:merge_request, author: user, assignee: user, source_project: project, target_project: project, title: "Test") }
10   before {
11     project.team << [user, :reporters]
12   }
13
14   describe "GET /projects/:id/merge_requests" do
15     context "when unauthenticated" do
16       it "should return authentication error" do
17         get api("/projects/#{project.id}/merge_requests")
18         response.status.should == 401
19       end
20     end
21
22     context "when authenticated" do
23       it "should return an array of merge_requests" do
24         get api("/projects/#{project.id}/merge_requests", user)
25         response.status.should == 200
26         json_response.should be_an Array
27         json_response.first['title'].should == merge_request.title
28       end
29     end
30   end
31
32   describe "GET /projects/:id/merge_request/:merge_request_id" do
33     it "should return merge_request" do
34       get api("/projects/#{project.id}/merge_request/#{merge_request.id}", user)
35       response.status.should == 200
36       json_response['title'].should == merge_request.title
37       json_response['iid'].should == merge_request.iid
38     end
39
40     it "should return a 404 error if merge_request_id not found" do
41       get api("/projects/#{project.id}/merge_request/999", user)
42       response.status.should == 404
43     end
44   end
45
46   describe "POST /projects/:id/merge_requests" do
47     context 'between branches projects' do
48       it "should return merge_request" do
49         post api("/projects/#{project.id}/merge_requests", user),
50              title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user
51         response.status.should == 201
52         json_response['title'].should == 'Test merge_request'
53       end
54
55       it "should return 422 when source_branch equals target_branch" do
56         post api("/projects/#{project.id}/merge_requests", user),
57              title: "Test merge_request", source_branch: "master", target_branch: "master", author: user
58         response.status.should == 422
59       end
60
61       it "should return 400 when source_branch is missing" do
62         post api("/projects/#{project.id}/merge_requests", user),
63              title: "Test merge_request", target_branch: "master", author: user
64         response.status.should == 400
65       end
66
67       it "should return 400 when target_branch is missing" do
68         post api("/projects/#{project.id}/merge_requests", user),
69              title: "Test merge_request", source_branch: "stable", author: user
70         response.status.should == 400
71       end
72
73       it "should return 400 when title is missing" do
74         post api("/projects/#{project.id}/merge_requests", user),
75              target_branch: 'master', source_branch: 'stable'
76         response.status.should == 400
77       end
78     end
79
80     context 'forked projects' do
81       let!(:user2) {create(:user)}
82       let!(:forked_project_link) { build(:forked_project_link) }
83       let!(:fork_project) {  create(:source_project_with_code, forked_project_link: forked_project_link,  namespace: user2.namespace, creator_id: user2.id)  }
84       let!(:unrelated_project) {  create(:target_project_with_code,  namespace: user2.namespace, creator_id: user2.id)  }
85
86       before :each do |each|
87         fork_project.team << [user2, :reporters]
88         forked_project_link.forked_from_project = project
89         forked_project_link.forked_to_project = fork_project
90         forked_project_link.save!
91       end
92
93       it "should return merge_request" do
94         post api("/projects/#{fork_project.id}/merge_requests", user2),
95              title: 'Test merge_request', source_branch: "stable", target_branch: "master", author: user2, target_project_id: project.id
96         response.status.should == 201
97         json_response['title'].should == 'Test merge_request'
98       end
99
100       it "should not return 422 when source_branch equals target_branch" do
101         project.id.should_not == fork_project.id
102         fork_project.forked?.should be_true
103         fork_project.forked_from_project.should == project
104         post api("/projects/#{fork_project.id}/merge_requests", user2),
105              title: 'Test merge_request', source_branch: "master", target_branch: "master", author: user2, target_project_id: project.id
106         response.status.should == 201
107         json_response['title'].should == 'Test merge_request'
108       end
109
110       it "should return 400 when source_branch is missing" do
111         post api("/projects/#{fork_project.id}/merge_requests", user2),
112              title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
113         response.status.should == 400
114       end
115
116       it "should return 400 when target_branch is missing" do
117         post api("/projects/#{fork_project.id}/merge_requests", user2),
118              title: 'Test merge_request', target_branch: "master", author: user2, target_project_id: project.id
119         response.status.should == 400
120       end
121
122       it "should return 400 when title is missing" do
123         post api("/projects/#{fork_project.id}/merge_requests", user2),
124              target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: project.id
125         response.status.should == 400
126       end
127
128       it "should return 400 when target_branch is specified and not a forked project" do
129         post api("/projects/#{project.id}/merge_requests", user),
130              title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user, target_project_id: fork_project.id
131         response.status.should == 400
132       end
133
134       it "should return 400 when target_branch is specified and for a different fork" do
135         post api("/projects/#{fork_project.id}/merge_requests", user2),
136              title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: unrelated_project.id
137         response.status.should == 400
138       end
139
140       it "should return 201 when target_branch is specified and for the same project" do
141         post api("/projects/#{fork_project.id}/merge_requests", user2),
142              title: 'Test merge_request', target_branch: 'master', source_branch: 'stable', author: user2, target_project_id: fork_project.id
143         response.status.should == 201
144       end
145     end
146   end
147
148   describe "PUT /projects/:id/merge_request/:merge_request_id to close MR" do
149     it "should return merge_request" do
150       put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), state_event: "close"
151       response.status.should == 200
152       json_response['state'].should == 'closed'
153     end
154   end
155
156   describe "PUT /projects/:id/merge_request/:merge_request_id to merge MR" do
157     it "should return merge_request" do
158       put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), state_event: "merge"
159       response.status.should == 200
160       json_response['state'].should == 'merged'
161     end
162   end
163
164   describe "PUT /projects/:id/merge_request/:merge_request_id" do
165     it "should return merge_request" do
166       put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), title: "New title"
167       response.status.should == 200
168       json_response['title'].should == 'New title'
169     end
170
171     it "should return 422 when source_branch and target_branch are renamed the same" do
172       put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user),
173           source_branch: "master", target_branch: "master"
174       response.status.should == 422
175     end
176
177     it "should return merge_request with renamed target_branch" do
178       put api("/projects/#{project.id}/merge_request/#{merge_request.id}", user), target_branch: "wiki"
179       response.status.should == 200
180       json_response['target_branch'].should == 'wiki'
181     end
182   end
183
184   describe "POST /projects/:id/merge_request/:merge_request_id/comments" do
185     it "should return comment" do
186       post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user), note: "My comment"
187       response.status.should == 201
188       json_response['note'].should == 'My comment'
189     end
190
191     it "should return 400 if note is missing" do
192       post api("/projects/#{project.id}/merge_request/#{merge_request.id}/comments", user)
193       response.status.should == 400
194     end
195
196     it "should return 404 if note is attached to non existent merge request" do
197       post api("/projects/#{project.id}/merge_request/111/comments", user), note: "My comment"
198       response.status.should == 404
199     end
200   end
201
202 end