Restructure omni services and add Chatwoot research snapshot
This commit is contained in:
@@ -0,0 +1,43 @@
|
||||
require 'rails_helper'
|
||||
|
||||
describe Whatsapp::MessageDedupLock do
|
||||
let(:source_id) { "wamid.test_#{SecureRandom.hex(8)}" }
|
||||
let(:lock) { described_class.new(source_id) }
|
||||
let(:redis_key) { format(Redis::RedisKeys::MESSAGE_SOURCE_KEY, id: source_id) }
|
||||
|
||||
after { Redis::Alfred.delete(redis_key) }
|
||||
|
||||
describe '#acquire!' do
|
||||
it 'returns truthy on first acquire' do
|
||||
expect(lock.acquire!).to be_truthy
|
||||
end
|
||||
|
||||
it 'returns falsy on second acquire for the same source_id' do
|
||||
lock.acquire!
|
||||
expect(described_class.new(source_id).acquire!).to be_falsy
|
||||
end
|
||||
|
||||
it 'allows different source_ids to acquire independently' do
|
||||
lock.acquire!
|
||||
other = described_class.new("wamid.other_#{SecureRandom.hex(8)}")
|
||||
expect(other.acquire!).to be_truthy
|
||||
end
|
||||
|
||||
it 'lets exactly one thread win when two race for the same source_id' do
|
||||
results = Concurrent::Array.new
|
||||
barrier = Concurrent::CyclicBarrier.new(2)
|
||||
|
||||
threads = Array.new(2) do
|
||||
Thread.new do
|
||||
barrier.wait
|
||||
results << described_class.new(source_id).acquire!
|
||||
end
|
||||
end
|
||||
|
||||
threads.each(&:join)
|
||||
|
||||
wins = results.count { |r| r }
|
||||
expect(wins).to eq(1), "Expected exactly 1 winner but got #{wins}. Results: #{results.inspect}"
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user