4 class ListsControllerTest < ActionDispatch::IntegrationTest
6 # test all routes which lead to this controller
9 { :path => "/users", :method => :get },
10 { :controller => "users/lists", :action => "show" }
13 { :path => "/users", :method => :put },
14 { :controller => "users/lists", :action => "update" }
17 { :path => "/users/status", :method => :get },
18 { :controller => "users/lists", :action => "show", :status => "status" }
21 { :path => "/users/status", :method => :put },
22 { :controller => "users/lists", :action => "update", :status => "status" }
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)
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
41 # Shouldn't work when not logged in
43 assert_redirected_to login_path(:referer => users_list_path)
47 # Shouldn't work when logged in as a normal user
49 assert_redirected_to :controller => "/errors", :action => :forbidden
51 session_for(moderator_user)
53 # Shouldn't work when logged in as a moderator
55 assert_redirected_to :controller => "/errors", :action => :forbidden
57 session_for(administrator_user)
59 # Note there is a header row, so all row counts are users + 1
60 # Should work when logged in as an administrator
62 assert_response :success
64 assert_select "table#user_list tbody tr", :count => 10
66 # Should be able to limit by status
67 get users_list_path, :params => { :status => "suspended" }
68 assert_response :success
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
77 # Should be able to limit by name
78 get users_list_path, :params => { :username => "Test User" }
79 assert_response :success
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
88 # Should be able to limit by name ignoring case
89 get users_list_path, :params => { :username => "test user" }
90 assert_response :success
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
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
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
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
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
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
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")
162 session_for(create(:administrator_user))
164 # 100 examples, an administrator, and a granter for the admin.
165 assert_equal 102, User.count
166 next_path = users_list_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"
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"
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"
190 def test_show_invalid_paginated
191 session_for(create(:administrator_user))
193 %w[-1 0 fred].each do |id|
194 get users_list_path(:before => id)
195 assert_redirected_to :controller => "/errors", :action => :bad_request
197 get users_list_path(:after => id)
198 assert_redirected_to :controller => "/errors", :action => :bad_request
202 def test_update_confirm
203 inactive_user = create(:user, :pending)
204 suspended_user = create(:user, :suspended)
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 } }
210 assert_response :forbidden
212 assert_equal "pending", inactive_user.reload.status
213 assert_equal "suspended", suspended_user.reload.status
215 session_for(create(:user))
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 } }
221 assert_redirected_to :controller => "/errors", :action => :forbidden
222 assert_equal "pending", inactive_user.reload.status
223 assert_equal "suspended", suspended_user.reload.status
225 session_for(create(:moderator_user))
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 } }
231 assert_redirected_to :controller => "/errors", :action => :forbidden
232 assert_equal "pending", inactive_user.reload.status
233 assert_equal "suspended", suspended_user.reload.status
235 session_for(create(:administrator_user))
237 # Should do nothing when no users selected
238 assert_no_difference "User.active.count" do
239 put users_list_path, :params => { :confirm => 1 }
241 assert_redirected_to :action => :show
242 assert_equal "pending", inactive_user.reload.status
243 assert_equal "suspended", suspended_user.reload.status
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 } }
249 assert_redirected_to :action => :show
250 assert_equal "confirmed", inactive_user.reload.status
251 assert_equal "confirmed", suspended_user.reload.status
255 normal_user = create(:user)
256 confirmed_user = create(:user, :confirmed)
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 } }
262 assert_response :forbidden
264 assert_equal "active", normal_user.reload.status
265 assert_equal "confirmed", confirmed_user.reload.status
267 session_for(create(:user))
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 } }
273 assert_redirected_to :controller => "/errors", :action => :forbidden
274 assert_equal "active", normal_user.reload.status
275 assert_equal "confirmed", confirmed_user.reload.status
277 session_for(create(:moderator_user))
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 } }
283 assert_redirected_to :controller => "/errors", :action => :forbidden
284 assert_equal "active", normal_user.reload.status
285 assert_equal "confirmed", confirmed_user.reload.status
287 session_for(create(:administrator_user))
289 # Should do nothing when no users selected
290 assert_no_difference "User.active.count" do
291 put users_list_path, :params => { :hide => 1 }
293 assert_redirected_to :action => :show
294 assert_equal "active", normal_user.reload.status
295 assert_equal "confirmed", confirmed_user.reload.status
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 } }
301 assert_redirected_to :action => :show
302 assert_equal "deleted", normal_user.reload.status
303 assert_equal "deleted", confirmed_user.reload.status
308 def check_no_page_link(name)
309 assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
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