Files
sure/test/models/coinbase_account/processor_test.rb
pro3958 866314573e fix(coinbase): qualify HoldingsProcessor constant reference (#2702)
CoinbaseAccount::Processor uses the compact class form, so its lexical
nesting is only [CoinbaseAccount::Processor]. The bare `HoldingsProcessor`
reference in process_holdings resolved against that nesting and raised
`uninitialized constant CoinbaseAccount::Processor::HoldingsProcessor`
instead of finding CoinbaseAccount::HoldingsProcessor.

The error was swallowed by the rescue around process_holdings, so every
Coinbase sync logged the failure and skipped the holdings step while the
balance path still completed. Holdings and value never refreshed.

Qualify the reference to CoinbaseAccount::HoldingsProcessor so it resolves
absolutely, matching every sibling processor (Binance, Kraken, Snaptrade,
Questrade, Indexa).

Fixes #2412

Co-authored-by: agentloop <agentloop@localhost>
2026-07-17 06:35:57 +02:00

53 lines
1.7 KiB
Ruby

# frozen_string_literal: true
require "test_helper"
class CoinbaseAccount::ProcessorTest < ActiveSupport::TestCase
setup do
@family = families(:dylan_family)
@family.update!(currency: "USD")
@item = CoinbaseItem.create!(
family: @family,
name: "Coinbase",
api_key: "k",
api_secret: "s"
)
@coinbase_account = @item.coinbase_accounts.create!(
name: "Bitcoin Wallet",
account_id: "cb_btc_123",
currency: "BTC",
current_balance: 0.5,
raw_payload: { "native_balance" => { "amount" => "25000", "currency" => "USD" } }
)
@account = Account.create!(
family: @family,
name: "Coinbase BTC",
balance: 0,
currency: "USD",
accountable: Crypto.create!(subtype: "exchange")
)
AccountProvider.create!(account: @account, provider: @coinbase_account)
@coinbase_account.reload
end
# Regression for issue #2412: the bare `HoldingsProcessor` reference resolved
# as CoinbaseAccount::Processor::HoldingsProcessor and raised an uninitialized
# constant error that was swallowed, so holdings never refreshed.
test "process invokes CoinbaseAccount::HoldingsProcessor" do
CoinbaseAccount::HoldingsProcessor.any_instance.expects(:process).once
CoinbaseAccount::Processor.new(@coinbase_account).process
end
test "updates linked crypto account balance from native_balance" do
CoinbaseAccount::HoldingsProcessor.any_instance.stubs(:process).returns(nil)
CoinbaseAccount::Processor.new(@coinbase_account).process
@account.reload
assert_equal 25_000.to_d, @account.balance
assert_equal 0.to_d, @account.cash_balance
assert_equal "USD", @account.currency
end
end