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 ip_user = create(:user, :creation_address => "1.2.3.4")
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
37 # Shouldn't work when not logged in
39 assert_redirected_to login_path(:referer => users_list_path)
43 # Shouldn't work when logged in as a normal user
45 assert_redirected_to :controller => "/errors", :action => :forbidden
47 session_for(moderator_user)
49 # Shouldn't work when logged in as a moderator
51 assert_redirected_to :controller => "/errors", :action => :forbidden
53 session_for(administrator_user)
55 # Note there is a header row, so all row counts are users + 1
56 # Should work when logged in as an administrator
58 assert_response :success
60 assert_select "table#user_list tbody tr", :count => 7
62 # Should be able to limit by status
63 get users_list_path, :params => { :status => "suspended" }
64 assert_response :success
66 assert_select "table#user_list tbody tr", :count => 1 do
67 assert_select "a[href='#{user_path(suspended_user)}']", :count => 1
70 # Should be able to limit by IP address
71 get users_list_path, :params => { :ip => "1.2.3.4" }
72 assert_response :success
74 assert_select "table#user_list tbody tr", :count => 1 do
75 assert_select "a[href='#{user_path(ip_user)}']", :count => 1
79 def test_show_paginated
80 1.upto(100).each do |n|
81 User.create(:display_name => "extra_#{n}",
82 :email => "extra#{n}@example.com",
83 :pass_crypt => "extraextra")
86 session_for(create(:administrator_user))
88 # 100 examples, an administrator, and a granter for the admin.
89 assert_equal 102, User.count
90 next_path = users_list_path
93 assert_response :success
95 assert_select "table#user_list tbody tr", :count => 50
96 check_no_page_link "Newer Users"
97 next_path = check_page_link "Older Users"
100 assert_response :success
101 assert_template :show
102 assert_select "table#user_list tbody tr", :count => 50
103 check_page_link "Newer Users"
104 next_path = check_page_link "Older Users"
107 assert_response :success
108 assert_template :show
109 assert_select "table#user_list tbody tr", :count => 2
110 check_page_link "Newer Users"
111 check_no_page_link "Older Users"
114 def test_show_invalid_paginated
115 session_for(create(:administrator_user))
117 %w[-1 0 fred].each do |id|
118 get users_list_path(:before => id)
119 assert_redirected_to :controller => "/errors", :action => :bad_request
121 get users_list_path(:after => id)
122 assert_redirected_to :controller => "/errors", :action => :bad_request
126 def test_update_confirm
127 inactive_user = create(:user, :pending)
128 suspended_user = create(:user, :suspended)
130 # Shouldn't work when not logged in
131 assert_no_difference "User.active.count" do
132 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
134 assert_response :forbidden
136 assert_equal "pending", inactive_user.reload.status
137 assert_equal "suspended", suspended_user.reload.status
139 session_for(create(:user))
141 # Shouldn't work when logged in as a normal user
142 assert_no_difference "User.active.count" do
143 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
145 assert_redirected_to :controller => "/errors", :action => :forbidden
146 assert_equal "pending", inactive_user.reload.status
147 assert_equal "suspended", suspended_user.reload.status
149 session_for(create(:moderator_user))
151 # Shouldn't work when logged in as a moderator
152 assert_no_difference "User.active.count" do
153 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
155 assert_redirected_to :controller => "/errors", :action => :forbidden
156 assert_equal "pending", inactive_user.reload.status
157 assert_equal "suspended", suspended_user.reload.status
159 session_for(create(:administrator_user))
161 # Should work when logged in as an administrator
162 assert_difference "User.active.count", 2 do
163 put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
165 assert_redirected_to :action => :show
166 assert_equal "confirmed", inactive_user.reload.status
167 assert_equal "confirmed", suspended_user.reload.status
171 normal_user = create(:user)
172 confirmed_user = create(:user, :confirmed)
174 # Shouldn't work when not logged in
175 assert_no_difference "User.active.count" do
176 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
178 assert_response :forbidden
180 assert_equal "active", normal_user.reload.status
181 assert_equal "confirmed", confirmed_user.reload.status
183 session_for(create(:user))
185 # Shouldn't work when logged in as a normal user
186 assert_no_difference "User.active.count" do
187 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
189 assert_redirected_to :controller => "/errors", :action => :forbidden
190 assert_equal "active", normal_user.reload.status
191 assert_equal "confirmed", confirmed_user.reload.status
193 session_for(create(:moderator_user))
195 # Shouldn't work when logged in as a moderator
196 assert_no_difference "User.active.count" do
197 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
199 assert_redirected_to :controller => "/errors", :action => :forbidden
200 assert_equal "active", normal_user.reload.status
201 assert_equal "confirmed", confirmed_user.reload.status
203 session_for(create(:administrator_user))
205 # Should work when logged in as an administrator
206 assert_difference "User.active.count", -2 do
207 put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
209 assert_redirected_to :action => :show
210 assert_equal "deleted", normal_user.reload.status
211 assert_equal "deleted", confirmed_user.reload.status
216 def check_no_page_link(name)
217 assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
220 def check_page_link(name)
221 assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
222 return buttons.first.attributes["href"].value