Authorization for data on dashboard and index pages
[gitorious:mainline.git] / test / functional / site_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 File.dirname(__FILE__) + "/../test_helper"
21
22 class SiteControllerTest < ActionController::TestCase
23
24   should_render_in_site_specific_context :except => [:about, :faq, :contact, :tos, :privacy_policy]
25   should_render_in_global_context :only => [:about, :faq, :contact, :tos, :privacy_policy]
26
27   should_enforce_ssl_for(:get, :dashboard)
28   should_enforce_ssl_for(:get, :index)
29   should_enforce_ssl_for(:get, :public_timeline)
30
31   def setup
32     setup_ssl_from_config
33   end
34
35   def alter_gitorious_config(key, value)
36     old_value = GitoriousConfig[key]
37     GitoriousConfig[key] = value
38
39     yield
40
41     if old_value.nil?
42       GitoriousConfig.delete(key)
43     else
44       GitoriousConfig[key] = old_value
45     end
46   end
47
48   context "#activity" do
49     should "route /activity to public_timeline" do
50       assert_recognizes({
51           :controller => "site",
52           :action => "public_timeline"
53         }, "/activities")
54     end
55
56     should "render the global activity timeline" do
57       get :public_timeline
58       assert_response :success
59       assert_template "site/index"
60     end
61   end
62
63   context "#index" do
64     context "Logged in users" do
65       setup {login_as users(:johan)}
66
67       should "render the dashboard for logged in users" do
68         login_as users(:johan)
69         get :index
70         assert_response :success
71         assert_template "site/dashboard"
72       end
73
74       should "include the user's commit_repositories" do
75         login_as users(:johan)
76         get :index
77         assert_not_nil assigns(:repositories)
78       end
79
80       should "render the dashboard breadcrumb" do
81         login_as :johan
82         get :index
83         assert_instance_of Breadcrumb::Dashboard, assigns(:root)
84       end
85     end
86
87     context "Anonymous users" do
88       should "render the public timeline" do
89         alter_gitorious_config("is_gitorious_dot_org", false) do
90           get :index
91           assert_response :success
92           assert_template "site/index"
93         end
94       end
95
96       should "not include any commit_repositories" do
97         get :index
98         assert_nil assigns(:repositories)
99       end
100
101       should "use the funky layout" do
102         alter_gitorious_config("is_gitorious_dot_org", true) do
103           get :index
104           assert_response :success
105           assert_equal "layouts/second_generation/application", @response.layout
106         end
107       end
108     end
109
110     context "With private repositories" do
111       setup do
112         @project = Project.first
113         enable_private_repositories
114         GitoriousConfig["is_gitorious_dot_org"] = false
115       end
116
117       should "not display unauthenticated projects" do
118         login_as :mike
119         get :index
120         assert_response :success
121         assert !assigns(:projects).index(@project)
122       end
123
124       should "not display unauthenticated projects in public timeline" do
125         logout
126         projects = Project.find(:all)
127         repos = Repository.find(:all)
128         Project.stubs(:most_active_recently).returns(projects)
129         Repository.stubs(:most_active_clones).returns(repos)
130
131         get :index
132         assert_response :success
133         assert !assigns(:projects).index(@project)
134         assert !assigns(:active_projects).index(@project)
135         assert assigns(:top_repository_clones).none? { |r| r.project == @project }
136         assert_not_equal assigns(:top_repository_clones).length, 0
137       end
138     end
139   end
140
141   context "#index, with a non-default site" do
142     setup do
143       paths = ActionController::Base.view_paths
144       paths << File.join(Rails.root, "test", "fixtures", "views")
145       ActionController::Base.view_paths = paths
146       @site = sites(:qt)
147       @request.host = "#{@site.subdomain}.gitorious.test"
148     end
149
150     should "render the Site specific template" do
151       get :index
152       assert_response :success
153       assert_template "#{@site.subdomain}/index"
154     end
155
156     should "scope the projects to the current site" do
157       get :index
158       assert_equal @site.projects, assigns(:projects)
159     end
160
161     context "With private repositories" do
162       setup do
163         @project = @site.projects.first
164         enable_private_repositories
165       end
166
167       should "not display unauthenticated projects" do
168         get :index
169         assert_response :success
170         assert !assigns(:projects).index(@project)
171       end
172     end
173   end
174
175   context "#dashboard" do
176     setup do
177       login_as :johan
178     end
179
180     should "requires login" do
181       login_as nil
182       get :dashboard
183       assert_redirected_to(new_sessions_path)
184     end
185
186     should "redirects to the user page" do
187       get :dashboard
188       assert_response :redirect
189       assert_redirected_to user_path(users(:johan))
190     end
191   end
192
193   context "in Private Mode" do
194     setup do
195       GitoriousConfig["public_mode"] = false
196       GitoriousConfig["is_gitorious_dot_org"] = false
197     end
198
199     teardown do
200       GitoriousConfig["public_mode"] = true
201       GitoriousConfig["is_gitorious_dot_org"] = true
202     end
203
204     should "GET / should not show private content in the homepage" do
205       get :index
206       assert_no_match(/Newest projects/, @response.body)
207       assert_no_match(/action\=\"\/search"/, @response.body)
208       assert_no_match(/Creating a user account/, @response.body)
209       assert_no_match(/\/projects/, @response.body)
210       assert_no_match(/\/search/, @response.body)
211     end
212   end
213 end