Remove SslRequirement and associated logic
[gitorious:mainline.git] / test / functional / commits_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 CommitsControllerTest < ActionController::TestCase
23   context "showing a single commit" do
24     setup do
25       prepare_project_repo_and_commit
26     end
27
28     should "get the correct project and repository" do
29       get :show, params
30       assert_equal @project, assigns(:project)
31       assert_equal @repository, assigns(:repository)
32     end
33
34     should "get the commit data" do
35       get :show, params
36       assert_response :success
37       assert_equal @repository.git, assigns(:git)
38       assert_equal @repository.git.commit(@sha), assigns(:commit)
39       assert_not_nil assigns(:diffs)
40     end
41
42     should "default to 'inline' diffmode" do
43       get :show, params
44       assert_equal "inline", assigns(:diffmode)
45     end
46
47     should "set sidebyside diffmode" do
48       get :show, params(:diffmode => "sidebyside")
49       assert_equal "sidebyside", assigns(:diffmode)
50     end
51
52     should "get it in diff format" do
53       get :show, params(:format => "diff")
54       assert_response :success
55       assert_equal "text/plain", @response.content_type
56       assert_equal @repository.git.commit(@sha).diffs.map{|d| d.diff}.join("\n"), @response.body
57     end
58
59     should "get it in patch format" do
60       get :show, params(:format => "patch")
61       assert_response :success
62       assert_equal "text/plain", @response.content_type
63       assert_equal @repository.git.commit(@sha).to_patch, @response.body
64     end
65
66     should "redirect to the commit log with a msg if the SHA1 was not found" do
67       @grit.expects(:commit).with("123").returns(nil)
68       get :show, params(:id => "123")
69       assert_response :redirect
70       assert_match(/no such sha/i, flash[:error])
71       assert_redirected_to project_repository_commits_path(@project, @repository)
72     end
73
74     should "have a different last-modified if there is a comment" do
75       Comment.create!({
76           :user => users(:johan),
77           :body => "foo",
78           :sha1 => @sha,
79           :target => @repository,
80           :project => @repository.project,
81       })
82       get :show, params
83       assert_response :success
84       assert_not_equal "Fri, 18 Apr 2008 23:26:07 GMT", @response.headers["Last-Modified"]
85     end
86   end
87
88   context "listing commits" do
89     setup do
90       @project = projects(:johans)
91       @repository = @project.repositories.first
92       @repository.update_attribute(:ready, true)
93       Project.expects(:find_by_slug!).with(@project.slug) \
94         .returns(@project)
95       Repository.expects(:find_by_name_and_project_id!) \
96           .with(@repository.name, @project.id).returns(@repository)
97
98       Repository.any_instance.stubs(:full_repository_path).returns(grit_test_repo("dot_git"))
99       @git = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
100       Repository.any_instance.stubs(:git).returns(@git)
101     end
102
103     context "#index" do
104       should "GETs page 1 successfully" do
105         get :index, index_params(:page => nil, :branch => ["master"])
106         assert_response :success
107         assert_equal @repository.git.commits("master", 30, 0), assigns(:commits)
108       end
109
110       should "GETs page 3 successfully" do
111         get :index, index_params(:branch => ["master"], :page => 3)
112         assert_response :success
113         assert_equal @repository.git.commits("master", 30, 60), assigns(:commits)
114       end
115
116       should "GETs the commits successfully" do
117         get :index, index_params(:page => nil, :branch => ["master"])
118         assert_response :success
119         assert_equal "master", assigns(:root).title
120         assert_equal @repository.git, assigns(:git)
121         assert_equal @repository.git.commits("master", 30, 0), assigns(:commits)
122       end
123
124       should "GET the commits of a namedspaced branch successfully" do
125         get :index, index_params(:page => nil, :branch => ["test", "master"])
126         assert_response :success
127         assert_equal "test/master", assigns(:ref)
128         assert_equal "test/master", assigns(:root).title
129         assert_equal @repository.git, assigns(:git)
130         assert_equal @repository.git.commits("test/master", 30, 0), assigns(:commits)
131       end
132
133       should "deal gracefully if HEAD file refers to a non-existent ref" do
134         @git.expects(:get_head).with("master").returns(nil)
135         @git.expects(:commit).with("master").returns(nil)
136         get :index, index_params(:page => nil, :branch => ["master"])
137
138         assert_response :redirect
139         assert_match(/not a valid ref/, flash[:error])
140       end
141
142       should "suggest looking at master when hitting non-existent ref" do
143         @git.expects(:get_head).with("2").returns(nil)
144         @git.expects(:commit).with("2").returns(nil)
145         get :index, index_params(:page => nil, :branch => ["2"])
146
147         assert_response :redirect
148         assert_redirected_to project_repository_commits_in_ref_path(@project,
149                               @repository, "master")
150         assert_match(/trying master instead/, flash[:error])
151       end
152
153       should "suggest looking at master when hitting non-existent commit" do
154         @git.expects(:get_head).with("2").returns(nil)
155         @git.expects(:commit).with("2").raises(Errno::EISDIR, "Is a directory")
156         get :index, index_params(:page => nil, :branch => ["2"])
157
158         assert_response :redirect
159         assert_redirected_to project_repository_commits_in_ref_path(@project,
160                               @repository, "master")
161         assert_match(/trying master instead/, flash[:error])
162       end
163
164       should "have a proper id in the atom feed" do
165         commit = Grit::Commit.new(mock("repo"), "mycommitid", [], stub_everything("tree"),
166                       stub_everything("author"), Time.now,
167                       stub_everything("comitter"), Time.now,
168                       "my commit message".split(" "))
169         @repository.git.expects(:commits).twice.returns([commit])
170
171         get :feed, params(:id => "master", :format => "atom")
172         assert @response.body.include?(%Q{<id>tag:test.host,2005:Grit::Commit/mycommitid</id>})
173       end
174
175       should "not explode when there is no commits" do
176         @repository.git.expects(:commits).returns([])
177         get :feed, params(:id => "master", :format => "atom")
178         assert_response :success
179         assert_select "feed title", /#{@repository.gitdir}/
180       end
181
182       should "show branches with a # in them with great success" do
183         git_repo = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
184         @repository.git.expects(:commit).with("ticket-#42") \
185           .returns(git_repo.commit("master"))
186         get :index, index_params(:branch => ["ticket-%2342"])
187         assert_response :success
188         assert_equal "ticket-#42", assigns(:ref)
189       end
190     end
191   end
192
193   context "paginating commits" do
194     setup do
195       @project = projects(:johans)
196       @repository = @project.repositories.first
197       @repository.update_attribute(:ready, true)
198       Project.stubs(:find_by_slug!).with(@project.slug).returns(@project)
199       Repository.stubs(:find_by_name_and_project_id!) \
200         .with(@repository.name, @project.id).returns(@repository)
201       Repository.any_instance.stubs(:full_repository_path).returns(grit_test_repo("dot_git"))
202       @git = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
203       Repository.any_instance.stubs(:git).returns(@git)
204
205       @params = {
206         :project_id => @project.slug,
207         :repository_id => @repository.name,
208         :branch => ["master"]
209       }
210     end
211
212     context "commits pagination" do
213       should_scope_pagination_to(:index, nil, "commits", :delete_all => false)
214     end
215   end
216
217   context "With private projects" do
218     setup do
219       prepare_project_repo_and_commit
220       enable_private_repositories
221     end
222
223     should "disallow unauthorized access to commits" do
224       get :index, index_params(:page => nil, :branch => ["master"])
225       assert_response 403
226     end
227
228     should "allow authorized access to commits" do
229       login_as :johan
230       get :index, index_params(:page => nil, :branch => ["master"])
231       assert_response 200
232     end
233
234     should "disallow unauthorized access to show commit" do
235       get :show, params
236       assert_response 403
237     end
238
239     should "allow authorized access to show commit" do
240       login_as :johan
241       get :show, params
242       assert_response 200
243     end
244
245     should "disallow unauthorized access to view feed" do
246       get :feed, params(:id => "master", :format => "atom")
247       assert_response 403
248     end
249
250     should "allow authorized access to view feed" do
251       login_as :johan
252       get :feed, params(:id => "master", :format => "atom")
253       assert_response 200
254     end
255   end
256
257   context "With private repositories" do
258     setup do
259       prepare_project_repo_and_commit
260       enable_private_repositories(@repository)
261     end
262
263     should "disallow unauthorized access to commits" do
264       get :index, index_params(:page => nil, :branch => ["master"])
265       assert_response 403
266     end
267
268     should "allow authorized access to commits" do
269       login_as :johan
270       get :index, index_params(:page => nil, :branch => ["master"])
271       assert_response 200
272     end
273
274     should "disallow unauthorized access to show commit" do
275       get :show, params
276       assert_response 403
277     end
278
279     should "allow authorized access to show commit" do
280       login_as :johan
281       get :show, params
282       assert_response 200
283     end
284
285     should "disallow unauthorized access to view feed" do
286       get :feed, params(:id => "master", :format => "atom")
287       assert_response 403
288     end
289
290     should "allow authorized access to view feed" do
291       login_as :johan
292       get :feed, params(:id => "master", :format => "atom")
293       assert_response 200
294     end
295   end
296
297   private
298   def params(additional = {})
299     { :project_id => @project.slug,
300       :repository_id => @repository.name,
301       :id => @sha }.merge(additional)
302   end
303
304   def index_params(additional = {})
305     { :project_id => @project.slug,
306       :repository_id => @repository.name }.merge(additional)
307   end
308
309   def prepare_project_repo_and_commit
310     @project = projects(:johans)
311     @repository = @project.repositories.mainlines.first
312     @repository.update_attribute(:ready, true)
313
314     Repository.any_instance.stubs(:full_repository_path).returns(grit_test_repo("dot_git"))
315     @grit = Grit::Repo.new(grit_test_repo("dot_git"), :is_bare => true)
316     Repository.any_instance.stubs(:git).returns(@grit)
317     @sha = "3fa4e130fa18c92e3030d4accb5d3e0cadd40157"
318   end
319 end