1
0
Fork 0
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:
Zach Gollwitzer 2025-04-01 08:41:49 -04:00 committed by GitHub
parent 0a17b84566
commit 939244bd3e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 50 additions and 90 deletions

View file

@ -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