mirror of
				https://github.com/lingble/chatwoot.git
				synced 2025-11-03 20:48:07 +00:00 
			
		
		
		
	- Automate the deletion of accounts that have requested deletion via account settings. - Add a Sidekiq job that runs daily to find accounts that have requested deletion and have passed the 7-day window. - This job deletes the account and then soft-deletes users if they do not belong to any other account. - This job also sends an email to the Chatwoot instance admin for compliance purposes. - The Chatwoot instance admin's email is configurable via the `CHATWOOT_INSTANCE_ADMIN_EMAIL` global config. --------- Co-authored-by: Sojan Jose <sojan@pepalo.com>
		
			
				
	
	
		
			64 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			2.2 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("#{original_email}-deleted.com")
 | 
						|
      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
 |