From 939a87ed2e652581c98aa3af9038b225884b76f7 Mon Sep 17 00:00:00 2001 From: Matthias Date: Thu, 29 Aug 2019 16:33:56 +0200 Subject: [PATCH] Add test for fetch_trades --- tests/conftest.py | 64 +++++++++++++++++++++++++++++++++ tests/exchange/test_exchange.py | 48 +++++++++++++++++++++++++ 2 files changed, 112 insertions(+) diff --git a/tests/conftest.py b/tests/conftest.py index 6a0a74b5b..cd0c29efc 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -928,6 +928,70 @@ def trades_for_order(): 'fee': {'cost': 0.008, 'currency': 'LTC'}}] +@pytest.fixture(scope="function") +def trades_history(): + return [{'info': {'a': 126181329, + 'p': '0.01962700', + 'q': '0.04000000', + 'f': 138604155, + 'l': 138604155, + 'T': 1565798399463, + 'm': False, + 'M': True}, + 'timestamp': 1565798399463, + 'datetime': '2019-08-14T15:59:59.463Z', + 'symbol': 'ETH/BTC', + 'id': '126181329', + 'order': None, + 'type': None, + 'takerOrMaker': None, + 'side': 'buy', + 'price': 0.019627, + 'amount': 0.04, + 'cost': 0.00078508, + 'fee': None}, + {'info': {'a': 126181330, + 'p': '0.01962700', + 'q': '0.24400000', + 'f': 138604156, + 'l': 138604156, + 'T': 1565798399629, + 'm': False, + 'M': True}, + 'timestamp': 1565798399629, + 'datetime': '2019-08-14T15:59:59.629Z', + 'symbol': 'ETH/BTC', + 'id': '126181330', + 'order': None, + 'type': None, + 'takerOrMaker': None, + 'side': 'buy', + 'price': 0.019627, + 'amount': 0.244, + 'cost': 0.004788987999999999, + 'fee': None}, + {'info': {'a': 126181331, + 'p': '0.01962600', + 'q': '0.01100000', + 'f': 138604157, + 'l': 138604157, + 'T': 1565798399752, + 'm': True, + 'M': True}, + 'timestamp': 1565798399752, + 'datetime': '2019-08-14T15:59:59.752Z', + 'symbol': 'ETH/BTC', + 'id': '126181331', + 'order': None, + 'type': None, + 'takerOrMaker': None, + 'side': 'sell', + 'price': 0.019626, + 'amount': 0.011, + 'cost': 0.00021588599999999999, + 'fee': None}] + + @pytest.fixture(scope="function") def trades_for_order2(): return [{'info': {'id': 34567, diff --git a/tests/exchange/test_exchange.py b/tests/exchange/test_exchange.py index 018cab3b8..a621a5d52 100644 --- a/tests/exchange/test_exchange.py +++ b/tests/exchange/test_exchange.py @@ -1314,6 +1314,54 @@ async def test___async_get_candle_history_sort(default_conf, mocker, exchange_na assert ticks[9][5] == 2.31452783 +@pytest.mark.asyncio +@pytest.mark.parametrize("exchange_name", EXCHANGES) +async def test__async_fetch_trades(default_conf, mocker, caplog, exchange_name, + trades_history): + + caplog.set_level(logging.DEBUG) + exchange = get_patched_exchange(mocker, default_conf, id=exchange_name) + # Monkey-patch async function + exchange._api_async.fetch_trades = get_mock_coro(trades_history) + + pair = 'ETH/BTC' + res = await exchange._async_fetch_trades(pair, since=None, params=None) + assert type(res) is list + assert isinstance(res[0], dict) + assert isinstance(res[1], dict) + + assert exchange._api_async.fetch_trades.call_count == 1 + assert exchange._api_async.fetch_trades.call_args[0][0] == pair + assert exchange._api_async.fetch_trades.call_args[1]['limit'] == 1000 + + assert log_has_re(f"Fetching trades for pair {pair}, since .*", caplog) + caplog.clear() + exchange._api_async.fetch_trades.reset_mock() + res = await exchange._async_fetch_trades(pair, since=None, params={'from': '123'}) + assert exchange._api_async.fetch_trades.call_count == 1 + assert exchange._api_async.fetch_trades.call_args[0][0] == pair + assert exchange._api_async.fetch_trades.call_args[1]['limit'] == 1000 + assert exchange._api_async.fetch_trades.call_args[1]['params'] == {'from': '123'} + assert log_has_re(f"Fetching trades for pair {pair}, params: .*", caplog) + + exchange = Exchange(default_conf) + await async_ccxt_exception(mocker, default_conf, MagicMock(), + "_async_fetch_trades", "fetch_trades", + pair='ABCD/BTC', since=None) + + api_mock = MagicMock() + with pytest.raises(OperationalException, match=r'Could not fetch trade data*'): + api_mock.fetch_trades = MagicMock(side_effect=ccxt.BaseError("Unknown error")) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) + await exchange._async_fetch_trades(pair, since=(arrow.utcnow().timestamp - 2000) * 1000) + + with pytest.raises(OperationalException, match=r'Exchange.* does not support fetching ' + r'historical trade data\..*'): + api_mock.fetch_trades = MagicMock(side_effect=ccxt.NotSupported("Not supported")) + exchange = get_patched_exchange(mocker, default_conf, api_mock, id=exchange_name) + await exchange._async_fetch_trades(pair, since=(arrow.utcnow().timestamp - 2000) * 1000) + + @pytest.mark.parametrize("exchange_name", EXCHANGES) def test_cancel_order_dry_run(default_conf, mocker, exchange_name): default_conf['dry_run'] = True