1 # frozen_string_literal: true
 
   5 class UserRolesControllerTest < ActionDispatch::IntegrationTest
 
   7   # test all routes which lead to this controller
 
  10       { :path => "/user/username/roles/rolename", :method => :post },
 
  11       { :controller => "user_roles", :action => "create", :user_display_name => "username", :role => "rolename" }
 
  14       { :path => "/user/username/roles/rolename", :method => :delete },
 
  15       { :controller => "user_roles", :action => "destroy", :user_display_name => "username", :role => "rolename" }
 
  20   # test the grant role action
 
  22     target_user = create(:user)
 
  23     normal_user = create(:user)
 
  24     administrator_user = create(:administrator_user)
 
  25     super_user = create(:super_user)
 
  27     # Granting should fail when not logged in
 
  28     post user_role_path(target_user, "moderator")
 
  29     assert_response :forbidden
 
  31     # Login as an unprivileged user
 
  32     session_for(normal_user)
 
  34     # Granting should still fail
 
  35     post user_role_path(target_user, "moderator")
 
  36     assert_redirected_to :controller => :errors, :action => :forbidden
 
  38     # Login as an administrator
 
  39     session_for(administrator_user)
 
  41     UserRole::ALL_ROLES.each do |role|
 
  42       # Granting a role to a non-existent user should fail
 
  43       assert_difference "UserRole.count", 0 do
 
  44         post user_role_path("non_existent_user", role)
 
  46       assert_response :not_found
 
  47       assert_template "users/no_such_user"
 
  48       assert_select "h1", "The user non_existent_user does not exist"
 
  50       # Granting a role to a user that already has it should fail
 
  51       assert_no_difference "UserRole.count" do
 
  52         post user_role_path(super_user, role)
 
  54       assert_redirected_to user_path(super_user)
 
  55       assert_equal "The user already has role #{role}.", flash[:error]
 
  57       # Granting a role to a user that doesn't have it should work...
 
  58       assert_difference "UserRole.count", 1 do
 
  59         post user_role_path(target_user, role)
 
  61       assert_redirected_to user_path(target_user)
 
  63       # ...but trying a second time should fail
 
  64       assert_no_difference "UserRole.count" do
 
  65         post user_role_path(target_user, role)
 
  67       assert_redirected_to user_path(target_user)
 
  68       assert_equal "The user already has role #{role}.", flash[:error]
 
  71     # Granting a non-existent role should fail
 
  72     assert_difference "UserRole.count", 0 do
 
  73       post user_role_path(target_user, "no_such_role")
 
  75     assert_redirected_to user_path(target_user)
 
  76     assert_equal "The string 'no_such_role' is not a valid role.", flash[:error]
 
  80   # test the revoke role action
 
  82     target_user = create(:user)
 
  83     normal_user = create(:user)
 
  84     administrator_user = create(:administrator_user)
 
  85     super_user = create(:super_user)
 
  87     # Revoking should fail when not logged in
 
  88     delete user_role_path(target_user, "moderator")
 
  89     assert_response :forbidden
 
  91     # Login as an unprivileged user
 
  92     session_for(normal_user)
 
  94     # Revoking should still fail
 
  95     delete user_role_path(target_user, "moderator")
 
  96     assert_redirected_to :controller => :errors, :action => :forbidden
 
  98     # Login as an administrator
 
  99     session_for(administrator_user)
 
 101     UserRole::ALL_ROLES.each do |role|
 
 102       # Removing a role from a non-existent user should fail
 
 103       assert_difference "UserRole.count", 0 do
 
 104         delete user_role_path("non_existent_user", role)
 
 106       assert_response :not_found
 
 107       assert_template "users/no_such_user"
 
 108       assert_select "h1", "The user non_existent_user does not exist"
 
 110       # Removing a role from a user that doesn't have it should fail
 
 111       assert_no_difference "UserRole.count" do
 
 112         delete user_role_path(target_user, role)
 
 114       assert_redirected_to user_path(target_user)
 
 115       assert_equal "The user does not have role #{role}.", flash[:error]
 
 117       # Removing a role from a user that has it should work...
 
 118       assert_difference "UserRole.count", -1 do
 
 119         delete user_role_path(super_user, role)
 
 121       assert_redirected_to user_path(super_user)
 
 123       # ...but trying a second time should fail
 
 124       assert_no_difference "UserRole.count" do
 
 125         delete user_role_path(super_user, role)
 
 127       assert_redirected_to user_path(super_user)
 
 128       assert_equal "The user does not have role #{role}.", flash[:error]
 
 131     # Revoking a non-existent role should fail
 
 132     assert_difference "UserRole.count", 0 do
 
 133       delete user_role_path(target_user, "no_such_role")
 
 135     assert_redirected_to user_path(target_user)
 
 136     assert_equal "The string 'no_such_role' is not a valid role.", flash[:error]
 
 138     # Revoking administrator role from current user should fail
 
 139     delete user_role_path(administrator_user, "administrator")
 
 140     assert_redirected_to user_path(administrator_user)
 
 141     assert_equal "Cannot revoke administrator role from current user.", flash[:error]