Handle pagination errors when viewing pages with no content
[gitorious:mainline.git] / test / functional / groups_controller_test.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies)
4 #
5 #   This program is free software: you can redistribute it and/or modify
6 #   it under the terms of the GNU Affero General Public License as published by
7 #   the Free Software Foundation, either version 3 of the License, or
8 #   (at your option) any later version.
9 #
10 #   This program is distributed in the hope that it will be useful,
11 #   but WITHOUT ANY WARRANTY; without even the implied warranty of
12 #   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 #   GNU Affero General Public License for more details.
14 #
15 #   You should have received a copy of the GNU Affero General Public License
16 #   along with this program.  If not, see <http://www.gnu.org/licenses/>.
17 #++
18
19 require File.dirname(__FILE__) + "/../test_helper"
20
21 class GroupsControllerTest < ActionController::TestCase
22
23   should_render_in_global_context
24
25   def setup
26     @group = groups(:team_thunderbird)
27   end
28
29   should_enforce_ssl_for(:delete, :avatar)
30   should_enforce_ssl_for(:delete, :destroy)
31   should_enforce_ssl_for(:get, :edit)
32   should_enforce_ssl_for(:get, :index)
33   should_enforce_ssl_for(:get, :new)
34   should_enforce_ssl_for(:get, :show)
35   should_enforce_ssl_for(:post, :create)
36   should_enforce_ssl_for(:put, :update)
37
38   context "Routing" do
39     should "recognizes routes starting with plus as teams/show/<name>" do
40       assert_generates("/+#{@group.to_param}", { :controller => "groups",
41         :action => "show", :id => @group.to_param})
42       assert_recognizes({:controller => "groups", :action => "show",
43                          :id => @group.to_param}, "/+#{@group.to_param}")
44     end
45   end
46
47   context "index" do
48     should "GET successfully" do
49       get :index
50       assert_response :success
51     end
52
53     context "with page parameter" do
54       should "redirect to index if page doesn't exist" do
55         get :index, :page => 2
56
57         assert_response :redirect
58         assert_redirected_to "/teams"
59       end
60
61       should "add flash message explaining that page doesn't exist" do
62         get :index, :page => 2
63
64         assert_not_nil flash[:error]
65         assert_match /no teams/, flash[:error]
66         assert_match /2/, flash[:error]
67       end
68
69       should "not redirect in a loop when there are no teams" do
70         Group.delete_all
71
72         get :index
73
74         assert_response :success
75       end
76
77       should "redirect to index if page is < 0" do
78         get :index, :page => -1
79
80         assert_response :redirect
81         assert_redirected_to "/teams"
82       end
83     end
84   end
85
86   context "show" do
87     should "find the requested group" do
88       get :show, :id => @group.to_param
89       assert_response :success
90       assert_equal @group, assigns(:group)
91     end
92
93     context "with page parameter" do
94       should "redirect to show if page doesn't exist" do
95         get :show, :id => @group.to_param, :page => 2
96
97         assert_response :redirect
98         assert_redirected_to :action => "show", :id => @group.to_param
99       end
100
101       should "add flash message explaining that page doesn't exist" do
102         get :show, :id => @group.to_param, :page => 2
103
104         assert_not_nil flash[:error]
105         assert_match /no events/, flash[:error]
106         assert_match /2/, flash[:error]
107       end
108
109       should "not redirect in a loop when there are no events" do
110         Event.delete_all
111
112         get :show, :id => @group.to_param
113
114         assert_response :success
115       end
116
117       should "redirect to index if page is < 0" do
118         get :show, :id => @group.to_param, :page => -1
119
120         assert_response :redirect
121         assert_redirected_to :action => "show", :id => @group.to_param
122       end
123     end
124   end
125
126   context "edit" do
127     setup do
128       login_as :mike
129       get :edit, :id => @group.to_param
130     end
131
132     should_assign_to :group
133     should_respond_with :success
134   end
135
136   context "update" do
137     should "require user to be admin of group" do
138       put :update, :id => @group.to_param, :group => {:description => "Unskilled and unprofessional"}
139       assert_redirected_to :controller => "sessions", :action => "new"
140     end
141
142     should "only update the description, not the name" do
143       login_as :mike
144       put :update, :id => @group.to_param, :group => {:name => "hackers"}
145       assert_redirected_to :action => "show"
146       assert_equal("team-thunderbird", @group.name)
147     end
148
149     should "update successfully" do
150       login_as :mike
151       new_description = "We save lives"
152       put :update, :id => @group.to_param, :group => {:description => new_description}
153       assert_redirected_to :action => "show"
154       assert_equal(new_description, @group.reload.description)
155     end
156   end
157
158   context "creating a group" do
159     should "require login" do
160       get :new
161       assert_redirected_to (new_sessions_path)
162     end
163
164     should "GET new successfully" do
165       login_as :mike
166       get :new
167       assert_response :success
168     end
169
170     should "POST to create a new group" do
171       login_as :mike
172
173       assert_difference("Group.count") do
174         post :create, :group => {:name => "foo-hackers", :description => "Hacking the foos for your bars"},
175           :project => {:slug => projects(:johans).slug}
176       end
177
178       assert_not_equal nil, flash[:success]
179       assert !assigns(:group).new_record?, "assigns(:group).new_record? should be false"
180       assert_equal "foo-hackers", assigns(:group).name
181       assert_equal [users(:mike)], assigns(:group).members
182     end
183   end
184
185   context "deleting a group" do
186     setup do
187       @group = groups(:team_thunderbird)
188       @user = users(:mike)
189       assert @group.admin?(@user)
190     end
191
192     should "succeed if there is only one member" do
193       assert_equal 1, @group.members.count
194       login_as :mike
195       @group.projects.destroy_all
196
197       assert_difference("Group.count", -1) do
198         delete :destroy, :id => @group.to_param
199         assert_response :redirect
200       end
201       assert_redirected_to groups_path
202       assert_match(/team was deleted/, flash[:success])
203     end
204
205     should "fail if there is more than one member" do
206       @group.add_member(users(:johan), Role.member)
207       assert_equal 2, @group.members.count
208       login_as :mike
209       assert_no_difference("Group.count", -1) do
210         delete :destroy, :id => @group.to_param
211         assert_response :redirect
212       end
213       assert_redirected_to group_path(@group)
214       assert_match(/team cannot be deleted/, flash[:error])
215     end
216
217     should "succeed if there is more than one member and user is site_admin" do
218       assert users(:johan).site_admin?
219       @group.add_member(users(:johan), Role.member)
220       assert_equal 2, @group.members.count
221
222       login_as :johan
223       assert_difference("Group.count", -1) do
224         delete :destroy, :id => @group.to_param
225       end
226       assert_response :redirect
227       assert_redirected_to groups_path
228       assert_match(/team was deleted/, flash[:success])
229     end
230
231     should "successfully remove the team avatar" do
232       login_as :mike
233       @group.update_attribute(:avatar_file_name, "foo.png")
234       assert @group.avatar?
235       delete :avatar, :id => @group.to_param
236       assert_redirected_to group_path(@group)
237       assert !@group.reload.avatar?
238     end
239   end
240 end