From 437462e1ccd88c451ef39fa870248b3e7d56e8fa Mon Sep 17 00:00:00 2001 From: Laurynas Butkus Date: Wed, 11 Dec 2019 00:19:18 +0200 Subject: [PATCH] Allow configuring concurrent request response status --- lib/idempotent-request/middleware.rb | 3 ++- spec/idempotent-request/middleware_spec.rb | 18 +++++++++++++++--- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/idempotent-request/middleware.rb b/lib/idempotent-request/middleware.rb index 1baf339..3c6f35c 100644 --- a/lib/idempotent-request/middleware.rb +++ b/lib/idempotent-request/middleware.rb @@ -5,6 +5,7 @@ module IdempotentRequest @config = config @policy = config.fetch(:policy) @notifier = ActiveSupport::Notifications if defined?(ActiveSupport::Notifications) + @conflict_response_status = config.fetch(:conflict_response_status, 429) end def call(env) @@ -45,7 +46,7 @@ module IdempotentRequest end def concurrent_request_response - status = 429 + status = @conflict_response_status headers = { 'Content-Type' => 'application/json' } body = [ Oj.dump('error' => 'Concurrent requests detected') ] request.env['idempotent.request']['concurrent_request_response'] = true diff --git a/spec/idempotent-request/middleware_spec.rb b/spec/idempotent-request/middleware_spec.rb index 900edb3..f164a46 100644 --- a/spec/idempotent-request/middleware_spec.rb +++ b/spec/idempotent-request/middleware_spec.rb @@ -12,11 +12,13 @@ RSpec.describe IdempotentRequest::Middleware do let(:policy) do class_double('IdempotentRequest::policy', new: double(should?: true)) end + let(:conflict_response_status) { 429 } let(:middleware) do described_class.new(app, policy: policy, storage: storage, + conflict_response_status: conflict_response_status, header_key: 'X-Qonto-Idempotency-Key' ) end @@ -80,10 +82,20 @@ RSpec.describe IdempotentRequest::Middleware do middleware.call(env) end - it 'returns 429' do - expect_any_instance_of(described_class).to receive(:concurrent_request_response) + it 'returns 429 status' do + status, _headers, _body = middleware.call(env) - middleware.call(env) + expect(status).to be(429) + end + + context 'when custom response status is set' do + let(:conflict_response_status) { 409 } + + it 'returns 409 status' do + status, _headers, _body = middleware.call(env) + + expect(status).to be(409) + end end end end