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