Files
sure/test/models/binance_account/processor_test.rb
Louis 455c74dcfa Add Binance support, heavily inspired by the Coinbase one (#1317)
* 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>
2026-04-07 14:43:17 +02:00

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