mirror of
https://github.com/maybe-finance/maybe.git
synced 2025-07-21 22:29:38 +02:00
* Exchange rate syncer implementation * Security price syncer * Fix issues with provider API * Add back prod schedule * Add back price and exchange rate syncs to account syncs * Remove unused stock_exchanges table
70 lines
2 KiB
Ruby
70 lines
2 KiB
Ruby
require "test_helper"
|
|
require "ostruct"
|
|
|
|
class ExchangeRateTest < ActiveSupport::TestCase
|
|
include ProviderTestHelper
|
|
|
|
setup do
|
|
@provider = mock
|
|
|
|
ExchangeRate.stubs(:provider).returns(@provider)
|
|
end
|
|
|
|
test "finds rate in DB" do
|
|
existing_rate = exchange_rates(:one)
|
|
|
|
@provider.expects(:fetch_exchange_rate).never
|
|
|
|
assert_equal existing_rate, ExchangeRate.find_or_fetch_rate(
|
|
from: existing_rate.from_currency,
|
|
to: existing_rate.to_currency,
|
|
date: existing_rate.date
|
|
)
|
|
end
|
|
|
|
test "fetches rate from provider without cache" do
|
|
ExchangeRate.delete_all
|
|
|
|
provider_response = provider_success_response(
|
|
OpenStruct.new(
|
|
from: "USD",
|
|
to: "EUR",
|
|
date: Date.current,
|
|
rate: 1.2
|
|
)
|
|
)
|
|
|
|
@provider.expects(:fetch_exchange_rate).returns(provider_response)
|
|
|
|
assert_no_difference "ExchangeRate.count" do
|
|
assert_equal 1.2, ExchangeRate.find_or_fetch_rate(from: "USD", to: "EUR", date: Date.current, cache: false).rate
|
|
end
|
|
end
|
|
|
|
test "fetches rate from provider with cache" do
|
|
ExchangeRate.delete_all
|
|
|
|
provider_response = provider_success_response(
|
|
OpenStruct.new(
|
|
from: "USD",
|
|
to: "EUR",
|
|
date: Date.current,
|
|
rate: 1.2
|
|
)
|
|
)
|
|
|
|
@provider.expects(:fetch_exchange_rate).returns(provider_response)
|
|
|
|
assert_difference "ExchangeRate.count", 1 do
|
|
assert_equal 1.2, ExchangeRate.find_or_fetch_rate(from: "USD", to: "EUR", date: Date.current, cache: true).rate
|
|
end
|
|
end
|
|
|
|
test "returns nil on provider error" do
|
|
provider_response = provider_error_response(StandardError.new("Test error"))
|
|
|
|
@provider.expects(:fetch_exchange_rate).returns(provider_response)
|
|
|
|
assert_nil ExchangeRate.find_or_fetch_rate(from: "USD", to: "EUR", date: Date.current, cache: true)
|
|
end
|
|
end
|