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