]> git.openstreetmap.org Git - rails.git/blob - test/controllers/users/lists_controller_test.rb
Merge remote-tracking branch 'upstream/pull/5391'
[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       _ip_user = create(:user, :creation_address => "1.2.3.4")
32
33       # There are now 7 users - the five above, plus two extra "granters" for the
34       # moderator_user and administrator_user
35       assert_equal 7, User.count
36
37       # Shouldn't work when not logged in
38       get users_list_path
39       assert_redirected_to login_path(:referer => users_list_path)
40
41       session_for(user)
42
43       # Shouldn't work when logged in as a normal user
44       get users_list_path
45       assert_redirected_to :controller => "/errors", :action => :forbidden
46
47       session_for(moderator_user)
48
49       # Shouldn't work when logged in as a moderator
50       get users_list_path
51       assert_redirected_to :controller => "/errors", :action => :forbidden
52
53       session_for(administrator_user)
54
55       # Note there is a header row, so all row counts are users + 1
56       # Should work when logged in as an administrator
57       get users_list_path
58       assert_response :success
59       assert_template :show
60       assert_select "table#user_list tbody tr", :count => 7
61
62       # Should be able to limit by status
63       get users_list_path, :params => { :status => "suspended" }
64       assert_response :success
65       assert_template :show
66       assert_select "table#user_list tbody tr", :count => 1
67
68       # Should be able to limit by IP address
69       get users_list_path, :params => { :ip => "1.2.3.4" }
70       assert_response :success
71       assert_template :show
72       assert_select "table#user_list tbody tr", :count => 1
73     end
74
75     def test_show_paginated
76       1.upto(100).each do |n|
77         User.create(:display_name => "extra_#{n}",
78                     :email => "extra#{n}@example.com",
79                     :pass_crypt => "extraextra")
80       end
81
82       session_for(create(:administrator_user))
83
84       # 100 examples, an administrator, and a granter for the admin.
85       assert_equal 102, User.count
86       next_path = users_list_path
87
88       get next_path
89       assert_response :success
90       assert_template :show
91       assert_select "table#user_list tbody tr", :count => 50
92       check_no_page_link "Newer Users"
93       next_path = check_page_link "Older Users"
94
95       get next_path
96       assert_response :success
97       assert_template :show
98       assert_select "table#user_list tbody tr", :count => 50
99       check_page_link "Newer Users"
100       next_path = check_page_link "Older Users"
101
102       get next_path
103       assert_response :success
104       assert_template :show
105       assert_select "table#user_list tbody tr", :count => 2
106       check_page_link "Newer Users"
107       check_no_page_link "Older Users"
108     end
109
110     def test_show_invalid_paginated
111       session_for(create(:administrator_user))
112
113       %w[-1 0 fred].each do |id|
114         get users_list_path(:before => id)
115         assert_redirected_to :controller => "/errors", :action => :bad_request
116
117         get users_list_path(:after => id)
118         assert_redirected_to :controller => "/errors", :action => :bad_request
119       end
120     end
121
122     def test_update_confirm
123       inactive_user = create(:user, :pending)
124       suspended_user = create(:user, :suspended)
125
126       # Shouldn't work when not logged in
127       assert_no_difference "User.active.count" do
128         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
129       end
130       assert_response :forbidden
131
132       assert_equal "pending", inactive_user.reload.status
133       assert_equal "suspended", suspended_user.reload.status
134
135       session_for(create(:user))
136
137       # Shouldn't work when logged in as a normal user
138       assert_no_difference "User.active.count" do
139         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
140       end
141       assert_redirected_to :controller => "/errors", :action => :forbidden
142       assert_equal "pending", inactive_user.reload.status
143       assert_equal "suspended", suspended_user.reload.status
144
145       session_for(create(:moderator_user))
146
147       # Shouldn't work when logged in as a moderator
148       assert_no_difference "User.active.count" do
149         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
150       end
151       assert_redirected_to :controller => "/errors", :action => :forbidden
152       assert_equal "pending", inactive_user.reload.status
153       assert_equal "suspended", suspended_user.reload.status
154
155       session_for(create(:administrator_user))
156
157       # Should work when logged in as an administrator
158       assert_difference "User.active.count", 2 do
159         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
160       end
161       assert_redirected_to :action => :show
162       assert_equal "confirmed", inactive_user.reload.status
163       assert_equal "confirmed", suspended_user.reload.status
164     end
165
166     def test_update_hide
167       normal_user = create(:user)
168       confirmed_user = create(:user, :confirmed)
169
170       # Shouldn't work when not logged in
171       assert_no_difference "User.active.count" do
172         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
173       end
174       assert_response :forbidden
175
176       assert_equal "active", normal_user.reload.status
177       assert_equal "confirmed", confirmed_user.reload.status
178
179       session_for(create(:user))
180
181       # Shouldn't work when logged in as a normal user
182       assert_no_difference "User.active.count" do
183         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
184       end
185       assert_redirected_to :controller => "/errors", :action => :forbidden
186       assert_equal "active", normal_user.reload.status
187       assert_equal "confirmed", confirmed_user.reload.status
188
189       session_for(create(:moderator_user))
190
191       # Shouldn't work when logged in as a moderator
192       assert_no_difference "User.active.count" do
193         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
194       end
195       assert_redirected_to :controller => "/errors", :action => :forbidden
196       assert_equal "active", normal_user.reload.status
197       assert_equal "confirmed", confirmed_user.reload.status
198
199       session_for(create(:administrator_user))
200
201       # Should work when logged in as an administrator
202       assert_difference "User.active.count", -2 do
203         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
204       end
205       assert_redirected_to :action => :show
206       assert_equal "deleted", normal_user.reload.status
207       assert_equal "deleted", confirmed_user.reload.status
208     end
209
210     private
211
212     def check_no_page_link(name)
213       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
214     end
215
216     def check_page_link(name)
217       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
218         return buttons.first.attributes["href"].value
219       end
220     end
221   end
222 end