## Summary This PR fixes account deletion failures by changing how orphaned user emails are rewritten during `AccountDeletionService`. Ref: https://chatwoot-p3.sentry.io/issues/6715254765/events/e228a5d045ad47348d6c32448bc33b7a/ ## Changes (develop -> this branch) - Updated soft-delete email rewrite from: - `#{original_email}-deleted.com` - To deterministic value: - `#{user.id}@chatwoot-deleted.invalid` - Added reserved non-deliverable domain constant: - `@chatwoot-deleted.invalid` - Replaced the "other accounts" check from `count.zero?` to `exists?` (same behavior, cheaper query). - Updated service spec expectation to match deterministic email value and assert it differs from original email. ## Files changed - `app/services/account_deletion_service.rb` - `spec/services/account_deletion_service_spec.rb` ## How to verify - Run: `bundle exec rspec spec/services/account_deletion_service_spec.rb` - Run: `bundle exec rubocop app/services/account_deletion_service.rb spec/services/account_deletion_service_spec.rb`
65 lines
2.3 KiB
Ruby
65 lines
2.3 KiB
Ruby
require 'rails_helper'
|
|
|
|
RSpec.describe AccountDeletionService do
|
|
let(:account) { create(:account) }
|
|
let(:mailer) { instance_double(ActionMailer::MessageDelivery, deliver_later: nil) }
|
|
|
|
describe '#perform' do
|
|
before do
|
|
allow(DeleteObjectJob).to receive(:perform_later)
|
|
allow(AdministratorNotifications::AccountComplianceMailer).to receive(:with).and_return(
|
|
instance_double(AdministratorNotifications::AccountComplianceMailer, account_deleted: mailer)
|
|
)
|
|
end
|
|
|
|
it 'enqueues DeleteObjectJob with the account' do
|
|
described_class.new(account: account).perform
|
|
|
|
expect(DeleteObjectJob).to have_received(:perform_later).with(account)
|
|
end
|
|
|
|
it 'sends a compliance notification email' do
|
|
described_class.new(account: account).perform
|
|
|
|
expect(AdministratorNotifications::AccountComplianceMailer).to have_received(:with) do |args|
|
|
expect(args[:account]).to eq(account)
|
|
expect(args).to include(:soft_deleted_users)
|
|
end
|
|
expect(mailer).to have_received(:deliver_later)
|
|
end
|
|
|
|
context 'when handling users' do
|
|
let(:user_with_one_account) { create(:user) }
|
|
let(:user_with_multiple_accounts) { create(:user) }
|
|
let(:second_account) { create(:account) }
|
|
|
|
before do
|
|
create(:account_user, user: user_with_one_account, account: account)
|
|
create(:account_user, user: user_with_multiple_accounts, account: account)
|
|
create(:account_user, user: user_with_multiple_accounts, account: second_account)
|
|
end
|
|
|
|
it 'soft deletes users who only belong to the deleted account' do
|
|
original_email = user_with_one_account.email
|
|
|
|
described_class.new(account: account).perform
|
|
|
|
# Reload the user to get the updated email
|
|
user_with_one_account.reload
|
|
expect(user_with_one_account.email).to eq("#{user_with_one_account.id}@chatwoot-deleted.invalid")
|
|
expect(user_with_one_account.email).not_to eq(original_email)
|
|
end
|
|
|
|
it 'does not modify emails for users belonging to multiple accounts' do
|
|
original_email = user_with_multiple_accounts.email
|
|
|
|
described_class.new(account: account).perform
|
|
|
|
# Reload the user to get the updated email
|
|
user_with_multiple_accounts.reload
|
|
expect(user_with_multiple_accounts.email).to eq(original_email)
|
|
end
|
|
end
|
|
end
|
|
end
|