Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user