Resolve merge conflict
[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     setup_ssl_from_config
27     @group = groups(:team_thunderbird)
28   end
29
30   should_enforce_ssl_for(:delete, :avatar)
31   should_enforce_ssl_for(:delete, :destroy)
32   should_enforce_ssl_for(:get, :edit)
33   should_enforce_ssl_for(:get, :index)
34   should_enforce_ssl_for(:get, :new)
35   should_enforce_ssl_for(:get, :show)
36   should_enforce_ssl_for(:post, :create)
37   should_enforce_ssl_for(:put, :update)
38
39   context "Routing" do
40     should "recognizes routes starting with plus as teams/show/<name>" do
41       assert_generates("/+#{@group.to_param}", { :controller => "groups",
42         :action => "show", :id => @group.to_param})
43       assert_recognizes({:controller => "groups", :action => "show",
44                          :id => @group.to_param}, "/+#{@group.to_param}")
45     end
46   end
47
48   context "index" do
49     should "GET successfully" do
50       get :index
51       assert_response :success
52     end
53
54     context "teams pagination" do
55       should_scope_pagination_to(:index, Group, "teams")
56     end
57   end
58
59   context "show" do
60     should "find the requested group" do
61       get :show, :id => @group.to_param
62       assert_response :success
63       assert_equal @group, assigns(:group)
64     end
65
66     context "pagination" do
67       setup { @params = { :id => @group.to_param } }
68       should_scope_pagination_to(:show, Event)
69     end
70   end
71
72   context "edit" do
73     setup do
74       login_as :mike
75       get :edit, :id => @group.to_param
76     end
77
78     should_assign_to :group
79     should_respond_with :success
80   end
81
82   context "update" do
83     should "require user to be admin of group" do
84       put :update, :id => @group.to_param, :group => {:description => "Unskilled and unprofessional"}
85       assert_redirected_to :controller => "sessions", :action => "new"
86     end
87
88     should "only update the description, not the name" do
89       login_as :mike
90       put :update, :id => @group.to_param, :group => {:name => "hackers"}
91       assert_redirected_to :action => "show"
92       assert_equal("team-thunderbird", @group.name)
93     end
94
95     should "update successfully" do
96       login_as :mike
97       new_description = "We save lives"
98       put :update, :id => @group.to_param, :group => {:description => new_description}
99       assert_redirected_to :action => "show"
100       assert_equal(new_description, @group.reload.description)
101     end
102   end
103
104   context "creating a group" do
105     should "require login" do
106       get :new
107       assert_redirected_to (new_sessions_path)
108     end
109
110     should "GET new successfully" do
111       login_as :mike
112       get :new
113       assert_response :success
114     end
115
116     should "POST to create a new group" do
117       login_as :mike
118
119       assert_difference("Group.count") do
120         post :create, :group => {:name => "foo-hackers", :description => "Hacking the foos for your bars"},
121           :project => {:slug => projects(:johans).slug}
122       end
123
124       assert_not_equal nil, flash[:success]
125       assert !assigns(:group).new_record?, "assigns(:group).new_record? should be false"
126       assert_equal "foo-hackers", assigns(:group).name
127       assert_equal [users(:mike)], assigns(:group).members
128     end
129   end
130
131   context "deleting a group" do
132     setup do
133       @group = groups(:team_thunderbird)
134       @user = users(:mike)
135       assert @group.admin?(@user)
136     end
137
138     should "succeed if there is only one member" do
139       assert_equal 1, @group.members.count
140       login_as :mike
141       @group.projects.destroy_all
142
143       assert_difference("Group.count", -1) do
144         delete :destroy, :id => @group.to_param
145         assert_response :redirect
146       end
147       assert_redirected_to groups_path
148       assert_match(/team was deleted/, flash[:success])
149     end
150
151     should "fail if there is more than one member" do
152       @group.add_member(users(:johan), Role.member)
153       assert_equal 2, @group.members.count
154       login_as :mike
155       assert_no_difference("Group.count", -1) do
156         delete :destroy, :id => @group.to_param
157         assert_response :redirect
158       end
159       assert_redirected_to group_path(@group)
160       assert_match(/team cannot be deleted/, flash[:error])
161     end
162
163     should "succeed if there is more than one member and user is site_admin" do
164       assert users(:johan).site_admin?
165       @group.add_member(users(:johan), Role.member)
166       assert_equal 2, @group.members.count
167
168       login_as :johan
169       assert_difference("Group.count", -1) do
170         delete :destroy, :id => @group.to_param
171       end
172       assert_response :redirect
173       assert_redirected_to groups_path
174       assert_match(/team was deleted/, flash[:success])
175     end
176
177     should "successfully remove the team avatar" do
178       login_as :mike
179       @group.update_attribute(:avatar_file_name, "foo.png")
180       assert @group.avatar?
181       delete :avatar, :id => @group.to_param
182       assert_redirected_to group_path(@group)
183       assert !@group.reload.avatar?
184     end
185   end
186 end