Allows super-admin the ability to remove the role from themselves (#19621)
* Allows removing own role * Removes dead test case
This commit is contained in:
parent
479f7b6c6c
commit
3bc04bdcc2
5 changed files with 12 additions and 44 deletions
|
|
@ -97,10 +97,12 @@ module Admin
|
|||
|
||||
@user = User.find(params[:user_id])
|
||||
|
||||
response = ::Users::RemoveRole.call(user: @user,
|
||||
role: role.name,
|
||||
resource_type: resource_type,
|
||||
admin: current_user)
|
||||
response = ::Users::RemoveRole.call(
|
||||
user: @user,
|
||||
role: role.name,
|
||||
resource_type: resource_type,
|
||||
)
|
||||
|
||||
if response.success
|
||||
flash[:success] =
|
||||
I18n.t("admin.users_controller.role_removed",
|
||||
|
|
|
|||
|
|
@ -6,17 +6,14 @@ module Users
|
|||
new(...).call
|
||||
end
|
||||
|
||||
def initialize(user:, role:, resource_type:, admin:)
|
||||
def initialize(user:, role:, resource_type:)
|
||||
@user = user
|
||||
@role = role
|
||||
@resource_type = resource_type&.safe_constantize
|
||||
@admin = admin
|
||||
@response = Response.new(success: false)
|
||||
end
|
||||
|
||||
def call
|
||||
return response if user_current_user?(user)
|
||||
|
||||
if resource_type && user.remove_role(role, resource_type)
|
||||
response.success = true
|
||||
elsif user.remove_role(role)
|
||||
|
|
@ -30,13 +27,6 @@ module Users
|
|||
|
||||
private
|
||||
|
||||
attr_reader :user, :role, :resource_type, :admin, :response
|
||||
|
||||
def user_current_user?(user)
|
||||
return false if user.id != admin.id
|
||||
|
||||
response.error_message = I18n.t("services.users.remove_role.remove_self")
|
||||
true
|
||||
end
|
||||
attr_reader :user, :role, :resource_type, :response
|
||||
end
|
||||
end
|
||||
|
|
|
|||
|
|
@ -19,7 +19,7 @@
|
|||
<ul class="flex flex-wrap gap-2">
|
||||
<% @user.roles.reject(&:tag_moderator?).each do |role| %>
|
||||
<li>
|
||||
<% if !policy(role).remove_role? || @user.id == current_user.id %>
|
||||
<% if !policy(role).remove_role? %>
|
||||
<button
|
||||
class="c-pill c-pill--description-icon crayons-tooltip__activator cursor-help"
|
||||
type="button"
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
require "rails_helper"
|
||||
|
||||
RSpec.describe "Admin::Users" do
|
||||
# rubocop:disable RSpec/IndexedLet
|
||||
let!(:user) { create(:user, twitter_username: nil, old_username: "username") }
|
||||
let!(:user2) { create(:user, twitter_username: "Twitter") }
|
||||
let(:user3) { create(:user) }
|
||||
|
|
@ -198,17 +197,6 @@ RSpec.describe "Admin::Users" do
|
|||
expect(user.single_resource_admin_for?(Broadcast)).to be true
|
||||
expect(request.flash["success"]).to include("successfully removed from the user!")
|
||||
end
|
||||
|
||||
it "does not allow a admins to remove a role from themselves", :aggregate_failures do
|
||||
role = super_admin.add_role(:trusted)
|
||||
|
||||
expect do
|
||||
delete admin_user_path(super_admin.id), params: { user_id: super_admin.id, role_id: role.id }
|
||||
end.not_to change(super_admin.roles, :count)
|
||||
|
||||
expect(super_admin.trusted?).to be true
|
||||
expect(request.flash["danger"]).to include("cannot remove roles")
|
||||
end
|
||||
end
|
||||
|
||||
context "when deleting user" do
|
||||
|
|
|
|||
|
|
@ -3,23 +3,11 @@ require "rails_helper"
|
|||
RSpec.describe Users::RemoveRole, type: :service do
|
||||
let(:current_user) { create(:user, :admin) }
|
||||
|
||||
context "when current_user" do
|
||||
it "does not remove roles and raises an error", :aggregate_failures do
|
||||
role = current_user.roles.first
|
||||
resource_type = nil
|
||||
args = { user: current_user, role: role, resource_type: resource_type, admin: current_user }
|
||||
role_removal = described_class.call(**args)
|
||||
|
||||
expect(role_removal.success).to be false
|
||||
expect(role_removal.error_message).to eq "Admins cannot remove roles from themselves."
|
||||
end
|
||||
end
|
||||
|
||||
it "removes roles from users", :aggregate_failures do
|
||||
user = create(:user, :trusted)
|
||||
role = user.roles.first
|
||||
resource_type = nil
|
||||
args = { user: user, role: role, resource_type: resource_type, admin: current_user }
|
||||
args = { user: user, role: role, resource_type: resource_type }
|
||||
role_removal = described_class.call(**args)
|
||||
|
||||
expect(role_removal.success).to be true
|
||||
|
|
@ -31,7 +19,7 @@ RSpec.describe Users::RemoveRole, type: :service do
|
|||
user = create(:user, :single_resource_admin)
|
||||
role = user.roles.first
|
||||
resource_type = "Comment"
|
||||
args = { user: user, role: role, resource_type: resource_type, admin: current_user }
|
||||
args = { user: user, role: role, resource_type: resource_type }
|
||||
role_removal = described_class.call(**args)
|
||||
|
||||
expect(role_removal.success).to be true
|
||||
|
|
@ -42,7 +30,7 @@ RSpec.describe Users::RemoveRole, type: :service do
|
|||
it "returns an error if there is an issue removing the role" do
|
||||
user = create(:user)
|
||||
allow(user).to receive(:remove_role).and_raise(StandardError)
|
||||
args = { user: user, role: nil, resource_type: nil, admin: current_user }
|
||||
args = { user: user, role: nil, resource_type: nil }
|
||||
role_removal = described_class.call(**args)
|
||||
|
||||
expect(role_removal.success).to be false
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue