Blob of spec/controllers/merge_requests_controller_spec.rb (raw blob data)

1 require File.dirname(__FILE__) + '/../spec_helper'
2
3 describe MergeRequestsController do
4
5 before(:each) do
6 @project = projects(:johans)
7 @repository = repositories(:johans2)
8 @mainline_repository = repositories(:johans)
9 @merge_request = merge_requests(:moes_to_johans)
10 end
11
12 describe "#index (GET)" do
13 def do_get
14 get :index, :project_id => @project.slug,
15 :repository_id => @repository.name
16 end
17
18 it "should not require login" do
19 session[:user_id] = nil
20 do_get
21 response.should_not redirect_to(new_sessions_path)
22 end
23
24 it "gets all the merge requests in the repository" do
25 do_get
26 assigns[:merge_requests].should == @repository.merge_requests
27 end
28
29 it "gets a comment count for" do
30 do_get
31 assigns[:comment_count].should == @repository.comments.count
32 end
33 end
34
35 describe "#show (GET)" do
36 def do_get
37 get :show, :project_id => @project.slug,
38 :repository_id => repositories(:johans).name,
39 :id => @merge_request.id
40 end
41
42 it "should not require login" do
43 session[:user_id] = nil
44 MergeRequest.should_receive(:find).and_return(@merge_request)
45 [@merge_request.source_repository, @merge_request.target_repository].each do |r|
46 r.stub!(:git).and_return(mock("Git", :null_object => true))
47 end
48 do_get
49 response.should_not redirect_to(new_sessions_path)
50 end
51
52 it "gets a list of the commits to be merged" do
53 MergeRequest.should_receive(:find).and_return(@merge_request)
54 commits = [mock("commit"), mock("commit")]
55
56 target_repo = mock("target repo")
57 @merge_request.target_repository.stub!(:git).and_return(target_repo)
58
59 src_repo = mock("src repo")
60 @merge_request.source_repository.stub!(:git).and_return(src_repo)
61
62 target_repo.should_receive(:commit_deltas_from).with(
63 src_repo, @merge_request.target_branch, @merge_request.source_branch
64 ).and_return(commits)
65
66 do_get
67 assigns[:commits].should == commits
68 end
69 end
70
71 describe "#new (GET)" do
72 def do_get
73 get :new, :project_id => @project.slug,
74 :repository_id => @repository.name
75 end
76
77 it "requires login" do
78 session[:user_id] = nil
79 do_get
80 response.should redirect_to(new_sessions_path)
81 end
82
83 it "is successfull" do
84 login_as :johan
85 do_get
86 response.should be_success
87 end
88
89 it "assigns the new merge_requests' source_repository" do
90 login_as :johan
91 do_get
92 assigns[:merge_request].source_repository.should == @repository
93 end
94
95 it "gets a list of possible target clones" do
96 login_as :johan
97 do_get
98 assigns[:repositories].should == [repositories(:johans)]
99 end
100 end
101
102 describe "#create (POST)" do
103 def do_post(data={})
104 post :create, :project_id => @project.slug,
105 :repository_id => @repository.name, :merge_request => {
106 :target_repository_id => repositories(:johans2).id,
107 }.merge(data)
108 end
109
110 it "requires login" do
111 session[:user_id] = nil
112 do_post
113 response.should redirect_to(new_sessions_path)
114 end
115
116 it "scopes to the source_repository" do
117 login_as :johan
118 do_post
119 assigns[:merge_request].source_repository.should == @repository
120 end
121
122 it "scopes to the current_user" do
123 login_as :johan
124 do_post
125 assigns[:merge_request].user.should == users(:johan)
126 end
127
128 it "creates the record on successful data" do
129 login_as :johan
130 proc {
131 do_post
132 response.should redirect_to(project_repository_path(@project, @repository))
133 flash[:success].should match(/sent a merge request to "#{repositories(:johans2).name}"/i)
134 }.should change(MergeRequest, :count)
135 end
136
137 it "it re-renders on invalid data, with the target repos list" do
138 login_as :johan
139 do_post :target_repository => nil
140 response.should be_success
141 response.should render_template("merge_requests/new")
142 assigns[:repositories].should == [repositories(:johans)]
143 end
144 end
145
146 describe "#edit (GET)" do
147 def do_get
148 get :edit, :project_id => @project.slug,
149 :repository_id => @mainline_repository.name,
150 :id => @merge_request
151 end
152
153 it "requires login" do
154 session[:user_id] = nil
155 do_get
156 response.should redirect_to(new_sessions_path)
157 end
158
159 it "requires ownership to edit" do
160 login_as :moe
161 do_get
162 flash[:error].should match(/you're not the owner/i)
163 response.should be_redirect
164 end
165
166 it "is successfull" do
167 login_as :johan
168 do_get
169 response.should be_success
170 end
171
172 it "gets a list of possible target clones" do
173 login_as :johan
174 do_get
175 assigns[:repositories].should == [@repository]
176 end
177 end
178
179 describe "#update (PUT)" do
180 def do_put(data={})
181 put :update, :project_id => @project.slug,
182 :repository_id => @mainline_repository.name,
183 :id => @merge_request,
184 :merge_request => {
185 :target_repository_id => repositories(:johans2).id,
186 }.merge(data)
187 end
188
189 it "requires login" do
190 session[:user_id] = nil
191 do_put
192 response.should redirect_to(new_sessions_path)
193 end
194
195 it "requires ownership to update" do
196 login_as :moe
197 do_put
198 flash[:error].should match(/you're not the owner/i)
199 response.should be_redirect
200 end
201
202 it "scopes to the source_repository" do
203 login_as :johan
204 do_put
205 assigns[:merge_request].source_repository.should == @repository
206 end
207
208 it "scopes to the current_user" do
209 login_as :johan
210 do_put
211 assigns[:merge_request].user.should == users(:johan)
212 end
213
214 it "updates the record on successful data" do
215 login_as :johan
216 do_put :proposal => "hai, plz merge kthnkxbye"
217
218 response.should redirect_to(project_repository_merge_request_path(@project, @mainline_repository, @merge_request))
219 flash[:success].should match(/merge request was updated/i)
220 @merge_request.reload.proposal.should == "hai, plz merge kthnkxbye"
221 end
222
223 it "it re-renders on invalid data, with the target repos list" do
224 login_as :johan
225 do_put :target_repository => nil
226 response.should be_success
227 response.should render_template("merge_requests/edit")
228 assigns[:repositories].should == [@repository]
229 end
230
231 it "only allows the owner to update" do
232 login_as :moe
233 do_put
234 proc {
235 response.should redirect_to(project_repository_path(@project, @mainline_repository))
236 flash[:success].should == nil
237 flash[:error].should match(/You're not the owner of this merge request/i)
238 }.should_not change(MergeRequest, :count)
239 end
240 end
241
242 describe "#resolve (PUT)" do
243 def do_put(data={})
244 put :resolve, :project_id => @project.slug,
245 :repository_id => @mainline_repository.name,
246 :id => @merge_request,
247 :merge_request => {
248 :status => MergeRequest::STATUS_MERGED,
249 }.merge(data)
250 end
251
252 it "requires login" do
253 session[:user_id] = nil
254 do_put
255 response.should redirect_to(new_sessions_path)
256 end
257
258 it "requires ownership to resoble" do
259 login_as :moe
260 do_put
261 flash[:error].should match(/you're not permitted/i)
262 response.should be_redirect
263 end
264
265 it "updates the status" do
266 login_as :johan
267 do_put
268 flash[:notice].should == "The merge request was marked as merged"
269 response.should be_redirect
270 end
271 end
272
273 describe "#destroy (DELETE)" do
274 def do_delete
275 delete :destroy, :project_id => @project.slug,
276 :repository_id => @mainline_repository.name,
277 :id => @merge_request
278 end
279
280 it "requires login" do
281 session[:user_id] = nil
282 do_delete
283 response.should redirect_to(new_sessions_path)
284 end
285
286 it "scopes to the source_repository" do
287 login_as :johan
288 do_delete
289 assigns[:merge_request].source_repository.should == @repository
290 end
291
292 it "deletes the record" do
293 login_as :johan
294 do_delete
295 response.should redirect_to(project_repository_path(@project, @mainline_repository))
296 flash[:success].should match(/merge request was retracted/i)
297 MergeRequest.find_by_id(@merge_request.id).should == nil
298 end
299
300 it "only allows the owner to delete" do
301 login_as :moe
302 do_delete
303 proc {
304 response.should redirect_to(project_repository_path(@project, @mainline_repository))
305 flash[:success].should == nil
306 flash[:error].should match(/You're not the owner of this merge request/i)
307 }.should_not change(MergeRequest, :count)
308 end
309 end
310
311 end