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 "table#user_list tbody tr", :count => 1 do
71 assert_select "a[href='#{user_path(suspended_user)}']", :count => 1
74 # Should be able to limit by name
75 get users_list_path, :params => { :username => "Test User" }
76 assert_response :success
78 assert_select "table#user_list tbody tr", :count => 1 do
79 assert_select "a[href='#{user_path(name_user)}']", :count => 1
82 # Should be able to limit by name ignoring case
83 get users_list_path, :params => { :username => "test user" }
84 assert_response :success
86 assert_select "table#user_list tbody tr", :count => 1 do
87 assert_select "a[href='#{user_path(name_user)}']", :count => 1
90 # Should be able to limit by email
91 get users_list_path, :params => { :username => "test@example.com" }
92 assert_response :success
94 assert_select "table#user_list tbody tr", :count => 1 do
95 assert_select "a[href='#{user_path(email_user)}']", :count => 1
98 # Should be able to limit by email ignoring case
99 get users_list_path, :params => { :username => "TEST@example.com" }
100 assert_response :success
101 assert_template :show
102 assert_select "table#user_list tbody tr", :count => 1 do
103 assert_select "a[href='#{user_path(email_user)}']", :count => 1
106 # Should be able to limit by IP address
107 get users_list_path, :params => { :ip => "1.2.3.4" }
108 assert_response :success
109 assert_template :show
110 assert_select "table#user_list tbody tr", :count => 1 do
111 assert_select "a[href='#{user_path(ip_user)}']", :count => 1
114 # Should be able to limit to users with edits
115 get users_list_path, :params => { :edits => "yes" }
116 assert_response :success
117 assert_template :show
118 assert_select "table#user_list tbody tr", :count => 1 do
119 assert_select "a[href='#{user_path(edits_user)}']", :count => 1
122 # Should be able to limit to users with no edits
123 get users_list_path, :params => { :edits => "no" }
124 assert_response :success
125 assert_template :show
126 assert_select "table#user_list tbody tr", :count => 9 do
127 assert_select "a[href='#{user_path(edits_user)}']", :count => 0
131 def test_show_paginated
132 1.upto(100).each do |n|
133 User.create(:display_name => "extra_#{n}",
134 :email => "extra#{n}@example.com",
135 :pass_crypt => "extraextra")
138 session_for(create(:administrator_user))
140 # 100 examples, an administrator, and a granter for the admin.
141 assert_equal 102, User.count
142 next_path = users_list_path
145 assert_response :success
146 assert_template :show
147 assert_select "table#user_list tbody tr", :count => 50
148 check_no_page_link "Newer Users"
149 next_path = check_page_link "Older Users"
152 assert_response :success
153 assert_template :show
154 assert_select "table#user_list tbody tr", :count => 50
155 check_page_link "Newer Users"
156 next_path = check_page_link "Older Users"
159 assert_response :success
160 assert_template :show
161 assert_select "table#user_list tbody tr", :count => 2
162 check_page_link "Newer Users"
163 check_no_page_link "Older Users"
166 def test_show_invalid_paginated
167 session_for(create(:administrator_user))
169 %w[-1 0 fred].each do |id|
170 get users_list_path(:before => id)
171 assert_redirected_to :controller => "/errors", :action => :bad_request
173 get users_list_path(:after => id)
174 assert_redirected_to :controller => "/errors", :action => :bad_request
178 def test_update_confirm
179 inactive_user = create(:user, :pending)
180 suspended_user = create(:user, :suspended)
182 # Shouldn't work when not logged in
183 assert_no_difference "User.active.count" do
184 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
186 assert_response :forbidden
188 assert_equal "pending", inactive_user.reload.status
189 assert_equal "suspended", suspended_user.reload.status
191 session_for(create(:user))
193 # Shouldn't work when logged in as a normal user
194 assert_no_difference "User.active.count" do
195 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
197 assert_redirected_to :controller => "/errors", :action => :forbidden
198 assert_equal "pending", inactive_user.reload.status
199 assert_equal "suspended", suspended_user.reload.status
201 session_for(create(:moderator_user))
203 # Shouldn't work when logged in as a moderator
204 assert_no_difference "User.active.count" do
205 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
207 assert_redirected_to :controller => "/errors", :action => :forbidden
208 assert_equal "pending", inactive_user.reload.status
209 assert_equal "suspended", suspended_user.reload.status
211 session_for(create(:administrator_user))
213 # Should do nothing when no users selected
214 assert_no_difference "User.active.count" do
215 put users_list_path, :params => { :confirm => 1 }
217 assert_redirected_to :action => :show
218 assert_equal "pending", inactive_user.reload.status
219 assert_equal "suspended", suspended_user.reload.status
221 # Should work when logged in as an administrator
222 assert_difference "User.active.count", 2 do
223 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
225 assert_redirected_to :action => :show
226 assert_equal "confirmed", inactive_user.reload.status
227 assert_equal "confirmed", suspended_user.reload.status
231 normal_user = create(:user)
232 confirmed_user = create(:user, :confirmed)
234 # Shouldn't work when not logged in
235 assert_no_difference "User.active.count" do
236 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
238 assert_response :forbidden
240 assert_equal "active", normal_user.reload.status
241 assert_equal "confirmed", confirmed_user.reload.status
243 session_for(create(:user))
245 # Shouldn't work when logged in as a normal user
246 assert_no_difference "User.active.count" do
247 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
249 assert_redirected_to :controller => "/errors", :action => :forbidden
250 assert_equal "active", normal_user.reload.status
251 assert_equal "confirmed", confirmed_user.reload.status
253 session_for(create(:moderator_user))
255 # Shouldn't work when logged in as a moderator
256 assert_no_difference "User.active.count" do
257 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
259 assert_redirected_to :controller => "/errors", :action => :forbidden
260 assert_equal "active", normal_user.reload.status
261 assert_equal "confirmed", confirmed_user.reload.status
263 session_for(create(:administrator_user))
265 # Should do nothing when no users selected
266 assert_no_difference "User.active.count" do
267 put users_list_path, :params => { :hide => 1 }
269 assert_redirected_to :action => :show
270 assert_equal "active", normal_user.reload.status
271 assert_equal "confirmed", confirmed_user.reload.status
273 # Should work when logged in as an administrator
274 assert_difference "User.active.count", -2 do
275 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
277 assert_redirected_to :action => :show
278 assert_equal "deleted", normal_user.reload.status
279 assert_equal "deleted", confirmed_user.reload.status
284 def check_no_page_link(name)
285 assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
288 def check_page_link(name)
289 assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
290 return buttons.first.attributes["href"].value