1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137
|
# frozen_string_literal: true
require 'spec_helper'
RSpec.describe DeleteUserWorker, feature_category: :user_management do
let!(:user) { create(:user) }
let!(:current_user) { create(:user) }
it "calls the DeleteUserWorker with the params it was given" do
expect_next_instance_of(Users::DestroyService) do |service|
expect(service).to receive(:execute).with(user, {})
end
described_class.new.perform(current_user.id, user.id)
end
it "uses symbolized keys" do
expect_next_instance_of(Users::DestroyService) do |service|
expect(service).to receive(:execute).with(user, { test: "test" })
end
described_class.new.perform(current_user.id, user.id, { "test" => "test" })
end
shared_examples 'does nothing' do
it "does not instantiate a DeleteUserWorker" do
expect(Users::DestroyService).not_to receive(:new)
perform
end
end
context 'when user deleted their own account' do
subject(:perform) { described_class.new.perform(current_user.id, user.id) }
before do
# user is blocked as part of User#delete_async
user.block
# custom attribute is created as part of User#delete_async
UserCustomAttribute.set_deleted_own_account_at(user)
end
shared_examples 'proceeds with deletion' do
it "proceeds with deletion" do
expect_next_instance_of(Users::DestroyService) do |service|
expect(service).to receive(:execute).with(user, {})
end
perform
end
end
it_behaves_like 'proceeds with deletion'
context 'when delay_delete_own_user feature flag is disabled' do
before do
stub_feature_flags(delay_delete_own_user: false)
end
it_behaves_like 'proceeds with deletion'
end
shared_examples 'logs' do |reason|
it 'logs' do
expect(Gitlab::AppLogger).to receive(:info).with({
message: 'Skipped own account deletion.',
reason: reason,
user_id: user.id,
username: user.username
})
perform
end
end
shared_examples 'updates the user\'s custom attributes' do
it 'destroys the user\'s DELETED_OWN_ACCOUNT_AT custom attribute' do
key = UserCustomAttribute::DELETED_OWN_ACCOUNT_AT
expect { perform }.to change { user.custom_attributes.by_key(key).count }.from(1).to(0)
end
context 'when custom attribute is not present' do
before do
UserCustomAttribute.delete_all
end
it 'does nothing' do
expect { perform }.not_to raise_error
end
end
it 'creates a SKIPPED_ACCOUNT_DELETION_AT custom attribute for the user' do
key = UserCustomAttribute::SKIPPED_ACCOUNT_DELETION_AT
expect { perform }.to change { user.custom_attributes.by_key(key).count }.from(0).to(1)
end
end
context 'when user is banned' do
before do
user.activate
user.ban
end
it_behaves_like 'does nothing'
it_behaves_like 'logs', 'User has been banned.'
it_behaves_like 'updates the user\'s custom attributes'
end
context 'when user is not blocked (e.g. result of user reinstatement request)' do
before do
user.activate
end
it_behaves_like 'does nothing'
it_behaves_like 'logs', 'User has been unblocked.'
it_behaves_like 'updates the user\'s custom attributes'
end
end
context 'when user to delete does not exist' do
subject(:perform) { described_class.new.perform(current_user.id, non_existing_record_id) }
it_behaves_like 'does nothing'
end
context 'when current user does not exist' do
subject(:perform) { described_class.new.perform(non_existing_record_id, user.id) }
it_behaves_like 'does nothing'
end
context 'when user to delete and current user do not exist' do
subject(:perform) { described_class.new.perform(non_existing_record_id, non_existing_record_id) }
it_behaves_like 'does nothing'
end
end
|