diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index 7b6147c2b..7bdbc113d 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -6,7 +6,7 @@ import logging import ccxt import pytest -from freqtrade import OperationalException +from freqtrade import OperationalException, DependencyException, NetworkException from freqtrade.exchange import init, validate_pairs, buy, sell, get_balance, get_balances, \ get_ticker, get_ticker_history, cancel_order, get_name, get_fee import freqtrade.exchange as exchange @@ -114,6 +114,27 @@ def test_buy_prod(default_conf, mocker): assert 'info' in order assert order['id'] == order_id + # test exception handling + with pytest.raises(DependencyException): + api_mock.create_limit_buy_order = MagicMock(side_effect=ccxt.InsufficientFunds) + mocker.patch('freqtrade.exchange._API', api_mock) + buy(pair='ETH/BTC', rate=200, amount=1) + + with pytest.raises(DependencyException): + api_mock.create_limit_buy_order = MagicMock(side_effect=ccxt.InvalidOrder) + mocker.patch('freqtrade.exchange._API', api_mock) + buy(pair='ETH/BTC', rate=200, amount=1) + + with pytest.raises(NetworkException): + api_mock.create_limit_buy_order = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + buy(pair='ETH/BTC', rate=200, amount=1) + + with pytest.raises(OperationalException): + api_mock.create_limit_buy_order = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + buy(pair='ETH/BTC', rate=200, amount=1) + def test_sell_dry_run(default_conf, mocker): default_conf['dry_run'] = True @@ -143,6 +164,27 @@ def test_sell_prod(default_conf, mocker): assert 'info' in order assert order['id'] == order_id + # test exception handling + with pytest.raises(DependencyException): + api_mock.create_limit_sell_order = MagicMock(side_effect=ccxt.InsufficientFunds) + mocker.patch('freqtrade.exchange._API', api_mock) + sell(pair='ETH/BTC', rate=200, amount=1) + + with pytest.raises(DependencyException): + api_mock.create_limit_sell_order = MagicMock(side_effect=ccxt.InvalidOrder) + mocker.patch('freqtrade.exchange._API', api_mock) + sell(pair='ETH/BTC', rate=200, amount=1) + + with pytest.raises(NetworkException): + api_mock.create_limit_sell_order = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + sell(pair='ETH/BTC', rate=200, amount=1) + + with pytest.raises(OperationalException): + api_mock.create_limit_sell_order = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + sell(pair='ETH/BTC', rate=200, amount=1) + def test_get_balance_dry_run(default_conf, mocker): default_conf['dry_run'] = True @@ -161,6 +203,11 @@ def test_get_balance_prod(default_conf, mocker): assert get_balance(currency='BTC') == 123.4 + with pytest.raises(OperationalException): + api_mock.fetch_balance = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + get_balance(currency='BTC') + def test_get_balances_dry_run(default_conf, mocker): default_conf['dry_run'] = True @@ -192,6 +239,16 @@ def test_get_balances_prod(default_conf, mocker): assert get_balances()['1ST']['total'] == 10.0 assert get_balances()['1ST']['used'] == 0.0 + with pytest.raises(NetworkException): + api_mock.fetch_balance = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + get_balances() + + with pytest.raises(OperationalException): + api_mock.fetch_balance = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + get_balances() + # This test is somewhat redundant with # test_exchange_bittrex.py::test_exchange_bittrex_get_ticker @@ -233,6 +290,16 @@ def test_get_ticker(default_conf, mocker): assert ticker['bid'] == 0.5 assert ticker['ask'] == 1 + with pytest.raises(NetworkException): + api_mock.fetch_ticker = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + get_ticker(pair='ETH/BTC', refresh=True) + + with pytest.raises(OperationalException): + api_mock.fetch_ticker = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + get_ticker(pair='ETH/BTC', refresh=True) + def test_get_ticker_history(default_conf, mocker): api_mock = MagicMock() @@ -280,6 +347,18 @@ def test_get_ticker_history(default_conf, mocker): assert ticks[0]['C'] == 4 assert ticks[0]['V'] == 5 + with pytest.raises(NetworkException): + api_mock.fetch_ohlcv = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + # new symbol to get around cache + get_ticker_history('ABCD/BTC', default_conf['ticker_interval']) + + with pytest.raises(OperationalException): + api_mock.fetch_ohlcv = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + # new symbol to get around cache + get_ticker_history('EFGH/BTC', default_conf['ticker_interval']) + def test_cancel_order_dry_run(default_conf, mocker): default_conf['dry_run'] = True @@ -295,7 +374,22 @@ def test_cancel_order(default_conf, mocker): api_mock = MagicMock() api_mock.cancel_order = MagicMock(return_value=123) mocker.patch('freqtrade.exchange._API', api_mock) - assert cancel_order(order_id='_', pair='TKN/BTC') == 123 + assert cancel_order(order_id='_', pair='TKN/BTC') == 123 + + with pytest.raises(NetworkException): + api_mock.cancel_order = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + cancel_order(order_id='_', pair='TKN/BTC') + + with pytest.raises(DependencyException): + api_mock.cancel_order = MagicMock(side_effect=ccxt.InvalidOrder) + mocker.patch('freqtrade.exchange._API', api_mock) + cancel_order(order_id='_', pair='TKN/BTC') + + with pytest.raises(OperationalException): + api_mock.cancel_order = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + cancel_order(order_id='_', pair='TKN/BTC') def test_get_order(default_conf, mocker): @@ -314,6 +408,21 @@ def test_get_order(default_conf, mocker): mocker.patch('freqtrade.exchange._API', api_mock) assert exchange.get_order('X', 'TKN/BTC') == 456 + with pytest.raises(NetworkException): + api_mock.fetch_order = MagicMock(side_effect=ccxt.NetworkError) + mocker.patch('freqtrade.exchange._API', api_mock) + exchange.get_order(order_id='_', pair='TKN/BTC') + + with pytest.raises(DependencyException): + api_mock.fetch_order = MagicMock(side_effect=ccxt.InvalidOrder) + mocker.patch('freqtrade.exchange._API', api_mock) + exchange.get_order(order_id='_', pair='TKN/BTC') + + with pytest.raises(OperationalException): + api_mock.fetch_order = MagicMock(side_effect=ccxt.BaseError) + mocker.patch('freqtrade.exchange._API', api_mock) + exchange.get_order(order_id='_', pair='TKN/BTC') + def test_get_name(default_conf, mocker): mocker.patch('freqtrade.exchange.validate_pairs',