Files
ccxt_with_mt5/ccxt/test/exchange/async/test_fetch_currencies.py
lz_db 0fab423a18 add
2025-11-16 12:31:03 +08:00

74 lines
4.1 KiB
Python

import os
import sys
root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))))
sys.path.append(root)
# ----------------------------------------------------------------------------
# PLEASE DO NOT EDIT THIS FILE, IT IS GENERATED AND WILL BE OVERWRITTEN:
# https://github.com/ccxt/ccxt/blob/master/CONTRIBUTING.md#how-to-contribute-code
# ----------------------------------------------------------------------------
# -*- coding: utf-8 -*-
from ccxt.test.exchange.base import test_currency # noqa E402
from ccxt.test.exchange.base import test_shared_methods # noqa E402
async def test_fetch_currencies(exchange, skipped_properties):
method = 'fetchCurrencies'
currencies = await exchange.fetch_currencies()
# todo: try to invent something to avoid undefined undefined, i.e. maybe move into private and force it to have a value
num_inactive_currencies = 0
max_inactive_currencies_percentage = exchange.safe_integer(skipped_properties, 'maxInactiveCurrenciesPercentage', 50) # no more than X% currencies should be inactive
required_active_currencies = ['BTC', 'ETH', 'USDT', 'USDC']
features = exchange.features
features_spot = exchange.safe_dict(features, 'spot', {})
fetch_currencies = exchange.safe_dict(features_spot, 'fetchCurrencies', {})
is_fetch_currencies_private = exchange.safe_value(fetch_currencies, 'private', False)
if not is_fetch_currencies_private:
values = list(currencies.values())
test_shared_methods.assert_non_emtpy_array(exchange, skipped_properties, method, values)
currencies_length = len(values)
# ensure exchange returns enough length of currencies
skip_amount = ('amountOfCurrencies' in skipped_properties)
assert skip_amount or currencies_length > 5, exchange.id + ' ' + method + ' must return at least several currencies, but it returned ' + str(currencies_length)
# allow skipped exchanges
skip_active = ('activeCurrenciesQuota' in skipped_properties)
skip_major_currency_check = ('activeMajorCurrencies' in skipped_properties)
# loop
for i in range(0, currencies_length):
currency = values[i]
test_currency(exchange, skipped_properties, method, currency)
# detailed check for deposit/withdraw
active = exchange.safe_bool(currency, 'active')
if active is False:
num_inactive_currencies = num_inactive_currencies + 1
# ensure that major currencies are active and enabled for deposit and withdrawal
code = exchange.safe_string(currency, 'code', None)
withdraw = exchange.safe_bool(currency, 'withdraw')
deposit = exchange.safe_bool(currency, 'deposit')
if exchange.in_array(code, required_active_currencies):
assert skip_major_currency_check or (withdraw and deposit), 'Major currency ' + code + ' should have withdraw and deposit flags enabled'
# check at least X% of currencies are active
inactive_currencies_percentage = (num_inactive_currencies / currencies_length) * 100
assert skip_active or (inactive_currencies_percentage < max_inactive_currencies_percentage), 'Percentage of inactive currencies is too high at ' + str(inactive_currencies_percentage) + '% that is more than the allowed maximum of ' + str(max_inactive_currencies_percentage) + '%'
detect_currency_conflicts(exchange, currencies)
return True
def detect_currency_conflicts(exchange, currency_values):
# detect if there are currencies with different ids for the same code
ids = {}
keys = list(currency_values.keys())
for i in range(0, len(keys)):
key = keys[i]
currency = currency_values[key]
code = currency['code']
if not (code in ids):
ids[code] = currency['id']
else:
is_different = ids[code] != currency['id']
assert not is_different, exchange.id + ' fetchCurrencies() has different ids for the same code: ' + code + ' ' + ids[code] + ' ' + currency['id']
return True