Restructure omni services and add Chatwoot research snapshot

This commit is contained in:
Ruslan Bakiev
2026-02-21 11:11:27 +07:00
parent edea7a0034
commit b73babbbf6
7732 changed files with 978203 additions and 32 deletions

View File

@@ -0,0 +1,14 @@
require 'rails_helper'
RSpec.describe Internal::CheckNewVersionsJob do
subject(:job) { described_class.perform_now }
it 'updates the latest chatwoot version in redis' do
data = { 'version' => '1.2.3' }
allow(Rails.env).to receive(:production?).and_return(true)
allow(ChatwootHub).to receive(:sync_with_hub).and_return(data)
job
expect(ChatwootHub).to have_received(:sync_with_hub)
expect(Redis::Alfred.get(Redis::Alfred::LATEST_CHATWOOT_VERSION)).to eq data['version']
end
end

View File

@@ -0,0 +1,44 @@
require 'rails_helper'
RSpec.describe Internal::DeleteAccountsJob do
subject(:job) { described_class.perform_later }
let!(:account_marked_for_deletion) { create(:account) }
let!(:future_deletion_account) { create(:account) }
let!(:active_account) { create(:account) }
let(:account_deletion_service) { instance_double(AccountDeletionService, perform: true) }
before do
account_marked_for_deletion.update!(
custom_attributes: {
'marked_for_deletion_at' => 1.day.ago.iso8601,
'marked_for_deletion_reason' => 'user_requested'
}
)
future_deletion_account.update!(
custom_attributes: {
'marked_for_deletion_at' => 3.days.from_now.iso8601,
'marked_for_deletion_reason' => 'user_requested'
}
)
allow(AccountDeletionService).to receive(:new).and_return(account_deletion_service)
end
it 'enqueues the job' do
expect { job }.to have_enqueued_job(described_class)
.on_queue('scheduled_jobs')
end
describe '#perform' do
it 'calls AccountDeletionService for accounts past deletion date' do
described_class.new.perform
expect(AccountDeletionService).to have_received(:new).with(account: account_marked_for_deletion)
expect(AccountDeletionService).not_to have_received(:new).with(account: future_deletion_account)
expect(AccountDeletionService).not_to have_received(:new).with(account: active_account)
expect(account_deletion_service).to have_received(:perform)
end
end
end

View File

@@ -0,0 +1,64 @@
require 'rails_helper'
RSpec.describe Internal::ProcessStaleContactsJob do
subject(:job) { described_class.perform_later }
context 'when in cloud environment' do
before do
allow(ChatwootApp).to receive(:chatwoot_cloud?).and_return(true)
end
it 'processes accounts based on the day of month' do
# Set a fixed day for testing
day_of_month = 16
remainder = day_of_month % described_class::DISTRIBUTION_GROUPS
allow(Date).to receive(:current).and_return(Date.new(2025, 5, day_of_month))
# Create an account and set its ID to match today's pattern
account = create(:account)
allow(account).to receive(:id).and_return(remainder)
# Mock the Account.where to return our filtered accounts
account_relation = double
allow(Account).to receive(:where).with("id % #{described_class::DISTRIBUTION_GROUPS} = ?", remainder).and_return(account_relation)
allow(account_relation).to receive(:find_each).and_yield(account)
# Mock the delay setting
allow(Internal::RemoveStaleContactsJob).to receive(:set).and_return(Internal::RemoveStaleContactsJob)
expect(Internal::RemoveStaleContactsJob).to receive(:perform_later).with(account)
described_class.perform_now
end
it 'adds a delay between jobs' do
day_of_month = 15
remainder = day_of_month % described_class::DISTRIBUTION_GROUPS
allow(Date).to receive(:current).and_return(Date.new(2025, 5, day_of_month))
account = create(:account)
account_relation = double
allow(Account).to receive(:where).with("id % #{described_class::DISTRIBUTION_GROUPS} = ?", remainder).and_return(account_relation)
allow(account_relation).to receive(:find_each).and_yield(account)
expect(Internal::RemoveStaleContactsJob).to receive(:set) do |args|
expect(args[:wait]).to be_between(1.minute, 10.minutes)
Internal::RemoveStaleContactsJob
end
expect(Internal::RemoveStaleContactsJob).to receive(:perform_later).with(account)
described_class.perform_now
end
end
context 'when not in cloud environment' do
it 'does not process any accounts' do
allow(ChatwootApp).to receive(:chatwoot_cloud?).and_return(false)
expect(Account).not_to receive(:where)
expect(Internal::RemoveStaleContactsJob).not_to receive(:perform_later)
described_class.perform_now
end
end
end

View File

@@ -0,0 +1,15 @@
require 'rails_helper'
RSpec.describe Internal::ProcessStaleRedisKeysJob do
let(:account) { create(:account) }
describe '#perform' do
it 'calls the RemoveStaleRedisKeysService with the correct account ID' do
expect(Internal::RemoveStaleRedisKeysService).to receive(:new)
.with(account_id: account.id)
.and_call_original
described_class.perform_now(account)
end
end
end

View File

@@ -0,0 +1,20 @@
require 'rails_helper'
RSpec.describe Internal::RemoveStaleContactsJob do
subject(:job) { described_class.perform_later(account) }
let(:account) { create(:account) }
it 'enqueues the job' do
expect { job }.to have_enqueued_job(described_class)
.with(account)
.on_queue('housekeeping')
end
it 'calls the RemoveStaleContactsService' do
service = instance_double(Internal::RemoveStaleContactsService)
expect(Internal::RemoveStaleContactsService).to receive(:new).with(account: account).and_return(service)
expect(service).to receive(:perform)
described_class.perform_now(account)
end
end

View File

@@ -0,0 +1,13 @@
require 'rails_helper'
RSpec.describe Internal::RemoveStaleRedisKeysJob do
let(:account) { create(:account) }
describe '#perform' do
it 'enqueues ProcessStaleRedisKeysJob for the account' do
expect(Internal::ProcessStaleRedisKeysJob).to receive(:perform_later).with(account)
described_class.perform_now
end
end
end