mirror of
https://github.com/we-promise/sure.git
synced 2026-04-23 14:04:06 +00:00
* feat: add Binance support (Items, Accounts, Importers, Processor, and Sync) * refactor: deduplicate 'stablecoins' constant and push stale_rate filter to SQL --------- Signed-off-by: Juan José Mata <juanjo.mata@gmail.com> Co-authored-by: Juan José Mata <juanjo.mata@gmail.com>
90 lines
2.7 KiB
Ruby
90 lines
2.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "test_helper"
|
|
|
|
class BinanceAccount::ProcessorTest < ActiveSupport::TestCase
|
|
setup do
|
|
@family = families(:dylan_family)
|
|
@family.update!(currency: "EUR")
|
|
|
|
@item = BinanceItem.create!(
|
|
family: @family, name: "Binance", api_key: "k", api_secret: "s"
|
|
)
|
|
@ba = @item.binance_accounts.create!(
|
|
name: "Binance", account_type: "combined", currency: "USD", current_balance: 1000
|
|
)
|
|
@account = Account.create!(
|
|
family: @family,
|
|
name: "Binance",
|
|
balance: 0,
|
|
currency: "EUR",
|
|
accountable: Crypto.create!(subtype: "exchange")
|
|
)
|
|
AccountProvider.create!(account: @account, provider: @ba)
|
|
|
|
BinanceAccount::HoldingsProcessor.any_instance.stubs(:process).returns(nil)
|
|
@ba.stubs(:binance_item).returns(
|
|
stub(binance_provider: nil, family: @family)
|
|
)
|
|
end
|
|
|
|
test "converts USD balance to family currency when exact rate exists" do
|
|
ExchangeRate.create!(from_currency: "USD", to_currency: "EUR",
|
|
date: Date.current, rate: 0.92)
|
|
|
|
BinanceAccount::Processor.new(@ba).process
|
|
|
|
@account.reload
|
|
@ba.reload
|
|
assert_equal "EUR", @account.currency
|
|
assert_in_delta 920.0, @account.balance, 0.01
|
|
assert_equal false, @ba.extra.dig("binance", "stale_rate")
|
|
end
|
|
|
|
test "uses nearest rate and sets stale flag when exact rate missing" do
|
|
ExchangeRate.create!(from_currency: "USD", to_currency: "EUR",
|
|
date: Date.current - 3, rate: 0.90)
|
|
|
|
BinanceAccount::Processor.new(@ba).process
|
|
|
|
@account.reload
|
|
@ba.reload
|
|
assert_equal "EUR", @account.currency
|
|
assert_in_delta 900.0, @account.balance, 0.01
|
|
assert_equal true, @ba.extra.dig("binance", "stale_rate")
|
|
end
|
|
|
|
test "falls back to USD amount and sets stale flag when no rate available" do
|
|
ExchangeRate.expects(:find_or_fetch_rate).returns(nil)
|
|
|
|
BinanceAccount::Processor.new(@ba).process
|
|
|
|
@account.reload
|
|
@ba.reload
|
|
assert_in_delta 1000.0, @account.balance, 0.01
|
|
assert_equal true, @ba.extra.dig("binance", "stale_rate")
|
|
end
|
|
|
|
test "clears stale flag on subsequent sync when exact rate found" do
|
|
@ba.update!(extra: { "binance" => { "stale_rate" => true } })
|
|
ExchangeRate.create!(from_currency: "USD", to_currency: "EUR",
|
|
date: Date.current, rate: 0.92)
|
|
|
|
BinanceAccount::Processor.new(@ba).process
|
|
|
|
@account.reload
|
|
@ba.reload
|
|
assert_equal false, @ba.extra.dig("binance", "stale_rate")
|
|
end
|
|
|
|
test "does not convert when family uses USD" do
|
|
@family.update!(currency: "USD")
|
|
|
|
BinanceAccount::Processor.new(@ba).process
|
|
|
|
@account.reload
|
|
assert_equal "USD", @account.currency
|
|
assert_in_delta 1000.0, @account.balance, 0.01
|
|
end
|
|
end
|