Refactor project membership and private repo functionality into generic protected...
[gitorious:mainline.git] / test / functional / project_memberships_controller_test.rb
1 # encoding: utf-8
2 #--
3 #   Copyright (C) 2012 Gitorious AS
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 ProjectMembershipsControllerTest < ActionController::TestCase
22   should_render_in_site_specific_context :only => [:index]
23   should_enforce_ssl_for(:delete, :destroy)
24   should_enforce_ssl_for(:get, :index)
25   should_enforce_ssl_for(:post, :create)
26   should_enforce_ssl_for(:put, :update)
27
28   def setup
29     setup_ssl_from_config
30     @project = projects(:johans)
31     @user = users(:johan)
32   end
33
34   context "With private repos" do
35     setup do
36       enable_private_repositories
37     end
38
39     context "index" do
40       should "reject unauthorized user from listing memberships" do
41         login_as :mike
42         get :index, :project_id => @project.to_param
43         assert_response 403
44       end
45
46       should "allow owner to manage access" do
47         login_as :johan
48         get :index, :project_id => @project.to_param
49         assert_response 200
50       end
51
52       should "state that project is public" do
53         login_as :moe
54         get :index, :project_id => projects(:moes).to_param
55
56         assert_response 200
57         assert_match /Project is public/, @response.body
58         assert_match /Make private/, @response.body
59       end
60     end
61
62     context "create" do
63       should "reject unauthorized user" do
64         login_as :mike
65         login = @user.login
66         post :create, :project_id => @project.to_param, :user => { :login => login }
67         assert_response 403
68       end
69
70       should "explicitly add owner as collaborator" do
71         login = @user.login
72         login_as :johan
73
74         assert_difference("@project.reload.content_memberships.count") do
75           post :create, :project_id => @project.to_param, :user => { :login => login }
76         end
77       end
78
79       should "default to adding owner if no parameters" do
80         login_as :johan
81
82         assert_difference("@project.reload.content_memberships.count") do
83           post :create, :project_id => @project.to_param
84         end
85
86         assert_equal @user, @project.content_memberships.first.member
87       end
88
89       should "add group as collaborator" do
90         team = groups(:a_team)
91         login_as :johan
92
93         assert_difference("@project.reload.content_memberships.count") do
94           post :create, :project_id => @project.to_param, :group => { :name => team.name }
95         end
96
97         assert can_read?(team, @project)
98       end
99
100       should "redirect back to index" do
101         login = @user.login
102         login_as :johan
103
104         post :create, :project_id => @project.to_param, :user => { :login => login }
105         assert_response :redirect
106         assert_redirected_to :action => "index"
107       end
108
109       should "render index if user can not be found" do
110         login_as :johan
111         post :create, :project_id => @project.to_param, :user => { :login => "login" }
112
113         assert_response 200
114         assert_template "index"
115         assert_match /No such user 'login'/, flash[:error]
116       end
117
118       should "render index if group can not be found" do
119         login_as :johan
120         post :create, :project_id => @project.to_param, :group => { :name => "login" }
121
122         assert_response 200
123         assert_template "index"
124         assert_match /No such group 'login'/, flash[:error]
125       end
126     end
127
128     context "destroy" do
129       setup do
130         @membership = @project.content_memberships.first
131       end
132
133       should "reject unauthorized user" do
134         login_as :moe
135         delete :destroy, :project_id => @project.to_param, :id => @membership.id
136         assert_response 403
137       end
138
139       should "remove member" do
140         login_as :johan
141
142         assert_difference("@project.reload.content_memberships.count", -1) do
143           delete :destroy, :project_id => @project.to_param, :id => @membership.id
144         end
145       end
146
147       should "redirect back to project" do
148         login_as :johan
149         delete :destroy, :project_id => @project.to_param, :id => @membership.id
150         assert_response :redirect
151         assert_redirected_to :action => "index"
152       end
153
154       should "remove all members to make project public" do
155         login_as :johan
156         delete :destroy, :project_id => @project.to_param, :id => "all"
157         assert_equal 0, @project.content_memberships.count
158       end
159     end
160   end
161
162   context "With private repos disabled" do
163     setup do
164       GitoriousConfig["enable_private_repositories"] = false
165     end
166
167     should "redirect to index project" do
168       login_as :moe
169       id = projects(:moes).to_param
170       get :index, :project_id => id
171       assert_redirected_to :controller => "projects", :action => "show", :id => id
172     end
173   end
174 end