]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users/lists_controller_test.rb
68e414bb85c78f8d063a0fb17bce173c9921139b
[rails.git] / test / controllers / users / lists_controller_test.rb
1 require "test_helper"
2
3 module Users
4   class ListsControllerTest < ActionDispatch::IntegrationTest
5     ##
6     # test all routes which lead to this controller
7     def test_routes
8       assert_routing(
9         { :path => "/users", :method => :get },
10         { :controller => "users/lists", :action => "show" }
11       )
12       assert_routing(
13         { :path => "/users", :method => :put },
14         { :controller => "users/lists", :action => "update" }
15       )
16       assert_routing(
17         { :path => "/users/status", :method => :get },
18         { :controller => "users/lists", :action => "show", :status => "status" }
19       )
20       assert_routing(
21         { :path => "/users/status", :method => :put },
22         { :controller => "users/lists", :action => "update", :status => "status" }
23       )
24     end
25
26     def test_show
27       user = create(:user)
28       moderator_user = create(:moderator_user)
29       administrator_user = create(:administrator_user)
30       suspended_user = create(:user, :suspended)
31       ip_user = create(:user, :creation_address => "1.2.3.4")
32
33       # There are now 7 users - the five above, plus two extra "granters" for the
34       # moderator_user and administrator_user
35       assert_equal 7, User.count
36
37       # Shouldn't work when not logged in
38       get users_list_path
39       assert_redirected_to login_path(:referer => users_list_path)
40
41       session_for(user)
42
43       # Shouldn't work when logged in as a normal user
44       get users_list_path
45       assert_redirected_to :controller => "/errors", :action => :forbidden
46
47       session_for(moderator_user)
48
49       # Shouldn't work when logged in as a moderator
50       get users_list_path
51       assert_redirected_to :controller => "/errors", :action => :forbidden
52
53       session_for(administrator_user)
54
55       # Note there is a header row, so all row counts are users + 1
56       # Should work when logged in as an administrator
57       get users_list_path
58       assert_response :success
59       assert_template :show
60       assert_select "table#user_list tbody tr", :count => 7
61
62       # Should be able to limit by status
63       get users_list_path, :params => { :status => "suspended" }
64       assert_response :success
65       assert_template :show
66       assert_select "table#user_list tbody tr", :count => 1 do
67         assert_select "a[href='#{user_path(suspended_user)}']", :count => 1
68       end
69
70       # Should be able to limit by IP address
71       get users_list_path, :params => { :ip => "1.2.3.4" }
72       assert_response :success
73       assert_template :show
74       assert_select "table#user_list tbody tr", :count => 1 do
75         assert_select "a[href='#{user_path(ip_user)}']", :count => 1
76       end
77     end
78
79     def test_show_paginated
80       1.upto(100).each do |n|
81         User.create(:display_name => "extra_#{n}",
82                     :email => "extra#{n}@example.com",
83                     :pass_crypt => "extraextra")
84       end
85
86       session_for(create(:administrator_user))
87
88       # 100 examples, an administrator, and a granter for the admin.
89       assert_equal 102, User.count
90       next_path = users_list_path
91
92       get next_path
93       assert_response :success
94       assert_template :show
95       assert_select "table#user_list tbody tr", :count => 50
96       check_no_page_link "Newer Users"
97       next_path = check_page_link "Older Users"
98
99       get next_path
100       assert_response :success
101       assert_template :show
102       assert_select "table#user_list tbody tr", :count => 50
103       check_page_link "Newer Users"
104       next_path = check_page_link "Older Users"
105
106       get next_path
107       assert_response :success
108       assert_template :show
109       assert_select "table#user_list tbody tr", :count => 2
110       check_page_link "Newer Users"
111       check_no_page_link "Older Users"
112     end
113
114     def test_show_invalid_paginated
115       session_for(create(:administrator_user))
116
117       %w[-1 0 fred].each do |id|
118         get users_list_path(:before => id)
119         assert_redirected_to :controller => "/errors", :action => :bad_request
120
121         get users_list_path(:after => id)
122         assert_redirected_to :controller => "/errors", :action => :bad_request
123       end
124     end
125
126     def test_update_confirm
127       inactive_user = create(:user, :pending)
128       suspended_user = create(:user, :suspended)
129
130       # Shouldn't work when not logged in
131       assert_no_difference "User.active.count" do
132         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
133       end
134       assert_response :forbidden
135
136       assert_equal "pending", inactive_user.reload.status
137       assert_equal "suspended", suspended_user.reload.status
138
139       session_for(create(:user))
140
141       # Shouldn't work when logged in as a normal user
142       assert_no_difference "User.active.count" do
143         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
144       end
145       assert_redirected_to :controller => "/errors", :action => :forbidden
146       assert_equal "pending", inactive_user.reload.status
147       assert_equal "suspended", suspended_user.reload.status
148
149       session_for(create(:moderator_user))
150
151       # Shouldn't work when logged in as a moderator
152       assert_no_difference "User.active.count" do
153         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
154       end
155       assert_redirected_to :controller => "/errors", :action => :forbidden
156       assert_equal "pending", inactive_user.reload.status
157       assert_equal "suspended", suspended_user.reload.status
158
159       session_for(create(:administrator_user))
160
161       # Should work when logged in as an administrator
162       assert_difference "User.active.count", 2 do
163         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
164       end
165       assert_redirected_to :action => :show
166       assert_equal "confirmed", inactive_user.reload.status
167       assert_equal "confirmed", suspended_user.reload.status
168     end
169
170     def test_update_hide
171       normal_user = create(:user)
172       confirmed_user = create(:user, :confirmed)
173
174       # Shouldn't work when not logged in
175       assert_no_difference "User.active.count" do
176         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
177       end
178       assert_response :forbidden
179
180       assert_equal "active", normal_user.reload.status
181       assert_equal "confirmed", confirmed_user.reload.status
182
183       session_for(create(:user))
184
185       # Shouldn't work when logged in as a normal user
186       assert_no_difference "User.active.count" do
187         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
188       end
189       assert_redirected_to :controller => "/errors", :action => :forbidden
190       assert_equal "active", normal_user.reload.status
191       assert_equal "confirmed", confirmed_user.reload.status
192
193       session_for(create(:moderator_user))
194
195       # Shouldn't work when logged in as a moderator
196       assert_no_difference "User.active.count" do
197         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
198       end
199       assert_redirected_to :controller => "/errors", :action => :forbidden
200       assert_equal "active", normal_user.reload.status
201       assert_equal "confirmed", confirmed_user.reload.status
202
203       session_for(create(:administrator_user))
204
205       # Should work when logged in as an administrator
206       assert_difference "User.active.count", -2 do
207         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
208       end
209       assert_redirected_to :action => :show
210       assert_equal "deleted", normal_user.reload.status
211       assert_equal "deleted", confirmed_user.reload.status
212     end
213
214     private
215
216     def check_no_page_link(name)
217       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
218     end
219
220     def check_page_link(name)
221       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
222         return buttons.first.attributes["href"].value
223       end
224     end
225   end
226 end