1 # frozen_string_literal: true
6 class ListsControllerTest < ActionDispatch::IntegrationTest
8 # test all routes which lead to this controller
11 { :path => "/users", :method => :get },
12 { :controller => "users/lists", :action => "show" }
15 { :path => "/users", :method => :put },
16 { :controller => "users/lists", :action => "update" }
19 { :path => "/users/status", :method => :get },
20 { :controller => "users/lists", :action => "show", :status => "status" }
23 { :path => "/users/status", :method => :put },
24 { :controller => "users/lists", :action => "update", :status => "status" }
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)
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
43 # Shouldn't work when not logged in
45 assert_redirected_to login_path(:referer => users_list_path)
49 # Shouldn't work when logged in as a normal user
51 assert_redirected_to :controller => "/errors", :action => :forbidden
53 session_for(moderator_user)
55 # Shouldn't work when logged in as a moderator
57 assert_redirected_to :controller => "/errors", :action => :forbidden
59 session_for(administrator_user)
61 # Note there is a header row, so all row counts are users + 1
62 # Should work when logged in as an administrator
64 assert_response :success
66 assert_select "table#user_list tbody tr", :count => 10
68 # Should be able to limit by status
69 get users_list_path, :params => { :status => "suspended" }
70 assert_response :success
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
79 # Should be able to limit by name
80 get users_list_path, :params => { :username => "Test User" }
81 assert_response :success
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
90 # Should be able to limit by name ignoring case
91 get users_list_path, :params => { :username => "test user" }
92 assert_response :success
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
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
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
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
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
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
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")
164 session_for(create(:administrator_user))
166 # 100 examples, an administrator, and a granter for the admin.
167 assert_equal 102, User.count
168 next_path = users_list_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"
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"
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"
192 def test_show_invalid_paginated
193 session_for(create(:administrator_user))
195 %w[-1 fred].each do |id|
196 get users_list_path(:before => id)
197 assert_redirected_to :controller => "/errors", :action => :bad_request
199 get users_list_path(:after => id)
200 assert_redirected_to :controller => "/errors", :action => :bad_request
204 def test_update_confirm
205 inactive_user = create(:user, :pending)
206 suspended_user = create(:user, :suspended)
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 } }
212 assert_response :forbidden
214 assert_equal "pending", inactive_user.reload.status
215 assert_equal "suspended", suspended_user.reload.status
217 session_for(create(:user))
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 } }
223 assert_redirected_to :controller => "/errors", :action => :forbidden
224 assert_equal "pending", inactive_user.reload.status
225 assert_equal "suspended", suspended_user.reload.status
227 session_for(create(:moderator_user))
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 } }
233 assert_redirected_to :controller => "/errors", :action => :forbidden
234 assert_equal "pending", inactive_user.reload.status
235 assert_equal "suspended", suspended_user.reload.status
237 session_for(create(:administrator_user))
239 # Should do nothing when no users selected
240 assert_no_difference "User.active.count" do
241 put users_list_path, :params => { :confirm => 1 }
243 assert_redirected_to :action => :show
244 assert_equal "pending", inactive_user.reload.status
245 assert_equal "suspended", suspended_user.reload.status
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 } }
251 assert_redirected_to :action => :show
252 assert_equal "confirmed", inactive_user.reload.status
253 assert_equal "confirmed", suspended_user.reload.status
257 normal_user = create(:user)
258 confirmed_user = create(:user, :confirmed)
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 } }
264 assert_response :forbidden
266 assert_equal "active", normal_user.reload.status
267 assert_equal "confirmed", confirmed_user.reload.status
269 session_for(create(:user))
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 } }
275 assert_redirected_to :controller => "/errors", :action => :forbidden
276 assert_equal "active", normal_user.reload.status
277 assert_equal "confirmed", confirmed_user.reload.status
279 session_for(create(:moderator_user))
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 } }
285 assert_redirected_to :controller => "/errors", :action => :forbidden
286 assert_equal "active", normal_user.reload.status
287 assert_equal "confirmed", confirmed_user.reload.status
289 session_for(create(:administrator_user))
291 # Should do nothing when no users selected
292 assert_no_difference "User.active.count" do
293 put users_list_path, :params => { :hide => 1 }
295 assert_redirected_to :action => :show
296 assert_equal "active", normal_user.reload.status
297 assert_equal "confirmed", confirmed_user.reload.status
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 } }
303 assert_redirected_to :action => :show
304 assert_equal "deleted", normal_user.reload.status
305 assert_equal "deleted", confirmed_user.reload.status
310 def check_no_page_link(name)
311 assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
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