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