DEV: new lock step for services (#30872)

That allows services to wrap steps within a Distributed lock (mutex).
This commit is contained in:
Régis Hanol
2025-01-29 14:28:22 +01:00
committed by GitHub
parent 049b6b8f54
commit a16b2f2248
2 changed files with 86 additions and 0 deletions

View File

@ -167,6 +167,20 @@ RSpec.describe Service::Runner do
end
end
class LockService
include Service::Base
params do
attribute :post_id, :integer
attribute :user_id, :integer
end
lock(:post_id, :user_id) { step :locked_step }
def locked_step
end
end
describe ".call" do
subject(:runner) { described_class.call(service, dependencies, &actions_block) }
@ -501,5 +515,36 @@ RSpec.describe Service::Runner do
expect(runner).to eq :success
end
end
context "when aquiring a lock" do
let(:service) { LockService }
let(:dependencies) { { params: { post_id: 123, user_id: 456 } } }
let(:actions) { <<-BLOCK }
proc do
on_success { :success }
on_failure { :failure }
end
BLOCK
it "runs successfully" do
expect(runner).to eq :success
end
end
context "when failing to acquire a lock" do
let(:service) { LockService }
let(:dependencies) { { params: { post_id: 123, user_id: 456 } } }
let(:actions) { <<-BLOCK }
proc do
on_success { :success }
on_failure { :failure }
end
BLOCK
it "fails the service" do
DistributedMutex.stubs(:synchronize).returns
expect(runner).to eq :failure
end
end
end
end