1 # frozen_string_literal: true
 
   6   class ListsControllerTest < ActionDispatch::IntegrationTest
 
   8     # test all routes which lead to this controller
 
  11         { :path => "/users", :method => :get },
 
  12         { :controller => "users/lists", :action => "show" }
 
  15         { :path => "/users", :method => :put },
 
  16         { :controller => "users/lists", :action => "update" }
 
  19         { :path => "/users/status", :method => :get },
 
  20         { :controller => "users/lists", :action => "show", :status => "status" }
 
  23         { :path => "/users/status", :method => :put },
 
  24         { :controller => "users/lists", :action => "update", :status => "status" }
 
  30       moderator_user = create(:moderator_user)
 
  31       administrator_user = create(:administrator_user)
 
  32       suspended_user = create(:user, :suspended)
 
  33       name_user = create(:user, :display_name => "Test User")
 
  34       email_user = create(:user, :email => "test@example.com")
 
  35       ip_user = create(:user, :creation_address => "1.2.3.4")
 
  36       edits_user = create(:user)
 
  37       create(:changeset, :user => edits_user)
 
  39       # There are now 10 users - the 8 above, plus two extra "granters" for the
 
  40       # moderator_user and administrator_user
 
  41       assert_equal 10, User.count
 
  43       # Shouldn't work when not logged in
 
  45       assert_redirected_to login_path(:referer => users_list_path)
 
  49       # Shouldn't work when logged in as a normal user
 
  51       assert_redirected_to :controller => "/errors", :action => :forbidden
 
  53       session_for(moderator_user)
 
  55       # Shouldn't work when logged in as a moderator
 
  57       assert_redirected_to :controller => "/errors", :action => :forbidden
 
  59       session_for(administrator_user)
 
  61       # Note there is a header row, so all row counts are users + 1
 
  62       # Should work when logged in as an administrator
 
  64       assert_response :success
 
  66       assert_select "table#user_list tbody tr", :count => 10
 
  68       # Should be able to limit by status
 
  69       get users_list_path, :params => { :status => "suspended" }
 
  70       assert_response :success
 
  72       assert_select "turbo-frame#pagination", :count => 1 do
 
  73         assert_select "input[type='hidden'][name='status'][value='suspended']", :count => 1
 
  74         assert_select "table#user_list tbody tr", :count => 1 do
 
  75           assert_select "a[href='#{user_path(suspended_user)}']", :count => 1
 
  79       # Should be able to limit by name
 
  80       get users_list_path, :params => { :username => "Test User" }
 
  81       assert_response :success
 
  83       assert_select "turbo-frame#pagination", :count => 1 do
 
  84         assert_select "input[type='hidden'][name='username'][value='Test User']", :count => 1
 
  85         assert_select "table#user_list tbody tr", :count => 1 do
 
  86           assert_select "a[href='#{user_path(name_user)}']", :count => 1
 
  90       # Should be able to limit by name ignoring case
 
  91       get users_list_path, :params => { :username => "test user" }
 
  92       assert_response :success
 
  94       assert_select "turbo-frame#pagination", :count => 1 do
 
  95         assert_select "input[type='hidden'][name='username'][value='test user']", :count => 1
 
  96         assert_select "table#user_list tbody tr", :count => 1 do
 
  97           assert_select "a[href='#{user_path(name_user)}']", :count => 1
 
 101       # Should be able to limit by email
 
 102       get users_list_path, :params => { :username => "test@example.com" }
 
 103       assert_response :success
 
 104       assert_template :show
 
 105       assert_select "turbo-frame#pagination", :count => 1 do
 
 106         assert_select "input[type='hidden'][name='username'][value='test@example.com']", :count => 1
 
 107         assert_select "table#user_list tbody tr", :count => 1 do
 
 108           assert_select "a[href='#{user_path(email_user)}']", :count => 1
 
 112       # Should be able to limit by email ignoring case
 
 113       get users_list_path, :params => { :username => "TEST@example.com" }
 
 114       assert_response :success
 
 115       assert_template :show
 
 116       assert_select "turbo-frame#pagination", :count => 1 do
 
 117         assert_select "input[type='hidden'][name='username'][value='TEST@example.com']", :count => 1
 
 118         assert_select "table#user_list tbody tr", :count => 1 do
 
 119           assert_select "a[href='#{user_path(email_user)}']", :count => 1
 
 123       # Should be able to limit by IP address
 
 124       get users_list_path, :params => { :ip => "1.2.3.4" }
 
 125       assert_response :success
 
 126       assert_template :show
 
 127       assert_select "turbo-frame#pagination", :count => 1 do
 
 128         assert_select "input[type='hidden'][name='ip'][value='1.2.3.4']", :count => 1
 
 129         assert_select "table#user_list tbody tr", :count => 1 do
 
 130           assert_select "a[href='#{user_path(ip_user)}']", :count => 1
 
 134       # Should be able to limit to users with edits
 
 135       get users_list_path, :params => { :edits => "yes" }
 
 136       assert_response :success
 
 137       assert_template :show
 
 138       assert_select "turbo-frame#pagination", :count => 1 do
 
 139         assert_select "input[type='hidden'][name='edits'][value='yes']", :count => 1
 
 140         assert_select "table#user_list tbody tr", :count => 1 do
 
 141           assert_select "a[href='#{user_path(edits_user)}']", :count => 1
 
 145       # Should be able to limit to users with no edits
 
 146       get users_list_path, :params => { :edits => "no" }
 
 147       assert_response :success
 
 148       assert_template :show
 
 149       assert_select "turbo-frame#pagination", :count => 1 do
 
 150         assert_select "input[type='hidden'][name='edits'][value='no']", :count => 1
 
 151         assert_select "table#user_list tbody tr", :count => 9 do
 
 152           assert_select "a[href='#{user_path(edits_user)}']", :count => 0
 
 157     def test_show_paginated
 
 158       1.upto(100).each do |n|
 
 159         User.create(:display_name => "extra_#{n}",
 
 160                     :email => "extra#{n}@example.com",
 
 161                     :pass_crypt => "extraextra")
 
 164       session_for(create(:administrator_user))
 
 166       # 100 examples, an administrator, and a granter for the admin.
 
 167       assert_equal 102, User.count
 
 168       next_path = users_list_path
 
 171       assert_response :success
 
 172       assert_template :show
 
 173       assert_select "table#user_list tbody tr", :count => 50
 
 174       check_no_page_link "Newer Users"
 
 175       next_path = check_page_link "Older Users"
 
 178       assert_response :success
 
 179       assert_template :show
 
 180       assert_select "table#user_list tbody tr", :count => 50
 
 181       check_page_link "Newer Users"
 
 182       next_path = check_page_link "Older Users"
 
 185       assert_response :success
 
 186       assert_template :show
 
 187       assert_select "table#user_list tbody tr", :count => 2
 
 188       check_page_link "Newer Users"
 
 189       check_no_page_link "Older Users"
 
 192     def test_show_invalid_paginated
 
 193       session_for(create(:administrator_user))
 
 195       %w[-1 fred].each do |id|
 
 196         get users_list_path(:before => id)
 
 197         assert_redirected_to :controller => "/errors", :action => :bad_request
 
 199         get users_list_path(:after => id)
 
 200         assert_redirected_to :controller => "/errors", :action => :bad_request
 
 204     def test_update_confirm
 
 205       inactive_user = create(:user, :pending)
 
 206       suspended_user = create(:user, :suspended)
 
 208       # Shouldn't work when not logged in
 
 209       assert_no_difference "User.active.count" do
 
 210         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
 
 212       assert_response :forbidden
 
 214       assert_equal "pending", inactive_user.reload.status
 
 215       assert_equal "suspended", suspended_user.reload.status
 
 217       session_for(create(:user))
 
 219       # Shouldn't work when logged in as a normal user
 
 220       assert_no_difference "User.active.count" do
 
 221         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
 
 223       assert_redirected_to :controller => "/errors", :action => :forbidden
 
 224       assert_equal "pending", inactive_user.reload.status
 
 225       assert_equal "suspended", suspended_user.reload.status
 
 227       session_for(create(:moderator_user))
 
 229       # Shouldn't work when logged in as a moderator
 
 230       assert_no_difference "User.active.count" do
 
 231         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
 
 233       assert_redirected_to :controller => "/errors", :action => :forbidden
 
 234       assert_equal "pending", inactive_user.reload.status
 
 235       assert_equal "suspended", suspended_user.reload.status
 
 237       session_for(create(:administrator_user))
 
 239       # Should do nothing when no users selected
 
 240       assert_no_difference "User.active.count" do
 
 241         put users_list_path, :params => { :confirm => 1 }
 
 243       assert_redirected_to :action => :show
 
 244       assert_equal "pending", inactive_user.reload.status
 
 245       assert_equal "suspended", suspended_user.reload.status
 
 247       # Should work when logged in as an administrator
 
 248       assert_difference "User.active.count", 2 do
 
 249         put users_list_path, :params => { :confirm => 1, :user => { inactive_user.id => 1, suspended_user.id => 1 } }
 
 251       assert_redirected_to :action => :show
 
 252       assert_equal "confirmed", inactive_user.reload.status
 
 253       assert_equal "confirmed", suspended_user.reload.status
 
 257       normal_user = create(:user)
 
 258       confirmed_user = create(:user, :confirmed)
 
 260       # Shouldn't work when not logged in
 
 261       assert_no_difference "User.active.count" do
 
 262         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
 
 264       assert_response :forbidden
 
 266       assert_equal "active", normal_user.reload.status
 
 267       assert_equal "confirmed", confirmed_user.reload.status
 
 269       session_for(create(:user))
 
 271       # Shouldn't work when logged in as a normal user
 
 272       assert_no_difference "User.active.count" do
 
 273         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
 
 275       assert_redirected_to :controller => "/errors", :action => :forbidden
 
 276       assert_equal "active", normal_user.reload.status
 
 277       assert_equal "confirmed", confirmed_user.reload.status
 
 279       session_for(create(:moderator_user))
 
 281       # Shouldn't work when logged in as a moderator
 
 282       assert_no_difference "User.active.count" do
 
 283         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
 
 285       assert_redirected_to :controller => "/errors", :action => :forbidden
 
 286       assert_equal "active", normal_user.reload.status
 
 287       assert_equal "confirmed", confirmed_user.reload.status
 
 289       session_for(create(:administrator_user))
 
 291       # Should do nothing when no users selected
 
 292       assert_no_difference "User.active.count" do
 
 293         put users_list_path, :params => { :hide => 1 }
 
 295       assert_redirected_to :action => :show
 
 296       assert_equal "active", normal_user.reload.status
 
 297       assert_equal "confirmed", confirmed_user.reload.status
 
 299       # Should work when logged in as an administrator
 
 300       assert_difference "User.active.count", -2 do
 
 301         put users_list_path, :params => { :hide => 1, :user => { normal_user.id => 1, confirmed_user.id => 1 } }
 
 303       assert_redirected_to :action => :show
 
 304       assert_equal "deleted", normal_user.reload.status
 
 305       assert_equal "deleted", confirmed_user.reload.status
 
 310     def check_no_page_link(name)
 
 311       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/, :count => 0 }, "unexpected #{name} page link"
 
 314     def check_page_link(name)
 
 315       assert_select "a.page-link", { :text => /#{Regexp.quote(name)}/ }, "missing #{name} page link" do |buttons|
 
 316         return buttons.first.attributes["href"].value