Files
sure/test/models/provider/coinstats_adapter_test.rb
Ethan 3b4ab735b0 Add (beta) CoinStats Crypto Wallet Integration with Balance and Transaction Syncing (#512)
* Feat(CoinStats): Scaffold implementation, not yet functional

* Feat(CoinStats): Implement crypto wallet balance and transactions

* Feat(CoinStats): Add tests, Minor improvements

* Feat(CoinStats): Utilize bulk fetch API endpoints

* Feat(CoinStats): Migrate strings to i8n

* Feat(CoinStats): Fix error handling in wallet link modal

* Feat(CoinStats): Implement hourly provider sync job

* Feat(CoinStats): Generate docstrings

* Fix(CoinStats): Validate API Key on provider update

* Fix(Providers): Safely handle race condition in merchance creation

* Fix(CoinStats): Don't catch system signals in account processor

* Fix(CoinStats): Preload before iterating accounts

* Fix(CoinStats): Add no opener / referrer to API dashboard link

* Fix(CoinStats): Use strict matching for symbols

* Fix(CoinStats): Remove dead code in transactions importer

* Fix(CoinStats): Avoid transaction fallback ID collisions

* Fix(CoinStats): Improve Blockchains fetch error handling

* Fix(CoinStats): Enforce NOT NULL constraint for API Key schema

* Fix(CoinStats): Migrate sync status strings to i8n

* Fix(CoinStats): Use class name rather than hardcoded string

* Fix(CoinStats): Use account currency rather than hardcoded USD

* Fix(CoinStats): Migrate from standalone to Provider class

* Fix(CoinStats): Fix test failures due to string changes
2026-01-07 15:59:04 +01:00

125 lines
3.7 KiB
Ruby

require "test_helper"
class Provider::CoinstatsAdapterTest < ActiveSupport::TestCase
include ProviderAdapterTestInterface
setup do
@family = families(:dylan_family)
@coinstats_item = CoinstatsItem.create!(
family: @family,
name: "Test CoinStats Bank",
api_key: "test_api_key_123"
)
@coinstats_account = CoinstatsAccount.create!(
coinstats_item: @coinstats_item,
name: "CoinStats Crypto Account",
account_id: "cs_mock_1",
currency: "USD",
current_balance: 1000,
institution_metadata: {
"name" => "CoinStats Test Wallet",
"domain" => "coinstats.app",
"url" => "https://coinstats.app",
"logo" => "https://example.com/logo.png"
}
)
@account = accounts(:crypto)
@adapter = Provider::CoinstatsAdapter.new(@coinstats_account, account: @account)
end
def adapter
@adapter
end
# Run shared interface tests
test_provider_adapter_interface
test_syncable_interface
test_institution_metadata_interface
# Provider-specific tests
test "returns correct provider name" do
assert_equal "coinstats", @adapter.provider_name
end
test "returns correct provider type" do
assert_equal "CoinstatsAccount", @adapter.provider_type
end
test "returns coinstats item" do
assert_equal @coinstats_account.coinstats_item, @adapter.item
end
test "returns account" do
assert_equal @account, @adapter.account
end
test "can_delete_holdings? returns false" do
assert_equal false, @adapter.can_delete_holdings?
end
test "parses institution domain from institution_metadata" do
assert_equal "coinstats.app", @adapter.institution_domain
end
test "parses institution name from institution_metadata" do
assert_equal "CoinStats Test Wallet", @adapter.institution_name
end
test "parses institution url from institution_metadata" do
assert_equal "https://coinstats.app", @adapter.institution_url
end
test "returns logo_url from institution_metadata" do
assert_equal "https://example.com/logo.png", @adapter.logo_url
end
test "derives domain from url if domain is blank" do
@coinstats_account.update!(institution_metadata: {
"url" => "https://www.example.com/path"
})
adapter = Provider::CoinstatsAdapter.new(@coinstats_account, account: @account)
assert_equal "example.com", adapter.institution_domain
end
test "supported_account_types includes Crypto" do
assert_includes Provider::CoinstatsAdapter.supported_account_types, "Crypto"
end
test "connection_configs returns configurations when family can connect" do
@family.stubs(:can_connect_coinstats?).returns(true)
configs = Provider::CoinstatsAdapter.connection_configs(family: @family)
assert_equal 1, configs.length
assert_equal "coinstats", configs.first[:key]
assert_equal "CoinStats", configs.first[:name]
assert configs.first[:can_connect]
end
test "connection_configs returns empty when family cannot connect" do
@family.stubs(:can_connect_coinstats?).returns(false)
configs = Provider::CoinstatsAdapter.connection_configs(family: @family)
assert_equal [], configs
end
test "build_provider returns nil when family is nil" do
result = Provider::CoinstatsAdapter.build_provider(family: nil)
assert_nil result
end
test "build_provider returns nil when no coinstats_items with api_key" do
empty_family = families(:empty)
result = Provider::CoinstatsAdapter.build_provider(family: empty_family)
assert_nil result
end
test "build_provider returns Provider::Coinstats when credentials configured" do
result = Provider::CoinstatsAdapter.build_provider(family: @family)
assert_instance_of Provider::Coinstats, result
end
end