]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users/lists_controller_test.rb
Add frozen_string_literal comments to ruby files
[rails.git] / test / controllers / users / lists_controller_test.rb
1 # frozen_string_literal: true
2
3 require "test_helper"
4
5 module Users
6   class ListsControllerTest < ActionDispatch::IntegrationTest
7     ##
8     # test all routes which lead to this controller
9     def test_routes
10       assert_routing(
11         { :path => "/users", :method => :get },
12         { :controller => "users/lists", :action => "show" }
13       )
14       assert_routing(
15         { :path => "/users", :method => :put },
16         { :controller => "users/lists", :action => "update" }
17       )
18       assert_routing(
19         { :path => "/users/status", :method => :get },
20         { :controller => "users/lists", :action => "show", :status => "status" }
21       )
22       assert_routing(
23         { :path => "/users/status", :method => :put },
24         { :controller => "users/lists", :action => "update", :status => "status" }
25       )
26     end
27
28     def test_show
29       user = create(:user)
30       moderator_user = create(:moderator_user)
31       administrator_user = create(:administrator_user)
32       suspended_user = create(:user, :suspended)
33       name_user = create(:user, :display_name => "Test User")
34       email_user = create(:user, :email => "test@example.com")
35       ip_user = create(:user, :creation_address => "1.2.3.4")
36       edits_user = create(:user)
37       create(:changeset, :user => edits_user)
38
39       # There are now 10 users - the 8 above, plus two extra "granters" for the
40       # moderator_user and administrator_user
41       assert_equal 10, User.count
42
43       # Shouldn't work when not logged in
44       get users_list_path
45       assert_redirected_to login_path(:referer => users_list_path)
46
47       session_for(user)
48
49       # Shouldn't work when logged in as a normal user
50       get users_list_path
51       assert_redirected_to :controller => "/errors", :action => :forbidden
52
53       session_for(moderator_user)
54
55       # Shouldn't work when logged in as a moderator
56       get users_list_path
57       assert_redirected_to :controller => "/errors", :action => :forbidden
58
59       session_for(administrator_user)
60
61       # Note there is a header row, so all row counts are users + 1
62       # Should work when logged in as an administrator
63       get users_list_path
64       assert_response :success
65       assert_template :show
66       assert_select "table#user_list tbody tr", :count => 10
67
68       # Should be able to limit by status
69       get users_list_path, :params => { :status => "suspended" }
70       assert_response :success
71       assert_template :show
72       assert_select "turbo-frame#pagination", :count => 1 do
73         assert_select "input[type='hidden'][name='status'][value='suspended']", :count => 1
74         assert_select "table#user_list tbody tr", :count => 1 do
75           assert_select "a[href='#{user_path(suspended_user)}']", :count => 1
76         end
77       end
78
79       # Should be able to limit by name
80       get users_list_path, :params => { :username => "Test User" }
81       assert_response :success
82       assert_template :show
83       assert_select "turbo-frame#pagination", :count => 1 do
84         assert_select "input[type='hidden'][name='username'][value='Test User']", :count => 1
85         assert_select "table#user_list tbody tr", :count => 1 do
86           assert_select "a[href='#{user_path(name_user)}']", :count => 1
87         end
88       end
89
90       # Should be able to limit by name ignoring case
91       get users_list_path, :params => { :username => "test user" }
92       assert_response :success
93       assert_template :show
94       assert_select "turbo-frame#pagination", :count => 1 do
95         assert_select "input[type='hidden'][name='username'][value='test user']", :count => 1
96         assert_select "table#user_list tbody tr", :count => 1 do
97           assert_select "a[href='#{user_path(name_user)}']", :count => 1
98         end
99       end
100
101       # Should be able to limit by email
102       get users_list_path, :params => { :username => "test@example.com" }
103       assert_response :success
104       assert_template :show
105       assert_select "turbo-frame#pagination", :count => 1 do
106         assert_select "input[type='hidden'][name='username'][value='test@example.com']", :count => 1
107         assert_select "table#user_list tbody tr", :count => 1 do
108           assert_select "a[href='#{user_path(email_user)}']", :count => 1
109         end
110       end
111
112       # Should be able to limit by email ignoring case
113       get users_list_path, :params => { :username => "TEST@example.com" }
114       assert_response :success
115       assert_template :show
116       assert_select "turbo-frame#pagination", :count => 1 do
117         assert_select "input[type='hidden'][name='username'][value='TEST@example.com']", :count => 1
118         assert_select "table#user_list tbody tr", :count => 1 do
119           assert_select "a[href='#{user_path(email_user)}']", :count => 1
120         end
121       end
122
123       # Should be able to limit by IP address
124       get users_list_path, :params => { :ip => "1.2.3.4" }
125       assert_response :success
126       assert_template :show
127       assert_select "turbo-frame#pagination", :count => 1 do
128         assert_select "input[type='hidden'][name='ip'][value='1.2.3.4']", :count => 1
129         assert_select "table#user_list tbody tr", :count => 1 do
130           assert_select "a[href='#{user_path(ip_user)}']", :count => 1
131         end
132       end
133
134       # Should be able to limit to users with edits
135       get users_list_path, :params => { :edits => "yes" }
136       assert_response :success
137       assert_template :show
138       assert_select "turbo-frame#pagination", :count => 1 do
139         assert_select "input[type='hidden'][name='edits'][value='yes']", :count => 1
140         assert_select "table#user_list tbody tr", :count => 1 do
141           assert_select "a[href='#{user_path(edits_user)}']", :count => 1
142         end
143       end
144
145       # Should be able to limit to users with no edits
146       get users_list_path, :params => { :edits => "no" }
147       assert_response :success
148       assert_template :show
149       assert_select "turbo-frame#pagination", :count => 1 do
150         assert_select "input[type='hidden'][name='edits'][value='no']", :count => 1
151         assert_select "table#user_list tbody tr", :count => 9 do
152           assert_select "a[href='#{user_path(edits_user)}']", :count => 0
153         end
154       end
155     end
156
157     def test_show_paginated
158       1.upto(100).each do |n|
159         User.create(:display_name => "extra_#{n}",
160                     :email => "extra#{n}@example.com",
161                     :pass_crypt => "extraextra")
162       end
163
164       session_for(create(:administrator_user))
165
166       # 100 examples, an administrator, and a granter for the admin.
167       assert_equal 102, User.count
168       next_path = users_list_path
169
170       get next_path
171       assert_response :success
172       assert_template :show
173       assert_select "table#user_list tbody tr", :count => 50
174       check_no_page_link "Newer Users"
175       next_path = check_page_link "Older Users"
176
177       get next_path
178       assert_response :success
179       assert_template :show
180       assert_select "table#user_list tbody tr", :count => 50
181       check_page_link "Newer Users"
182       next_path = check_page_link "Older Users"
183
184       get next_path
185       assert_response :success
186       assert_template :show
187       assert_select "table#user_list tbody tr", :count => 2
188       check_page_link "Newer Users"
189       check_no_page_link "Older Users"
190     end
191
192     def test_show_invalid_paginated
193       session_for(create(:administrator_user))
194
195       %w[-1 fred].each do |id|
196         get users_list_path(:before => id)
197         assert_redirected_to :controller => "/errors", :action => :bad_request
198
199         get users_list_path(:after => id)
200         assert_redirected_to :controller => "/errors", :action => :bad_request
201       end
202     end
203
204     def test_update_confirm
205       inactive_user = create(:user, :pending)
206       suspended_user = create(:user, :suspended)
207
208       # Shouldn't work when not logged in
209       assert_no_difference "User.active.count" do
210         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
211       end
212       assert_response :forbidden
213
214       assert_equal "pending", inactive_user.reload.status
215       assert_equal "suspended", suspended_user.reload.status
216
217       session_for(create(:user))
218
219       # Shouldn't work when logged in as a normal user
220       assert_no_difference "User.active.count" do
221         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
222       end
223       assert_redirected_to :controller => "/errors", :action => :forbidden
224       assert_equal "pending", inactive_user.reload.status
225       assert_equal "suspended", suspended_user.reload.status
226
227       session_for(create(:moderator_user))
228
229       # Shouldn't work when logged in as a moderator
230       assert_no_difference "User.active.count" do
231         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
232       end
233       assert_redirected_to :controller => "/errors", :action => :forbidden
234       assert_equal "pending", inactive_user.reload.status
235       assert_equal "suspended", suspended_user.reload.status
236
237       session_for(create(:administrator_user))
238
239       # Should do nothing when no users selected
240       assert_no_difference "User.active.count" do
241         put users_list_path, :params => { :confirm => 1 }
242       end
243       assert_redirected_to :action => :show
244       assert_equal "pending", inactive_user.reload.status
245       assert_equal "suspended", suspended_user.reload.status
246
247       # Should work when logged in as an administrator
248       assert_difference "User.active.count", 2 do
249         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
250       end
251       assert_redirected_to :action => :show
252       assert_equal "confirmed", inactive_user.reload.status
253       assert_equal "confirmed", suspended_user.reload.status
254     end
255
256     def test_update_hide
257       normal_user = create(:user)
258       confirmed_user = create(:user, :confirmed)
259
260       # Shouldn't work when not logged in
261       assert_no_difference "User.active.count" do
262         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
263       end
264       assert_response :forbidden
265
266       assert_equal "active", normal_user.reload.status
267       assert_equal "confirmed", confirmed_user.reload.status
268
269       session_for(create(:user))
270
271       # Shouldn't work when logged in as a normal user
272       assert_no_difference "User.active.count" do
273         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
274       end
275       assert_redirected_to :controller => "/errors", :action => :forbidden
276       assert_equal "active", normal_user.reload.status
277       assert_equal "confirmed", confirmed_user.reload.status
278
279       session_for(create(:moderator_user))
280
281       # Shouldn't work when logged in as a moderator
282       assert_no_difference "User.active.count" do
283         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
284       end
285       assert_redirected_to :controller => "/errors", :action => :forbidden
286       assert_equal "active", normal_user.reload.status
287       assert_equal "confirmed", confirmed_user.reload.status
288
289       session_for(create(:administrator_user))
290
291       # Should do nothing when no users selected
292       assert_no_difference "User.active.count" do
293         put users_list_path, :params => { :hide => 1 }
294       end
295       assert_redirected_to :action => :show
296       assert_equal "active", normal_user.reload.status
297       assert_equal "confirmed", confirmed_user.reload.status
298
299       # Should work when logged in as an administrator
300       assert_difference "User.active.count", -2 do
301         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
302       end
303       assert_redirected_to :action => :show
304       assert_equal "deleted", normal_user.reload.status
305       assert_equal "deleted", confirmed_user.reload.status
306     end
307
308     private
309
310     def check_no_page_link(name)
311       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
312     end
313
314     def check_page_link(name)
315       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
316         return buttons.first.attributes["href"].value
317       end
318     end
319   end
320 end