2024-07-20 19:54:29 +00:00
|
|
|
from decimal import Decimal
|
|
|
|
|
|
|
|
import fin_defs
|
2024-07-20 18:19:52 +00:00
|
|
|
import pytest
|
|
|
|
|
2024-07-20 18:21:50 +00:00
|
|
|
from fin_depo import defi_kucoin
|
2024-07-20 18:19:52 +00:00
|
|
|
|
|
|
|
from . import secrets
|
|
|
|
|
2024-07-20 19:54:29 +00:00
|
|
|
TEST_MARKET_ORDERS = False
|
|
|
|
|
2024-07-20 18:19:52 +00:00
|
|
|
needs_secrets = pytest.mark.skipif(
|
|
|
|
not secrets.KUCOIN_KEY,
|
|
|
|
reason='Secret kucoin_USERNAME required',
|
|
|
|
)
|
|
|
|
|
2024-07-20 19:54:29 +00:00
|
|
|
defi_kucoin.logger.setLevel('INFO')
|
|
|
|
|
2024-07-20 18:21:50 +00:00
|
|
|
|
2024-07-20 18:19:52 +00:00
|
|
|
@needs_secrets
|
|
|
|
def test_get_depo():
|
2024-07-20 19:54:29 +00:00
|
|
|
"""Can inspect kucoin depository."""
|
2024-07-20 18:19:52 +00:00
|
|
|
fetcher = defi_kucoin.KucoinDepoFetcher(
|
|
|
|
secrets.KUCOIN_KEY,
|
|
|
|
secrets.KUCOIN_SECRET,
|
|
|
|
secrets.KUCOIN_PASS,
|
|
|
|
)
|
|
|
|
|
|
|
|
depo = fetcher.get_depo()
|
|
|
|
assert depo is not None
|
2024-07-20 19:54:29 +00:00
|
|
|
|
|
|
|
|
|
|
|
@needs_secrets
|
|
|
|
def test_place_market_order_requires_allow_trades():
|
|
|
|
"""Client fails if allow_trades is not enabled when doing market orders."""
|
|
|
|
fetcher = defi_kucoin.KucoinDepoFetcher(
|
|
|
|
secrets.KUCOIN_KEY,
|
|
|
|
secrets.KUCOIN_SECRET,
|
|
|
|
secrets.KUCOIN_PASS,
|
|
|
|
allow_trades=False,
|
|
|
|
)
|
|
|
|
|
|
|
|
with pytest.raises(PermissionError) as m:
|
|
|
|
fetcher.place_market_order(fin_defs.MPC, Decimal(1), fin_defs.USDT)
|
|
|
|
|
|
|
|
assert 'KucoinDepoFetcher.allow_trades is not enabled: Cannot make trades' in str(m)
|
|
|
|
|
|
|
|
|
|
|
|
@needs_secrets
|
|
|
|
def test_place_buy_side_order():
|
|
|
|
"""Client can place buy side market orders."""
|
|
|
|
fetcher = defi_kucoin.KucoinDepoFetcher(
|
|
|
|
secrets.KUCOIN_KEY,
|
|
|
|
secrets.KUCOIN_SECRET,
|
|
|
|
secrets.KUCOIN_PASS,
|
|
|
|
allow_trades=TEST_MARKET_ORDERS,
|
|
|
|
)
|
|
|
|
|
|
|
|
input_amount = Decimal('0.1')
|
|
|
|
|
|
|
|
order_details = fetcher.place_market_order(
|
|
|
|
fin_defs.USDT, input_amount, fin_defs.MPC,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert order_details is not None
|
|
|
|
assert order_details.order_id is not None
|
|
|
|
assert order_details.raw_order_details is not None
|
|
|
|
|
|
|
|
assert order_details.input_asset == fin_defs.USDT
|
|
|
|
assert order_details.output_asset == fin_defs.MPC
|
|
|
|
|
|
|
|
assert order_details.input_amount <= input_amount
|
|
|
|
assert order_details.output_amount >= 0
|
|
|
|
|
|
|
|
assert order_details.input_amount != order_details.output_amount
|
|
|
|
|
|
|
|
assert order_details.fee_asset == fin_defs.USDT
|
|
|
|
assert order_details.fee_amount <= Decimal('0.0002')
|
|
|
|
|
|
|
|
|
|
|
|
@needs_secrets
|
|
|
|
def test_place_sell_side_order():
|
|
|
|
"""Client can place sell side market orders."""
|
|
|
|
fetcher = defi_kucoin.KucoinDepoFetcher(
|
|
|
|
secrets.KUCOIN_KEY,
|
|
|
|
secrets.KUCOIN_SECRET,
|
|
|
|
secrets.KUCOIN_PASS,
|
|
|
|
allow_trades=TEST_MARKET_ORDERS,
|
|
|
|
)
|
|
|
|
|
|
|
|
input_amount = Decimal('1')
|
|
|
|
|
|
|
|
order_details = fetcher.place_market_order(
|
|
|
|
fin_defs.MPC, input_amount, fin_defs.USDT,
|
|
|
|
)
|
|
|
|
|
|
|
|
assert order_details is not None
|
|
|
|
assert order_details.order_id is not None
|
|
|
|
assert order_details.raw_order_details is not None
|
|
|
|
|
|
|
|
assert order_details.input_asset == fin_defs.MPC
|
|
|
|
assert order_details.output_asset == fin_defs.USDT
|
|
|
|
|
|
|
|
assert order_details.input_amount <= input_amount
|
|
|
|
assert order_details.output_amount >= 0
|
|
|
|
|
|
|
|
assert order_details.input_amount != order_details.output_amount
|
|
|
|
|
|
|
|
assert order_details.fee_asset == fin_defs.USDT
|
|
|
|
assert order_details.fee_amount is not None
|