Remove SslRequirement and associated logic
[gitorious:mainline.git] / test / functional / merge_requests_controller_test.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2012 Gitorious AS
4 #   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
5 #
6 #   This program is free software: you can redistribute it and/or modify
7 #   it under the terms of the GNU Affero General Public License as published by
8 #   the Free Software Foundation, either version 3 of the License, or
9 #   (at your option) any later version.
10 #
11 #   This program is distributed in the hope that it will be useful,
12 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
13 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 #   GNU Affero General Public License for more details.
15 #
16 #   You should have received a copy of the GNU Affero General Public License
17 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
18 #++
19
20 require "test_helper"
21
22 class MergeRequestsControllerTest < ActionController::TestCase
23   should_render_in_site_specific_context
24
25   def setup
26     setup_ssl_from_config
27     @project = projects(:johans)
28     @project.update_attribute(:merge_requests_need_signoff, false)
29     MergeRequestStatus.create_defaults_for_project(@project)
30     grit = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
31     Repository.any_instance.stubs(:git).returns(grit)
32     @source_repository = repositories(:johans2)
33     @target_repository = repositories(:johans)
34     @merge_request = merge_requests(:moes_to_johans_open)
35     @merge_request.stubs(:calculate_merge_base).returns("ff")
36     @merge_request.stubs(:commit_merged?).returns(true)
37     version = @merge_request.create_new_version
38     MergeRequestVersion.any_instance.stubs(:affected_commits).returns([])
39     @merge_request.versions << version
40     version.stubs(:merge_request).returns(@merge_request)
41     @merge_request.stubs(:commits_for_selection).returns([])
42     assert_not_nil @merge_request.versions.last
43   end
44
45   context "#index (GET)" do
46     should "not require login" do
47       session[:user_id] = nil
48       get :index, params
49       assert_response :success
50     end
51
52     should "gets all the merge requests in the repository" do
53       %w(html xml).each do |format|
54         get :index, params(:format => format)
55         assert_equal @target_repository.open_merge_requests, assigns(:open_merge_requests)
56       end
57     end
58
59     should "gets a comment count for" do
60       get :index, params
61       assert_equal @target_repository.comments.count, assigns(:comment_count)
62     end
63
64     should "filter on status" do
65       @merge_request.update_attribute(:status_tag, "merged")
66       get :index, params(:status => "merged")
67       assert_response :success
68       assert_equal [@merge_request], assigns(:open_merge_requests)
69     end
70
71     should "have the MergeRequestList breadcrumb as root" do
72       get :index, params
73       assert_instance_of Breadcrumb::MergeRequests, assigns(:root)
74     end
75
76     context "paginating merge requests" do
77       setup do
78         @params = params
79       end
80
81       should_scope_pagination_to(:index, MergeRequest, "merge requests")
82     end
83   end
84
85   context "#show (GET)" do
86     should "not require login" do
87       session[:user_id] = nil
88       MergeRequest.expects(:find_by_sequence_number!).returns(@merge_request)
89       stub_commits(@merge_request)
90       [@merge_request.source_repository, @merge_request.target_repository].each do |r|
91         r.stubs(:git).returns(stub_everything("Git"))
92       end
93
94       get :show, mr_params
95       assert_response :success
96       assert_select "h3", :content => "Add a new comment:"
97     end
98
99     should "get a list of the commits to be merged" do
100       %w(html patch xml).each do |format|
101         MergeRequest.expects(:find_by_sequence_number!).returns(@merge_request)
102         stub_commits(@merge_request)
103
104         get :show, mr_params(:format => format)
105         assert_response :success
106         assert_equal 2, assigns(:commits).size
107       end
108     end
109
110     should "allow committers to change status" do
111       login_as :johan
112       stub_commits(@merge_request)
113
114       get :show, mr_params
115       assert_response :success
116       assert_select "select#comment_state"
117     end
118
119     should "not display a comment change field unless the current user can change the MR" do
120       login_as :moe
121       assert !can_resolve_merge_request?(users(:moe), @merge_request)
122
123       get :show, mr_params
124       assert_response :success
125       assert_select "select#comment_state", false
126     end
127
128     should "display a comment change field if the current user can change the MR" do
129       login_as :johan
130       assert can_resolve_merge_request?(users(:johan), @merge_request)
131
132       get :show, mr_params
133       assert_response :success
134       assert_select "select#comment_state"
135     end
136
137     context "legacy merge requests" do
138       setup { @merge_request.update_attribute(:legacy, true) }
139
140       should "create a version for the legacy merge_requests" do
141         get :show, mr_params
142
143         assert_response :success
144         assert_template "merge_requests/legacy"
145       end
146     end
147
148     context "Git timeouts" do
149       setup do
150         MergeRequest.any_instance.stubs(:commits_to_be_merged).raises(Grit::Git::GitTimeout)
151         MergeRequestVersion.any_instance.stubs(:affected_commits).raises(Grit::Git::GitTimeout)
152       end
153
154       should "catch timeouts and render metadata only" do
155         get :show, mr_params
156
157         assert_response :success
158         assert assigns(:git_timeout_occured)
159       end
160     end
161
162     should "display 'how to merge' help with correct branch" do
163       stub_commits(@merge_request)
164       @merge_request.sequence_number = 399
165       @merge_request.target_branch = "superfly-feature"
166       @merge_request.save
167
168       get :show, mr_params
169
170       assert_response 200
171       assert @response.body.include?("git merge merge-requests/399")
172       assert @response.body.include?("git push origin superfly-feature")
173     end
174   end
175
176   context "#new (GET)" do
177     setup do
178       Grit::Repo.any_instance.stubs(:heads).returns([])
179     end
180
181     should "requires login" do
182       session[:user_id] = nil
183       get :new, params
184       assert_redirected_to(new_sessions_path)
185     end
186
187     should "is successful" do
188       login_as :johan
189       get :new, params
190       assert_response :success
191     end
192
193     should "assign to @project even when accessed through a user" do
194       johan = users(:johan)
195       login_as :johan
196       @source_repository.owner = johan
197       @source_repository.save!
198       get :new, params(:user_id => johan.to_param)
199       assert_response :success
200     end
201
202     should "assigns the new merge_requests' source_repository" do
203       login_as :johan
204       get :new, params(:repository_id => @source_repository.to_param)
205       assert_equal @source_repository, assigns(:merge_request).source_repository
206     end
207
208     should "gets a list of possible target clones" do
209       login_as :johan
210       get :new, params(:repository_id => @source_repository.to_param)
211       assert_equal [repositories(:johans)], assigns(:repositories)
212     end
213
214     should "not suggest merging with a non-MR repo" do
215       clone = Repository.new_by_cloning(@source_repository)
216       clone.name = "a-clone"
217       clone.user = users(:johan)
218       clone.owner = users(:johan)
219       clone.kind = Repository::KIND_USER_REPO
220       clone.merge_requests_enabled = false
221       assert clone.save
222       login_as :johan
223       get :new, params(:repository_id => @source_repository.to_param)
224       assert !assigns(:repositories).include?(clone)
225     end
226
227     should "suggest the parent of the source repo as target" do
228       login_as :johan
229       get :new, params(:repository_id => @source_repository.to_param)
230       assert_equal @source_repository.parent.id, assigns(:merge_request).target_repository_id
231     end
232   end
233
234   context "#create (POST)" do
235     setup do
236       Grit::Repo.any_instance.stubs(:heads).returns([])
237     end
238
239     should "require login" do
240       session[:user_id] = nil
241       do_post
242       assert_redirected_to(new_sessions_path)
243     end
244
245     should "scope to the source_repository" do
246       login_as :johan
247       do_post
248       assert_equal @source_repository, assigns(:merge_request).source_repository
249     end
250
251     should "scope to the current_user" do
252       login_as :johan
253       do_post
254       assert_equal users(:johan), assigns(:merge_request).user
255     end
256
257     should "create the record on successful data" do
258       login_as :johan
259       mock_token = mock("Mocked access token")
260       mock_token.stubs(:token).returns("key")
261       mock_token.stubs(:secret).returns("secret")
262       mock_token.stubs(:authorize_url).returns("http://oauth.example/authorize?key=123")
263       @project.update_attribute(:merge_requests_need_signoff, true)
264       @controller.expects(:obtain_oauth_request_token).returns(mock_token)
265       assert_difference("MergeRequest.count") do
266         do_post
267         assert_response :redirect
268         result = assigns(:merge_request)
269         assert_equal(terms_accepted_project_repository_merge_request_path(@source_repository.project, @target_repository, result), session[:return_to])
270       end
271     end
272
273     should "not require off-site signoff of terms unless the repository needs it" do
274       login_as(:johan)
275       post :create, :project_id => @project.to_param,
276       :repository_id => @target_repository.to_param, :merge_request => {
277         :target_repository_id => @source_repository.id,
278         :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
279         :summary => "some changes"
280       }
281       result = assigns(:merge_request)
282       assert !result.acceptance_of_terms_required?
283       assert result.open?
284       assert_match(/sent a merge request to "#{@source_repository.name}"/i, flash[:success])
285     end
286
287     should "create an event when the request does not require signof" do
288       login_as :johan
289       assert_difference("@project.events.count", 1) do
290         post :create, :project_id => @project.to_param,
291         :repository_id => @target_repository.to_param, :merge_request => {
292           :target_repository_id => @source_repository.id,
293           :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
294           :summary => "some changes"
295         }
296       end
297     end
298
299     should "it re-renders on invalid data, with the target repos list" do
300       login_as :johan
301       MergeRequest.any_instance.stubs(:save).returns(false)
302       do_post :target_repository => nil
303       assert_response :success
304       assert_template(("merge_requests/new"))
305       assert_equal [repositories(:johans)], assigns(:repositories)
306     end
307   end
308
309   context "Merge request landing page" do
310     should "GET the mergerequest landing page" do
311       login_as :johan
312       session[:return_to] = "/foo/bar"
313       get :oauth_return
314       assert_response :redirect
315       assert_redirected_to "/foo/bar"
316     end
317   end
318
319   context "Terms accepted (GET)" do
320     setup do
321       @merge_request = @source_repository.proposed_merge_requests.new({ :summary => "plz merge",
322                                                                         :proposal => "Would like this to be merged",
323                                                                         :user => users(:johan),
324                                                                         :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
325                                                                         :target_repository => @target_repository,
326                                                                         :summary => "foo" })
327       assert @merge_request.save
328       @merge_request.stubs(:commits_to_be_merged).returns([])
329       MergeRequest.stubs(:find_by_sequence_number!).returns(@merge_request)
330       login_as :johan
331     end
332
333     should "set the status to open when done authenticating thru OAuth" do
334       @merge_request.stubs(:valid_oauth_credentials?).returns(true)
335       @merge_request.expects(:terms_accepted)
336
337       get :terms_accepted, mr_params
338       assert_response :redirect
339     end
340
341     should "not set the status to open if OAuth authentication has not been performed" do
342       @merge_request.stubs(:valid_oauth_credentials?).returns(false)
343
344       get :terms_accepted, mr_params
345       assert_response :redirect
346       assert !@merge_request.open?
347     end
348   end
349
350   context "#edit (GET)" do
351     should "requires login" do
352       session[:user_id] = nil
353       do_edit_get
354       assert_redirected_to(new_sessions_path)
355     end
356
357     should "requires ownership to edit" do
358       login_as :moe
359       do_edit_get
360       assert_match(/you are not the owner/i, flash[:error])
361       assert_response :redirect
362     end
363
364     should "is successfull" do
365       login_as :johan
366       do_edit_get
367       assert_response :success
368     end
369
370     should "gets a list of possible target clones" do
371       login_as :johan
372       do_edit_get
373       assert_equal [@source_repository], assigns(:repositories)
374     end
375   end
376
377   context "commit_merged (GET)" do
378     setup do
379       @merge_request.stubs(:commit_merged?).with("ffc").returns(false)
380       @merge_request.stubs(:commit_merged?).with("ffo").returns(true)
381       MergeRequest.stubs(:find_by_sequence_number!).returns(@merge_request)
382     end
383
384     should "return false if the given commit has not been merged" do
385       do_commit_status_get(:commit_id => "ff0")
386       assert_response :success
387       assert_equal "true", @response.body
388     end
389
390     should "return true if the given commit has been merged" do
391       do_commit_status_get(:commit_id => "ffc")
392       assert_response :success
393       assert_equal "false", @response.body
394     end
395   end
396
397   context "#update (PUT)" do
398     should "requires login" do
399       session[:user_id] = nil
400       do_put
401       assert_redirected_to(new_sessions_path)
402     end
403
404     should "requires ownership to update" do
405       login_as :moe
406       do_put
407       assert_match(/you are not the owner/i, flash[:error])
408       assert_response :redirect
409     end
410
411     should "scopes to the source_repository" do
412       login_as :johan
413       do_put
414       assert_equal @source_repository, assigns(:merge_request).source_repository
415     end
416
417     should "scopes to the current_user" do
418       login_as :johan
419       do_put
420       assert_equal users(:johan), assigns(:merge_request).user
421     end
422
423     should "updates the record on successful data" do
424       login_as :johan
425       do_put :proposal => "hai, plz merge kthnkxbye"
426
427       assert_redirected_to(project_repository_merge_request_path(@project, @target_repository, @merge_request))
428       assert_match(/merge request was updated/i, flash[:success])
429       assert_equal "hai, plz merge kthnkxbye", @merge_request.reload.proposal
430     end
431
432     should "it re-renders on invalid data, with the target repos list" do
433       login_as :johan
434       MergeRequest.any_instance.stubs(:save).returns(false)
435       do_put :target_repository => nil
436       assert_response :success
437       assert_template(("merge_requests/edit"))
438       assert_equal [@source_repository], assigns(:repositories)
439     end
440
441     should "only allows the owner to update" do
442       login_as :moe
443       do_put
444       assert_no_difference("MergeRequest.count") do
445         assert_redirected_to(project_repository_path(@project, @target_repository))
446         assert_equal nil, flash[:success]
447         assert_match(/You are not the owner of this merge request/i, flash[:error])
448       end
449     end
450   end
451
452   context "#get commit_list" do
453     setup do
454       @commits = %w(ffcffcffc ff0ff0ff0).collect do |sha|
455         m = mock
456         m.stubs(:id).returns(sha)
457         m.stubs(:id_abbrev).returns(sha[0..7])
458         m.stubs(:committer).returns(Grit::Actor.new("bob", "bob@example.com"))
459         m.stubs(:author).returns(Grit::Actor.new("bob", "bob@example.com"))
460         m.stubs(:short_message).returns("bla bla")
461         m.stubs(:committed_date).returns(3.days.ago)
462         m
463       end
464       merge_request = MergeRequest.new
465       merge_request.stubs(:commits_for_selection).returns(@commits)
466       MergeRequest.expects(:new).returns(merge_request)
467     end
468
469     should "render a list of commits that can be merged" do
470       login_as :johan
471       post :commit_list, params(:merge_request => {})
472       assert_equal @commits, assigns(:commits)
473     end
474   end
475
476   context "GET #target_branches" do
477     setup do
478       GitoriousConfig["enable_private_repositories"] = false
479     end
480
481     should "retrive a list of the target repository branches" do
482       grit = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
483       MergeRequest.any_instance.expects(:target_branches_for_selection).returns(grit.branches)
484
485       login_as :johan
486       post :target_branches, mr_params(:merge_request => {
487         :target_repository_id => repositories(:johans).id
488       })
489       assert_response :success
490       assert_equal grit.branches, assigns(:target_branches)
491     end
492   end
493
494   context "GET #version" do
495     should "render the diff browser for the given version" do
496       MergeRequest.stubs(:find_by_sequence_number!).returns(@merge_request)
497       get :version, mr_params(:version => @merge_request.versions.first.version)
498       assert_response :success
499     end
500   end
501
502   context "#destroy (DELETE)" do
503     should "requires login" do
504       session[:user_id] = nil
505       do_delete
506       assert_redirected_to(new_sessions_path)
507     end
508
509     should "scopes to the source_repository" do
510       login_as :johan
511       do_delete
512       assert_equal @source_repository, assigns(:merge_request).source_repository
513     end
514
515     should "soft-delete the record" do
516       login_as :johan
517       assert_difference("@target_repository.open_merge_requests.count", -1) do
518         do_delete
519       end
520       assert_redirected_to(project_repository_path(@project, @target_repository))
521       assert_match(/merge request was retracted/i, flash[:success])
522     end
523
524     should "only allows the owner to delete" do
525       login_as :moe
526       do_delete
527       assert_no_difference("MergeRequest.count") do
528         assert_redirected_to(project_repository_path(@project, @target_repository))
529         assert_equal nil, flash[:success]
530         assert_match(/You are not the owner of this merge request/i, flash[:error])
531       end
532     end
533   end
534
535   context "Redirection from the outside" do
536     setup do
537       @merge_request = merge_requests(:moes_to_johans)
538     end
539
540     should "redirect to the correct URL when supplying only an id" do
541       get :direct_access, :id => @merge_request.id
542       assert_redirected_to({ :action => "show",
543                              :project_id => @merge_request.target_repository.project,
544                              :repository_id => @merge_request.target_repository,
545                              :id => @merge_request.to_param})
546     end
547   end
548
549   context "With private projects" do
550     setup do
551       enable_private_repositories
552       stub_commits(@merge_request)
553       MergeRequest.stubs(:find_by_sequence_number!).returns(@merge_request)
554     end
555
556     should "disallow unauthenticated users from listing merge requests" do
557       get :index, params
558       assert_response 403
559     end
560
561     should "allow authenticated users to list merge requests" do
562       MergeRequest.unstub(:find_by_sequence_number!)
563       login_as :johan
564       get :index, params
565       assert_response :success
566     end
567
568     should "disallow unauthenticated users from listing commits" do
569       login_as :mike
570       post :commit_list, params(:merge_request => {})
571       assert_response 403
572     end
573
574     should "allow authenticated users to list commits" do
575       login_as :johan
576       post :commit_list, params(:merge_request => {})
577       assert_response 200
578     end
579
580     should "disallow unauthenticated users from viewing commit status" do
581       @merge_request.stubs(:commit_merged?).with("ffo").returns(true)
582
583       do_commit_status_get(:commit_id => "ff0")
584       assert_response 403
585     end
586
587     should "allow authenticated users to view commit status" do
588       login_as :johan
589       @merge_request.stubs(:commit_merged?).with("ffo").returns(true)
590
591       do_commit_status_get(:commit_id => "ff0")
592       assert_response :success
593     end
594
595     context "GET #target_branches" do
596       setup do
597         grit = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
598         MergeRequest.any_instance.stubs(:target_branches_for_selection).returns(grit.branches)
599         @params = mr_params(:merge_request => { :target_repository_id => repositories(:johans).id })
600       end
601
602       should "disallow unauthenticated users" do
603         login_as :mike
604         post :target_branches, @params
605         assert_response 403
606       end
607
608       should "allow authenticated users" do
609         login_as :johan
610         post :target_branches, @params
611         assert_response 200
612       end
613     end
614
615     context "#show (GET)" do
616       should "disallow unauthenticated users" do
617         get :show, mr_params
618         assert_response 403
619       end
620
621       should "allow authenticated users" do
622         login_as :johan
623         get :show, mr_params
624         assert_response 200
625       end
626     end
627
628     context "GET #version" do
629       should "disallow unauthenticated users" do
630         get :version, mr_params(:version => @merge_request.versions.first.version)
631         assert_response 403
632       end
633
634       should "allow authenticated users" do
635         login_as :johan
636         get :version, mr_params(:version => @merge_request.versions.first.version)
637         assert_response 200
638       end
639     end
640
641     should "disallows unauthenticated user from opening new MR" do
642       login_as :mike
643       get :new, params
644       assert_response 403
645     end
646
647     should "allows authenticated user to open new MR" do
648       login_as :johan
649       get :new, params
650       assert_response :success
651     end
652
653     should "disallow unauthenticated user from accepting terms" do
654       login_as :mike
655       get :terms_accepted, mr_params
656       assert_response 403
657     end
658
659     should "allow authenticated user to accept terms" do
660       login_as :johan
661       @merge_request.stubs(:valid_oauth_credentials?).returns(true)
662       @merge_request.expects(:terms_accepted)
663
664       get :terms_accepted, mr_params
665       assert_response :redirect
666     end
667
668     should "disallow unauthenticated user from creating MR" do
669       login_as :mike
670       post :create, params(:merge_request => {
671         :target_repository_id => @source_repository.id,
672         :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
673         :summary => "some changes"
674       })
675
676       assert_response 403
677     end
678
679     should "allow authenticated user to create MR" do
680       login_as :johan
681       post :create, params(:merge_request => {
682         :target_repository_id => @source_repository.id,
683         :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
684         :summary => "some changes"
685       })
686
687       assert_response 302
688     end
689
690     should "disallow unauthenticated users direct access" do
691       get :direct_access, :id => @merge_request.id
692       assert_response 403
693     end
694   end
695
696   context "With private repositories" do
697     setup do
698       enable_private_repositories(@target_repository)
699       @project.content_memberships.delete_all
700       stub_commits(@merge_request)
701       MergeRequest.stubs(:find_by_sequence_number!).returns(@merge_request)
702     end
703
704     should "disallow unauthenticated users from listing merge requests" do
705       get :index, params
706       assert_response 403
707     end
708
709     should "allow authenticated users to list merge requests" do
710       MergeRequest.unstub(:find_by_sequence_number!)
711       login_as :johan
712       get :index, params
713       assert_response :success
714     end
715
716     should "disallow unauthenticated users from listing commits" do
717       login_as :mike
718       post :commit_list, params(:merge_request => {})
719       assert_response 403
720     end
721
722     should "allow authenticated users to list commits" do
723       login_as :johan
724       post :commit_list, params(:merge_request => {})
725       assert_response 200
726     end
727
728     should "disallow unauthenticated users from viewing commit status" do
729       @merge_request.stubs(:commit_merged?).with("ffo").returns(true)
730
731       do_commit_status_get(:commit_id => "ff0")
732       assert_response 403
733     end
734
735     should "allow authenticated users to view commit status" do
736       login_as :johan
737       @merge_request.stubs(:commit_merged?).with("ffo").returns(true)
738
739       do_commit_status_get(:commit_id => "ff0")
740       assert_response :success
741     end
742
743     context "GET #target_branches" do
744       setup do
745         grit = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
746         MergeRequest.any_instance.stubs(:target_branches_for_selection).returns(grit.branches)
747         @params = mr_params(:merge_request => { :target_repository_id => repositories(:johans).id })
748       end
749
750       should "disallow unauthenticated users" do
751         login_as :mike
752         post :target_branches, @params
753         assert_response 403
754       end
755
756       should "allow authenticated users" do
757         login_as :johan
758         post :target_branches, @params
759         assert_response 200
760       end
761     end
762
763     context "#show (GET)" do
764       should "disallow unauthenticated users" do
765         get :show, mr_params
766         assert_response 403
767       end
768
769       should "allow authenticated users" do
770         login_as :johan
771         get :show, mr_params
772         assert_response 200
773       end
774     end
775
776     context "GET #version" do
777       should "disallow unauthenticated users" do
778         get :version, mr_params(:version => @merge_request.versions.first.version)
779         assert_response 403
780       end
781
782       should "allow authenticated users" do
783         login_as :johan
784         get :version, mr_params(:version => @merge_request.versions.first.version)
785         assert_response 200
786       end
787     end
788
789     should "disallows unauthenticated user from opening new MR" do
790       login_as :mike
791       get :new, params
792       assert_response 403
793     end
794
795     should "allows authenticated user to open new MR" do
796       login_as :johan
797       get :new, params
798       assert_response :success
799     end
800
801     should "disallow unauthenticated user from accepting terms" do
802       login_as :mike
803       get :terms_accepted, mr_params
804       assert_response 403
805     end
806
807     should "allow authenticated user to accept terms" do
808       login_as :johan
809       @merge_request.stubs(:valid_oauth_credentials?).returns(true)
810       @merge_request.expects(:terms_accepted)
811
812       get :terms_accepted, mr_params
813       assert_response :redirect
814     end
815
816     should "disallow unauthenticated user from creating MR" do
817       login_as :mike
818       post :create, params(:merge_request => {
819         :target_repository_id => @source_repository.id,
820         :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
821         :summary => "some changes"
822       })
823
824       assert_response 403
825     end
826
827     should "allow authenticated user to create MR" do
828       login_as :johan
829       post :create, params(:merge_request => {
830         :target_repository_id => @source_repository.id,
831         :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
832         :summary => "some changes"
833       })
834
835       assert_response 302
836     end
837
838     should "disallow unauthenticated users direct access" do
839       get :direct_access, :id => @merge_request.id
840       assert_response 403
841     end
842   end
843
844   private
845   def params(data = {})
846     { :project_id => @project.to_param,
847       :repository_id => @target_repository.to_param }.merge(data)
848   end
849
850   def mr_params(data = {})
851     params(:id => @merge_request.to_param).merge(data)
852   end
853
854   def stub_commits(merge_request)
855     commits = ["9dbb89110fc45362fc4dc3f60d960381",
856                "6823e6622e1da9751c87380ff01a1db1",
857                "526fa6c0b3182116d8ca2dc80dedeafb",
858                "286e8afb9576366a2a43b12b94738f07"].collect do |sha|
859       m = mock
860       m.stubs(:id).returns(sha)
861       m.stubs(:id_abbrev).returns(sha[0..7])
862       m.stubs(:committer).returns(Grit::Actor.new("bob", "bob@example.com"))
863       m.stubs(:author).returns(Grit::Actor.new("bob", "bob@example.com"))
864       m.stubs(:short_message).returns("bla bla")
865       m.stubs(:committed_date).returns(3.days.ago)
866       m.stubs(:to_patch).returns("From: #{sha}\nSubject: [PATCH]")
867       m
868     end
869     merge_request.stubs(:commits_for_selection).returns(commits)
870     merge_request.stubs(:commits_to_be_merged).returns(commits[0..1])
871   end
872
873   def do_post(data={})
874     post :create, params(:repository_id => @source_repository.to_param, :merge_request => {
875       :target_repository_id => @target_repository.id,
876       :ending_commit => "6823e6622e1da9751c87380ff01a1db1",
877       :summary => "some changes to be merged"
878     }.merge(data))
879   end
880
881   def do_edit_get
882     get :edit, mr_params
883   end
884
885   def do_put(data={})
886     put :update, mr_params(:merge_request => {
887       :target_repository_id => @target_repository.id,
888     }.merge(data))
889   end
890
891   def do_delete
892     delete :destroy, mr_params
893   end
894
895   def do_commit_status_get(data = {})
896     get :commit_status, mr_params(data)
897   end
898 end