def test_pagination(mock_ftx: Ftx): """Test pagination in the eth/eur market (public endpoint)""" # Try pagination good path response = mock_ftx._api_query( endpoint='markets/eth/eur/trades', limit=3, start_time=Timestamp(1617716695), end_time=Timestamp(1617724135), ) assert len(response) == 24 # Try with a page size divisor of the total orders response = mock_ftx._api_query( endpoint='markets/eth/eur/trades', limit=3, start_time=Timestamp(1617716695), end_time=Timestamp(1617724135), ) assert len(response) == 24 # Try pagination with same dates. Should return empty list response = mock_ftx._api_query( endpoint='markets/eth/eur/trades', limit=3, start_time=Timestamp(1617716695), end_time=Timestamp(1617716695), ) assert len(response) == 0
def test_exchanges_filtering(database, exchange_manager, function_scope_messages_aggregator): kraken1 = MockKraken( name='mockkraken_1', api_key=make_api_key(), secret=make_api_secret(), database=database, msg_aggregator=function_scope_messages_aggregator, ) kraken2 = MockKraken( name='mockkraken_2', api_key=make_api_key(), secret=make_api_secret(), database=database, msg_aggregator=function_scope_messages_aggregator, ) ftx1 = Ftx( name='mockftx_1', api_key=make_api_key(), secret=make_api_secret(), database=database, msg_aggregator=function_scope_messages_aggregator, ftx_subaccount=None, ) ftx2 = Ftx( name='mockftx_2', api_key=make_api_key(), secret=make_api_secret(), database=database, msg_aggregator=function_scope_messages_aggregator, ftx_subaccount=None, ) exchange_manager.initialize_exchanges({}, database) exchange_manager.connected_exchanges[Location.KRAKEN].append(kraken1) exchange_manager.connected_exchanges[Location.KRAKEN].append(kraken2) exchange_manager.connected_exchanges[Location.FTX].append(ftx1) exchange_manager.connected_exchanges[Location.FTX].append(ftx2) assert set(exchange_manager.iterate_exchanges()) == { kraken1, kraken2, ftx1, ftx2 } database.set_settings( ModifiableDBSettings(non_syncing_exchanges=[ kraken1.location_id(), kraken2.location_id() ], )) assert set(exchange_manager.iterate_exchanges()) == {ftx1, ftx2} database.set_settings( ModifiableDBSettings(non_syncing_exchanges=[ftx1.location_id()], )) assert set( exchange_manager.iterate_exchanges()) == {ftx2, kraken1, kraken2}
def test_ftx_exchange_assets_are_known(mock_ftx: Ftx): unknown_assets: Set[str] = set() unsupported_assets = set(UNSUPPORTED_FTX_ASSETS) def process_currency(currency: Optional[str]): """Check if a currency is known for the FTX exchange""" if currency is None: return try: if currency not in unknown_assets: asset_from_ftx(base_currency) except UnsupportedAsset: assert base_currency in unsupported_assets except UnknownAsset as e: test_warnings.warn( UserWarning( f'Found unknown asset {e.asset_name} in FTX. ' f'Support for it has to be added', )) unknown_assets.add(base_currency) response = mock_ftx._api_query(endpoint='markets', paginate=False) # Extract the unique symbols from the exchange pairs for entry in response: if entry['type'] == 'future': continue base_currency = entry.get('baseCurrency', None) quote_currency = entry.get('quoteCurrency', None) process_currency(base_currency) process_currency(quote_currency)
def test_query_deposits_withdrawals(mock_ftx: Ftx): """Test happy path of deposits/withdrawls""" with patch.object(mock_ftx.session, 'get', side_effect=mock_normal_ftx_query): movements = mock_ftx.query_online_deposits_withdrawals( start_ts=Timestamp(0), end_ts=TEST_END_TS, ) warnings = mock_ftx.msg_aggregator.consume_warnings() errors = mock_ftx.msg_aggregator.consume_errors() assert len(warnings) == 0 assert len(errors) == 0 expected_movements = [ AssetMovement( location=Location.FTX, category=AssetMovementCategory.DEPOSIT, address='0x541163adf0a2e830d9f940763e912807d1a359f5', transaction_id= '0xf787fa6b62edf1c97fb3f73f80a5eb7550bbf3dcf4269b9bfb9e8c1c0a3bc1a9', timestamp=Timestamp(1612159566), asset=A_ETH, amount=FVal('20'), fee_asset=A_ETH, fee=Fee(ZERO), link='3', ), AssetMovement( location=Location.FTX, category=AssetMovementCategory.WITHDRAWAL, timestamp=Timestamp(1612159566), address='0x903d12bf2c57a29f32365917c706ce0e1a84cce3', transaction_id= '0xbb27f24c2a348526fc23767d3d8bb303099e90f253ef9fdbb28ce38c1635d116', asset=A_ETH, amount=FVal('11.0'), fee_asset=A_ETH, fee=Fee(ZERO), link='1', ), AssetMovement( location=Location.FTX, category=AssetMovementCategory.WITHDRAWAL, address=None, transaction_id=None, timestamp=Timestamp(1612159566), asset=A_USD, amount=FVal('21.0'), fee_asset=A_USD, fee=Fee(ZERO), link='2', ) ] assert len(movements) == 3 assert movements == expected_movements
def create_test_ftx( database: DBHandler, msg_aggregator: MessagesAggregator, ) -> Ftx: mock = Ftx( api_key=make_api_key(), secret=make_api_secret(), database=database, msg_aggregator=msg_aggregator, ) return mock
def create_test_ftx( database: DBHandler, msg_aggregator: MessagesAggregator, ) -> Ftx: mock = Ftx( name='ftx', api_key=make_api_key(), secret=make_api_secret(), database=database, msg_aggregator=msg_aggregator, ftx_subaccount=None, ) return mock
def test_balances(mock_ftx: Ftx): """Test that balances are correctly extracted""" with patch.object(mock_ftx.session, 'get', side_effect=mock_normal_ftx_query): balances, msg = mock_ftx.query_balances() warnings = mock_ftx.msg_aggregator.consume_warnings() errors = mock_ftx.msg_aggregator.consume_errors() assert len(warnings) == 0 assert len(errors) == 0 assert msg == '' assert len(balances) == 2 assert balances[A_USDC].amount == FVal('10000.0') assert balances[A_ETH].amount == FVal('10010.0') assert balances[A_USDC].usd_value == FVal('10000.0') assert balances[A_ETH].usd_value == FVal('20020000.0')
def test_name(): exchange = Ftx('ftx1', 'a', b'a', object(), object()) assert exchange.location == Location.FTX assert exchange.name == 'ftx1'
def test_name(database): exchange = Ftx('ftx1', 'a', b'a', database, object(), None) assert exchange.location == Location.FTX assert exchange.name == 'ftx1'
def test_name(): exchange = Ftx('a', b'a', object(), object()) assert exchange.name == 'ftx'