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