mirror of
https://github.com/we-promise/sure.git
synced 2026-04-14 17:44:07 +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>
112 lines
3.7 KiB
Ruby
112 lines
3.7 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
require "test_helper"
|
|
|
|
class BinanceItemTest < ActiveSupport::TestCase
|
|
setup do
|
|
@family = families(:dylan_family)
|
|
@item = BinanceItem.create!(
|
|
family: @family,
|
|
name: "My Binance",
|
|
api_key: "test_key",
|
|
api_secret: "test_secret"
|
|
)
|
|
end
|
|
|
|
test "belongs to family" do
|
|
assert_equal @family, @item.family
|
|
end
|
|
|
|
test "has good status by default" do
|
|
assert_equal "good", @item.status
|
|
end
|
|
|
|
test "validates presence of name" do
|
|
item = BinanceItem.new(family: @family, api_key: "k", api_secret: "s")
|
|
assert_not item.valid?
|
|
assert_includes item.errors[:name], "can't be blank"
|
|
end
|
|
|
|
test "validates presence of api_key" do
|
|
item = BinanceItem.new(family: @family, name: "B", api_secret: "s")
|
|
assert_not item.valid?
|
|
assert_includes item.errors[:api_key], "can't be blank"
|
|
end
|
|
|
|
test "validates presence of api_secret" do
|
|
item = BinanceItem.new(family: @family, name: "B", api_key: "k")
|
|
assert_not item.valid?
|
|
assert_includes item.errors[:api_secret], "can't be blank"
|
|
end
|
|
|
|
test "active scope excludes scheduled for deletion" do
|
|
@item.update!(scheduled_for_deletion: true)
|
|
refute_includes BinanceItem.active.to_a, @item
|
|
end
|
|
|
|
test "credentials_configured? returns true when both keys present" do
|
|
assert @item.credentials_configured?
|
|
end
|
|
|
|
test "credentials_configured? returns false when api_key nil" do
|
|
@item.api_key = nil
|
|
refute @item.credentials_configured?
|
|
end
|
|
|
|
test "destroy_later marks for deletion" do
|
|
@item.destroy_later
|
|
assert @item.scheduled_for_deletion?
|
|
end
|
|
|
|
test "set_binance_institution_defaults! sets metadata" do
|
|
@item.set_binance_institution_defaults!
|
|
assert_equal "Binance", @item.institution_name
|
|
assert_equal "binance.com", @item.institution_domain
|
|
assert_equal "https://www.binance.com", @item.institution_url
|
|
assert_equal "#F0B90B", @item.institution_color
|
|
end
|
|
|
|
test "sync_status_summary with no accounts" do
|
|
assert_equal I18n.t("binance_items.binance_item.sync_status.no_accounts"), @item.sync_status_summary
|
|
end
|
|
|
|
test "sync_status_summary with all accounts linked" do
|
|
ba = @item.binance_accounts.create!(name: "Binance Combined", account_type: "combined", currency: "USD")
|
|
account = Account.create!(
|
|
family: @family, name: "Binance", balance: 0, currency: "USD",
|
|
accountable: Crypto.create!(subtype: "exchange")
|
|
)
|
|
AccountProvider.create!(account: account, provider: ba)
|
|
|
|
assert_equal I18n.t("binance_items.binance_item.sync_status.all_synced", count: 1), @item.sync_status_summary
|
|
end
|
|
|
|
test "sync_status_summary with partial sync" do
|
|
# Linked account
|
|
ba1 = @item.binance_accounts.create!(name: "Binance Spot", account_type: "spot", currency: "USD")
|
|
account = Account.create!(
|
|
family: @family, name: "Binance Spot", balance: 0, currency: "USD",
|
|
accountable: Crypto.create!(subtype: "exchange")
|
|
)
|
|
AccountProvider.create!(account: account, provider: ba1)
|
|
|
|
# Unlinked account
|
|
@item.binance_accounts.create!(name: "Binance Earn", account_type: "earn", currency: "USD")
|
|
|
|
assert_equal I18n.t("binance_items.binance_item.sync_status.partial_sync", linked_count: 1, unlinked_count: 1), @item.sync_status_summary
|
|
end
|
|
|
|
test "linked_accounts_count returns correct count" do
|
|
ba = @item.binance_accounts.create!(name: "Binance", account_type: "combined", currency: "USD")
|
|
assert_equal 0, @item.linked_accounts_count
|
|
|
|
account = Account.create!(
|
|
family: @family, name: "Binance", balance: 0, currency: "USD",
|
|
accountable: Crypto.create!(subtype: "exchange")
|
|
)
|
|
AccountProvider.create!(account: account, provider: ba)
|
|
|
|
assert_equal 1, @item.linked_accounts_count
|
|
end
|
|
end
|