mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-24 07:39:39 +02:00
Use faraday retry, move retry logic to concrete provider level (#2042)
This commit is contained in:
parent
0a17b84566
commit
939244bd3e
5 changed files with 50 additions and 90 deletions
|
@ -2,60 +2,56 @@ require "test_helper"
|
|||
require "ostruct"
|
||||
|
||||
class TestProvider < Provider
|
||||
TestError = Class.new(StandardError)
|
||||
|
||||
def initialize(client)
|
||||
@client = client
|
||||
end
|
||||
|
||||
def fetch_data
|
||||
with_provider_response(retries: 3) do
|
||||
client.get("/test")
|
||||
with_provider_response do
|
||||
@client.get("/test")
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
def client
|
||||
@client ||= Faraday.new
|
||||
end
|
||||
|
||||
def retryable_errors
|
||||
[ Faraday::TimeoutError ]
|
||||
def fetch_data_with_error_transformer
|
||||
with_provider_response(error_transformer: ->(error) { TestError.new(error.message) }) do
|
||||
@client.get("/test")
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
class ProviderTest < ActiveSupport::TestCase
|
||||
setup do
|
||||
@provider = TestProvider.new
|
||||
@client = mock
|
||||
@provider = TestProvider.new(@client)
|
||||
end
|
||||
|
||||
test "retries then provides failed response" do
|
||||
client = mock
|
||||
Faraday.stubs(:new).returns(client)
|
||||
|
||||
client.expects(:get)
|
||||
.with("/test")
|
||||
.raises(Faraday::TimeoutError)
|
||||
.times(3)
|
||||
|
||||
response = @provider.fetch_data
|
||||
|
||||
assert_not response.success?
|
||||
assert_match "timeout", response.error.message
|
||||
end
|
||||
|
||||
test "fail, retry, succeed" do
|
||||
client = mock
|
||||
Faraday.stubs(:new).returns(client)
|
||||
|
||||
sequence = sequence("retry_sequence")
|
||||
|
||||
client.expects(:get)
|
||||
.with("/test")
|
||||
.raises(Faraday::TimeoutError)
|
||||
.in_sequence(sequence)
|
||||
|
||||
client.expects(:get)
|
||||
.with("/test")
|
||||
.returns(Provider::Response.new(success?: true, data: "success", error: nil))
|
||||
.in_sequence(sequence)
|
||||
test "returns success response with data" do
|
||||
@client.expects(:get).with("/test").returns({ some: "data" })
|
||||
|
||||
response = @provider.fetch_data
|
||||
|
||||
assert response.success?
|
||||
assert_equal({ some: "data" }, response.data)
|
||||
end
|
||||
|
||||
test "returns failed response with error" do
|
||||
@client.expects(:get).with("/test").raises(StandardError.new("some error"))
|
||||
|
||||
response = @provider.fetch_data
|
||||
|
||||
assert_not response.success?
|
||||
assert_equal("some error", response.error.message)
|
||||
end
|
||||
|
||||
test "provider can transform error" do
|
||||
@client.expects(:get).with("/test").raises(StandardError.new("some error"))
|
||||
|
||||
response = @provider.fetch_data_with_error_transformer
|
||||
|
||||
assert_not response.success?
|
||||
assert_equal("some error", response.error.message)
|
||||
assert_instance_of TestProvider::TestError, response.error
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue