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