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]