]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users/lists_controller_test.rb
2471b34b3b4d534050e80a3e03559edb520e587e
[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 "table#user_list tbody tr", :count => 1 do
71         assert_select "a[href='#{user_path(suspended_user)}']", :count => 1
72       end
73
74       # Should be able to limit by name
75       get users_list_path, :params => { :username => "Test User" }
76       assert_response :success
77       assert_template :show
78       assert_select "table#user_list tbody tr", :count => 1 do
79         assert_select "a[href='#{user_path(name_user)}']", :count => 1
80       end
81
82       # Should be able to limit by name ignoring case
83       get users_list_path, :params => { :username => "test user" }
84       assert_response :success
85       assert_template :show
86       assert_select "table#user_list tbody tr", :count => 1 do
87         assert_select "a[href='#{user_path(name_user)}']", :count => 1
88       end
89
90       # Should be able to limit by email
91       get users_list_path, :params => { :username => "test@example.com" }
92       assert_response :success
93       assert_template :show
94       assert_select "table#user_list tbody tr", :count => 1 do
95         assert_select "a[href='#{user_path(email_user)}']", :count => 1
96       end
97
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
104       end
105
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
112       end
113
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
120       end
121
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
128       end
129     end
130
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")
136       end
137
138       session_for(create(:administrator_user))
139
140       # 100 examples, an administrator, and a granter for the admin.
141       assert_equal 102, User.count
142       next_path = users_list_path
143
144       get next_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"
150
151       get next_path
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"
157
158       get next_path
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"
164     end
165
166     def test_show_invalid_paginated
167       session_for(create(:administrator_user))
168
169       %w[-1 0 fred].each do |id|
170         get users_list_path(:before => id)
171         assert_redirected_to :controller => "/errors", :action => :bad_request
172
173         get users_list_path(:after => id)
174         assert_redirected_to :controller => "/errors", :action => :bad_request
175       end
176     end
177
178     def test_update_confirm
179       inactive_user = create(:user, :pending)
180       suspended_user = create(:user, :suspended)
181
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 } }
185       end
186       assert_response :forbidden
187
188       assert_equal "pending", inactive_user.reload.status
189       assert_equal "suspended", suspended_user.reload.status
190
191       session_for(create(:user))
192
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 } }
196       end
197       assert_redirected_to :controller => "/errors", :action => :forbidden
198       assert_equal "pending", inactive_user.reload.status
199       assert_equal "suspended", suspended_user.reload.status
200
201       session_for(create(:moderator_user))
202
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 } }
206       end
207       assert_redirected_to :controller => "/errors", :action => :forbidden
208       assert_equal "pending", inactive_user.reload.status
209       assert_equal "suspended", suspended_user.reload.status
210
211       session_for(create(:administrator_user))
212
213       # Should do nothing when no users selected
214       assert_no_difference "User.active.count" do
215         put users_list_path, :params => { :confirm => 1 }
216       end
217       assert_redirected_to :action => :show
218       assert_equal "pending", inactive_user.reload.status
219       assert_equal "suspended", suspended_user.reload.status
220
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 } }
224       end
225       assert_redirected_to :action => :show
226       assert_equal "confirmed", inactive_user.reload.status
227       assert_equal "confirmed", suspended_user.reload.status
228     end
229
230     def test_update_hide
231       normal_user = create(:user)
232       confirmed_user = create(:user, :confirmed)
233
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 } }
237       end
238       assert_response :forbidden
239
240       assert_equal "active", normal_user.reload.status
241       assert_equal "confirmed", confirmed_user.reload.status
242
243       session_for(create(:user))
244
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 } }
248       end
249       assert_redirected_to :controller => "/errors", :action => :forbidden
250       assert_equal "active", normal_user.reload.status
251       assert_equal "confirmed", confirmed_user.reload.status
252
253       session_for(create(:moderator_user))
254
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 } }
258       end
259       assert_redirected_to :controller => "/errors", :action => :forbidden
260       assert_equal "active", normal_user.reload.status
261       assert_equal "confirmed", confirmed_user.reload.status
262
263       session_for(create(:administrator_user))
264
265       # Should do nothing when no users selected
266       assert_no_difference "User.active.count" do
267         put users_list_path, :params => { :hide => 1 }
268       end
269       assert_redirected_to :action => :show
270       assert_equal "active", normal_user.reload.status
271       assert_equal "confirmed", confirmed_user.reload.status
272
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 } }
276       end
277       assert_redirected_to :action => :show
278       assert_equal "deleted", normal_user.reload.status
279       assert_equal "deleted", confirmed_user.reload.status
280     end
281
282     private
283
284     def check_no_page_link(name)
285       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
286     end
287
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
291       end
292     end
293   end
294 end