From 0a29096794989a8749ba3ba53be1e59d52ccc4ad Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 10 Sep 2018 20:19:12 +0200 Subject: [PATCH 1/5] Refactor load_market out of validate_pairs --- freqtrade/exchange/__init__.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index f663420e0..9cd6b861c 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -98,6 +98,7 @@ class Exchange(object): logger.info('Using Exchange "%s"', self.name) + self.markets = self._load_markets() # Check if all pairs are available self.validate_pairs(config['exchange']['pair_whitelist']) @@ -167,6 +168,16 @@ class Exchange(object): logger.warning('Could not load async markets. Reason: %s', e) return + def _load_markets(self) -> List[str]: + """ Initialize markets both sync and async """ + try: + markets = self._api.load_markets() + self._load_async_markets() + return markets + except ccxt.BaseError as e: + logger.warning('Unable to initialize markets. Reason: %s', e) + return [] + def validate_pairs(self, pairs: List[str]) -> None: """ Checks if all given pairs are tradable on the current exchange. @@ -175,11 +186,8 @@ class Exchange(object): :return: None """ - try: - markets = self._api.load_markets() - self._load_async_markets() - except ccxt.BaseError as e: - logger.warning('Unable to validate pairs (assuming they are correct). Reason: %s', e) + if not self.markets: + logger.warning('Unable to validate pairs (assuming they are correct).') return stake_cur = self._conf['stake_currency'] @@ -189,7 +197,7 @@ class Exchange(object): if not pair.endswith(stake_cur): raise OperationalException( f'Pair {pair} not compatible with stake_currency: {stake_cur}') - if pair not in markets: + if pair not in self.markets: raise OperationalException( f'Pair {pair} is not available at {self.name}') From f954efbd6452832da17ff5a03606bc22bff7dfc0 Mon Sep 17 00:00:00 2001 From: Matthias Date: Mon, 10 Sep 2018 20:19:28 +0200 Subject: [PATCH 2/5] Adapt tests to not _load_markets --- freqtrade/tests/conftest.py | 6 +- freqtrade/tests/test_freqtradebot.py | 115 +++++++++++++-------------- 2 files changed, 59 insertions(+), 62 deletions(-) diff --git a/freqtrade/tests/conftest.py b/freqtrade/tests/conftest.py index af9062cab..9d0396d25 100644 --- a/freqtrade/tests/conftest.py +++ b/freqtrade/tests/conftest.py @@ -4,7 +4,7 @@ import logging from datetime import datetime from functools import reduce from typing import Dict, Optional -from unittest.mock import MagicMock +from unittest.mock import MagicMock, PropertyMock import arrow import pytest @@ -26,8 +26,10 @@ def log_has(line, logs): def patch_exchange(mocker, api_mock=None) -> None: - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value=[])) mocker.patch('freqtrade.exchange.Exchange.validate_timeframes', MagicMock()) + mocker.patch('freqtrade.exchange.Exchange.name', PropertyMock(return_value="Bittrex")) + mocker.patch('freqtrade.exchange.Exchange.id', PropertyMock(return_value="bittrex")) if api_mock: mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) else: diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index 5e982f11a..3bbc01f37 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -140,7 +140,6 @@ def test_gen_pair_whitelist(mocker, default_conf, tickers) -> None: freqtrade = get_patched_freqtradebot(mocker, default_conf) mocker.patch('freqtrade.exchange.Exchange.get_tickers', tickers) mocker.patch('freqtrade.exchange.Exchange.exchange_has', MagicMock(return_value=True)) - # mocker.patch('freqtrade.exchange.validate_pairs', MagicMock(return_value=True)) # Test to retrieved BTC sorted on quoteVolume (default) whitelist = freqtrade._gen_pair_whitelist(base_currency='BTC') @@ -175,9 +174,9 @@ def test_refresh_whitelist() -> None: def test_get_trade_stake_amount(default_conf, ticker, limit_buy_order, fee, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_balance=MagicMock(return_value=default_conf['stake_amount'] * 2) ) @@ -193,9 +192,9 @@ def test_get_trade_stake_amount_no_stake_amount(default_conf, fee, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_balance=MagicMock(return_value=default_conf['stake_amount'] * 0.5) ) freqtrade = FreqtradeBot(default_conf) @@ -211,6 +210,7 @@ def test_get_trade_stake_amount_unlimited_amount(default_conf, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', validate_pairs=MagicMock(), @@ -253,7 +253,7 @@ def test_get_trade_stake_amount_unlimited_amount(default_conf, def test_get_min_pair_stake_amount(mocker, default_conf) -> None: patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) + patch_exchange(mocker) freqtrade = FreqtradeBot(default_conf) freqtrade.strategy.stoploss = -0.05 # no pair found @@ -388,9 +388,9 @@ def test_get_min_pair_stake_amount(mocker, default_conf) -> None: def test_create_trade(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -422,9 +422,9 @@ def test_create_trade(default_conf, ticker, limit_buy_order, fee, markets, mocke def test_create_trade_no_stake_amount(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_balance=MagicMock(return_value=default_conf['stake_amount'] * 0.5), @@ -441,10 +441,10 @@ def test_create_trade_no_stake_amount(default_conf, ticker, limit_buy_order, def test_create_trade_minimal_amount(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) buy_mock = MagicMock(return_value={'id': limit_buy_order['id']}) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=buy_mock, get_fee=fee, @@ -462,10 +462,10 @@ def test_create_trade_minimal_amount(default_conf, ticker, limit_buy_order, def test_create_trade_too_small_stake_amount(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) buy_mock = MagicMock(return_value={'id': limit_buy_order['id']}) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=buy_mock, get_fee=fee, @@ -483,9 +483,9 @@ def test_create_trade_too_small_stake_amount(default_conf, ticker, limit_buy_ord def test_create_trade_limit_reached(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_balance=MagicMock(return_value=default_conf['stake_amount']), @@ -504,9 +504,9 @@ def test_create_trade_limit_reached(default_conf, ticker, limit_buy_order, def test_create_trade_no_pairs(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -527,9 +527,9 @@ def test_create_trade_no_pairs(default_conf, ticker, limit_buy_order, fee, marke def test_create_trade_no_pairs_after_blacklist(default_conf, ticker, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -550,9 +550,9 @@ def test_create_trade_no_signal(default_conf, fee, mocker) -> None: default_conf['dry_run'] = True patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_balance=MagicMock(return_value=20), get_fee=fee, ) @@ -568,9 +568,9 @@ def test_create_trade_no_signal(default_conf, fee, mocker) -> None: def test_process_trade_creation(default_conf, ticker, limit_buy_order, markets, fee, mocker, caplog) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_markets=markets, buy=MagicMock(return_value={'id': limit_buy_order['id']}), @@ -605,9 +605,9 @@ def test_process_trade_creation(default_conf, ticker, limit_buy_order, def test_process_exchange_failures(default_conf, ticker, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_markets=markets, buy=MagicMock(side_effect=TemporaryError) @@ -624,9 +624,9 @@ def test_process_exchange_failures(default_conf, ticker, markets, mocker) -> Non def test_process_operational_exception(default_conf, ticker, markets, mocker) -> None: msg_mock = patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_markets=markets, buy=MagicMock(side_effect=OperationalException) @@ -645,9 +645,9 @@ def test_process_operational_exception(default_conf, ticker, markets, mocker) -> def test_process_trade_handling( default_conf, ticker, limit_buy_order, markets, fee, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_markets=markets, buy=MagicMock(return_value={'id': limit_buy_order['id']}), @@ -771,9 +771,9 @@ def test_process_maybe_execute_sell_exception(mocker, default_conf, def test_handle_trade(default_conf, limit_buy_order, limit_sell_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00001172, 'ask': 0.00001173, @@ -814,9 +814,9 @@ def test_handle_overlpapping_signals(default_conf, ticker, limit_buy_order, default_conf.update({'experimental': {'use_sell_signal': True}}) patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -870,9 +870,9 @@ def test_handle_trade_roi(default_conf, ticker, limit_buy_order, default_conf.update({'experimental': {'use_sell_signal': True}}) patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -903,9 +903,9 @@ def test_handle_trade_experimental( caplog.set_level(logging.DEBUG) default_conf.update({'experimental': {'use_sell_signal': True}}) patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -931,9 +931,9 @@ def test_handle_trade_experimental( def test_close_trade(default_conf, ticker, limit_buy_order, limit_sell_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -959,9 +959,9 @@ def test_close_trade(default_conf, ticker, limit_buy_order, limit_sell_order, def test_check_handle_timedout_buy(default_conf, ticker, limit_buy_order_old, fee, mocker) -> None: rpc_mock = patch_RPCManager(mocker) cancel_order_mock = MagicMock() + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_order=MagicMock(return_value=limit_buy_order_old), cancel_order=cancel_order_mock, @@ -996,9 +996,9 @@ def test_check_handle_timedout_buy(default_conf, ticker, limit_buy_order_old, fe def test_check_handle_timedout_sell(default_conf, ticker, limit_sell_order_old, mocker) -> None: rpc_mock = patch_RPCManager(mocker) cancel_order_mock = MagicMock() + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_order=MagicMock(return_value=limit_sell_order_old), cancel_order=cancel_order_mock @@ -1032,9 +1032,9 @@ def test_check_handle_timedout_partial(default_conf, ticker, limit_buy_order_old mocker) -> None: rpc_mock = patch_RPCManager(mocker) cancel_order_mock = MagicMock() + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_order=MagicMock(return_value=limit_buy_order_old_partial), cancel_order=cancel_order_mock @@ -1069,6 +1069,7 @@ def test_check_handle_timedout_partial(default_conf, ticker, limit_buy_order_old def test_check_handle_timedout_exception(default_conf, ticker, mocker, caplog) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) cancel_order_mock = MagicMock() mocker.patch.multiple( @@ -1078,7 +1079,6 @@ def test_check_handle_timedout_exception(default_conf, ticker, mocker, caplog) - ) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_order=MagicMock(side_effect=requests.exceptions.RequestException('Oh snap')), cancel_order=cancel_order_mock @@ -1111,10 +1111,10 @@ def test_check_handle_timedout_exception(default_conf, ticker, mocker, caplog) - def test_handle_timedout_limit_buy(mocker, default_conf) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) cancel_order_mock = MagicMock() mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), cancel_order=cancel_order_mock ) @@ -1133,10 +1133,10 @@ def test_handle_timedout_limit_buy(mocker, default_conf) -> None: def test_handle_timedout_limit_sell(mocker, default_conf) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) cancel_order_mock = MagicMock() mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), cancel_order=cancel_order_mock ) @@ -1155,9 +1155,9 @@ def test_handle_timedout_limit_sell(mocker, default_conf) -> None: def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1174,7 +1174,6 @@ def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, moc # Increase the price and sell it mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_up ) @@ -1201,9 +1200,9 @@ def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, moc def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1220,7 +1219,6 @@ def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, # Decrease the price and sell it mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_down ) @@ -1249,9 +1247,9 @@ def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1268,7 +1266,6 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee, # Increase the price and sell it mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_up ) freqtrade.config = {} @@ -1295,9 +1292,9 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee, def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1314,7 +1311,6 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee, # Decrease the price and sell it mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_down ) @@ -1342,9 +1338,9 @@ def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee, def test_sell_profit_only_enable_profit(default_conf, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00002172, 'ask': 0.00002173, @@ -1374,9 +1370,9 @@ def test_sell_profit_only_enable_profit(default_conf, limit_buy_order, def test_sell_profit_only_disable_profit(default_conf, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00002172, 'ask': 0.00002173, @@ -1404,9 +1400,9 @@ def test_sell_profit_only_disable_profit(default_conf, limit_buy_order, def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00000172, 'ask': 0.00000173, @@ -1435,9 +1431,9 @@ def test_sell_profit_only_enable_loss(default_conf, limit_buy_order, fee, market def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.0000172, 'ask': 0.0000173, @@ -1467,9 +1463,9 @@ def test_sell_profit_only_disable_loss(default_conf, limit_buy_order, fee, marke def test_ignore_roi_if_buy_signal(default_conf, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.0000172, 'ask': 0.0000173, @@ -1501,9 +1497,9 @@ def test_ignore_roi_if_buy_signal(default_conf, limit_buy_order, fee, markets, m def test_trailing_stop_loss(default_conf, limit_buy_order, fee, markets, caplog, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00000102, 'ask': 0.00000103, @@ -1535,9 +1531,9 @@ def test_trailing_stop_loss_positive(default_conf, limit_buy_order, fee, markets caplog, mocker) -> None: buy_price = limit_buy_order['price'] patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': buy_price - 0.000001, 'ask': buy_price - 0.000001, @@ -1593,9 +1589,9 @@ def test_trailing_stop_loss_offset(default_conf, limit_buy_order, fee, caplog, mocker, markets) -> None: buy_price = limit_buy_order['price'] patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': buy_price - 0.000001, 'ask': buy_price - 0.000001, @@ -1653,9 +1649,9 @@ def test_trailing_stop_loss_offset(default_conf, limit_buy_order, fee, def test_disable_ignore_roi_if_buy_signal(default_conf, limit_buy_order, fee, markets, mocker) -> None: patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00000172, 'ask': 0.00000173, @@ -1689,7 +1685,7 @@ def test_disable_ignore_roi_if_buy_signal(default_conf, limit_buy_order, def test_get_real_amount_quote(default_conf, trades_for_order, buy_order_fee, caplog, mocker): mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=trades_for_order) patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) amount = sum(x['amount'] for x in trades_for_order) trade = Trade( pair='LTC/ETH', @@ -1712,7 +1708,7 @@ def test_get_real_amount_no_trade(default_conf, buy_order_fee, caplog, mocker): mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=[]) patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) amount = buy_order_fee['amount'] trade = Trade( pair='LTC/ETH', @@ -1735,7 +1731,7 @@ def test_get_real_amount_stake(default_conf, trades_for_order, buy_order_fee, mo trades_for_order[0]['fee']['currency'] = 'ETH' patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=trades_for_order) amount = sum(x['amount'] for x in trades_for_order) trade = Trade( @@ -1757,7 +1753,7 @@ def test_get_real_amount_BNB(default_conf, trades_for_order, buy_order_fee, mock trades_for_order[0]['fee']['cost'] = 0.00094518 patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=trades_for_order) amount = sum(x['amount'] for x in trades_for_order) trade = Trade( @@ -1776,7 +1772,7 @@ def test_get_real_amount_BNB(default_conf, trades_for_order, buy_order_fee, mock def test_get_real_amount_multi(default_conf, trades_for_order2, buy_order_fee, caplog, mocker): patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=trades_for_order2) amount = float(sum(x['amount'] for x in trades_for_order2)) trade = Trade( @@ -1801,7 +1797,7 @@ def test_get_real_amount_fromorder(default_conf, trades_for_order, buy_order_fee limit_buy_order['fee'] = {'cost': 0.004, 'currency': 'LTC'} patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=[trades_for_order]) amount = float(sum(x['amount'] for x in trades_for_order)) @@ -1827,7 +1823,7 @@ def test_get_real_amount_invalid_order(default_conf, trades_for_order, buy_order limit_buy_order['fee'] = {'cost': 0.004} patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=[]) amount = float(sum(x['amount'] for x in trades_for_order)) trade = Trade( @@ -1849,7 +1845,7 @@ def test_get_real_amount_invalid(default_conf, trades_for_order, buy_order_fee, trades_for_order[0]['fee'] = {'cost': 0.008} patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_trades_for_order', return_value=trades_for_order) amount = sum(x['amount'] for x in trades_for_order) trade = Trade( @@ -1867,7 +1863,7 @@ def test_get_real_amount_invalid(default_conf, trades_for_order, buy_order_fee, def test_get_real_amount_open_trade(default_conf, mocker): patch_RPCManager(mocker) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock(return_value=True)) + patch_exchange(mocker) amount = 12345 trade = Trade( pair='LTC/ETH', @@ -1891,10 +1887,10 @@ def test_order_book_depth_of_market(default_conf, ticker, limit_buy_order, fee, default_conf['bid_strategy']['check_depth_of_market']['enabled'] = True default_conf['bid_strategy']['check_depth_of_market']['bids_to_ask_delta'] = 0.1 patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_order_book', order_book_l2) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -1927,10 +1923,10 @@ def test_order_book_depth_of_market_high_delta(default_conf, ticker, limit_buy_o # delta is 100 which is impossible to reach. hence check_depth_of_market will return false default_conf['bid_strategy']['check_depth_of_market']['bids_to_ask_delta'] = 100 patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.exchange.Exchange.get_order_book', order_book_l2) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': limit_buy_order['id']}), get_fee=fee, @@ -1950,9 +1946,9 @@ def test_order_book_bid_strategy1(mocker, default_conf, order_book_l2, markets) test if function get_target_bid will return the order book price instead of the ask rate """ + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_markets=markets, get_order_book=order_book_l2 ) @@ -1971,9 +1967,9 @@ def test_order_book_bid_strategy2(mocker, default_conf, order_book_l2, markets) test if function get_target_bid will return the ask rate (since its value is lower) instead of the order book rate (even if enabled) """ + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_markets=markets, get_order_book=order_book_l2 ) @@ -1992,9 +1988,9 @@ def test_order_book_bid_strategy3(default_conf, mocker, order_book_l2, markets) test if function get_target_bid will return ask rate instead of the order book rate """ + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_markets=markets, get_order_book=order_book_l2 ) @@ -2013,9 +2009,9 @@ def test_check_depth_of_market_buy(default_conf, mocker, order_book_l2, markets) """ test check depth of market """ + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_markets=markets, get_order_book=order_book_l2 ) @@ -2044,7 +2040,6 @@ def test_order_book_ask_strategy(default_conf, limit_buy_order, limit_sell_order patch_RPCManager(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock(return_value={ 'bid': 0.00001172, 'ask': 0.00001173, From 14b7fc42fad1f5c047712cad82db26338629d691 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 11 Sep 2018 19:46:18 +0200 Subject: [PATCH 3/5] Change returntype for _load_markets to dict --- freqtrade/exchange/__init__.py | 8 ++++---- freqtrade/tests/conftest.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/freqtrade/exchange/__init__.py b/freqtrade/exchange/__init__.py index 9cd6b861c..5eaa2b377 100644 --- a/freqtrade/exchange/__init__.py +++ b/freqtrade/exchange/__init__.py @@ -168,7 +168,7 @@ class Exchange(object): logger.warning('Could not load async markets. Reason: %s', e) return - def _load_markets(self) -> List[str]: + def _load_markets(self) -> Dict[str, Any]: """ Initialize markets both sync and async """ try: markets = self._api.load_markets() @@ -176,7 +176,7 @@ class Exchange(object): return markets except ccxt.BaseError as e: logger.warning('Unable to initialize markets. Reason: %s', e) - return [] + return {} def validate_pairs(self, pairs: List[str]) -> None: """ @@ -188,7 +188,7 @@ class Exchange(object): if not self.markets: logger.warning('Unable to validate pairs (assuming they are correct).') - return + # return stake_cur = self._conf['stake_currency'] for pair in pairs: @@ -197,7 +197,7 @@ class Exchange(object): if not pair.endswith(stake_cur): raise OperationalException( f'Pair {pair} not compatible with stake_currency: {stake_cur}') - if pair not in self.markets: + if self.markets and pair not in self.markets: raise OperationalException( f'Pair {pair} is not available at {self.name}') diff --git a/freqtrade/tests/conftest.py b/freqtrade/tests/conftest.py index 9d0396d25..c6eeebbef 100644 --- a/freqtrade/tests/conftest.py +++ b/freqtrade/tests/conftest.py @@ -26,7 +26,7 @@ def log_has(line, logs): def patch_exchange(mocker, api_mock=None) -> None: - mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value=[])) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) mocker.patch('freqtrade.exchange.Exchange.validate_timeframes', MagicMock()) mocker.patch('freqtrade.exchange.Exchange.name', PropertyMock(return_value="Bittrex")) mocker.patch('freqtrade.exchange.Exchange.id', PropertyMock(return_value="bittrex")) From 674bad2a4f9b18abf71f4ab0e6d21937a3caf077 Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 11 Sep 2018 19:46:47 +0200 Subject: [PATCH 4/5] Add and fix tests for load_markets --- freqtrade/tests/exchange/test_exchange.py | 46 ++++++++++++++++------- 1 file changed, 32 insertions(+), 14 deletions(-) diff --git a/freqtrade/tests/exchange/test_exchange.py b/freqtrade/tests/exchange/test_exchange.py index de720b3d9..d9d68c3b8 100644 --- a/freqtrade/tests/exchange/test_exchange.py +++ b/freqtrade/tests/exchange/test_exchange.py @@ -183,6 +183,29 @@ def test__load_async_markets(default_conf, mocker, caplog): caplog.record_tuples) +def test__load_markets(default_conf, mocker, caplog): + caplog.set_level(logging.INFO) + api_mock = MagicMock() + mocker.patch('freqtrade.exchange.Exchange.name', PropertyMock(return_value='Binance')) + + api_mock.load_markets = MagicMock(return_value={}) + mocker.patch('freqtrade.exchange.Exchange._init_ccxt', api_mock) + mocker.patch('freqtrade.exchange.Exchange.validate_timeframes', MagicMock()) + mocker.patch('freqtrade.exchange.Exchange._load_async_markets', MagicMock()) + + expected_return = {'ETH/BTC': 'available'} + api_mock.load_markets = MagicMock(return_value=expected_return) + mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) + default_conf['exchange']['pair_whitelist'] = ['ETH/BTC'] + ex = Exchange(default_conf) + assert ex.markets == expected_return + + api_mock.load_markets = MagicMock(side_effect=ccxt.BaseError()) + mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) + Exchange(default_conf) + assert log_has('Unable to initialize markets. Reason: ', caplog.record_tuples) + + def test_validate_pairs(default_conf, mocker): api_mock = MagicMock() api_mock.load_markets = MagicMock(return_value={ @@ -199,7 +222,7 @@ def test_validate_pairs(default_conf, mocker): def test_validate_pairs_not_available(default_conf, mocker): api_mock = MagicMock() - api_mock.load_markets = MagicMock(return_value={}) + api_mock.load_markets = MagicMock(return_value={'XRP/BTC': 'inactive'}) mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) mocker.patch('freqtrade.exchange.Exchange.validate_timeframes', MagicMock()) mocker.patch('freqtrade.exchange.Exchange._load_async_markets', MagicMock()) @@ -234,11 +257,9 @@ def test_validate_pairs_exception(default_conf, mocker, caplog): with pytest.raises(OperationalException, match=r'Pair ETH/BTC is not available at Binance'): Exchange(default_conf) - api_mock.load_markets = MagicMock(side_effect=ccxt.BaseError()) - - mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) Exchange(default_conf) - assert log_has('Unable to validate pairs (assuming they are correct). Reason: ', + assert log_has('Unable to validate pairs (assuming they are correct).', caplog.record_tuples) @@ -270,7 +291,7 @@ def test_validate_timeframes(default_conf, mocker): type(api_mock).timeframes = timeframes mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) Exchange(default_conf) @@ -286,7 +307,7 @@ def test_validate_timeframes_failed(default_conf, mocker): type(api_mock).timeframes = timeframes mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) with pytest.raises(OperationalException, match=r'Invalid ticker 3m, this Exchange supports.*'): Exchange(default_conf) @@ -303,7 +324,7 @@ def test_validate_timeframes_not_in_config(default_conf, mocker): type(api_mock).timeframes = timeframes mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock)) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) Exchange(default_conf) @@ -940,8 +961,7 @@ def test_get_order(default_conf, mocker): def test_name(default_conf, mocker): - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', - side_effect=lambda s: True) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) default_conf['exchange']['name'] = 'binance' exchange = Exchange(default_conf) @@ -949,16 +969,14 @@ def test_name(default_conf, mocker): def test_id(default_conf, mocker): - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', - side_effect=lambda s: True) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) default_conf['exchange']['name'] = 'binance' exchange = Exchange(default_conf) assert exchange.id == 'binance' def test_get_pair_detail_url(default_conf, mocker, caplog): - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', - side_effect=lambda s: True) + mocker.patch('freqtrade.exchange.Exchange._load_markets', MagicMock(return_value={})) default_conf['exchange']['name'] = 'binance' exchange = Exchange(default_conf) From c429eae6e42c906312fb3e35132b5557e7f8be2b Mon Sep 17 00:00:00 2001 From: Matthias Date: Tue, 11 Sep 2018 19:59:01 +0200 Subject: [PATCH 5/5] Adjust remaining tests to _load_markets refactoring --- freqtrade/tests/rpc/test_rpc.py | 27 ++++++++++------------- freqtrade/tests/rpc/test_rpc_telegram.py | 28 +++++++++++------------- freqtrade/tests/test_freqtradebot.py | 9 ++++---- 3 files changed, 30 insertions(+), 34 deletions(-) diff --git a/freqtrade/tests/rpc/test_rpc.py b/freqtrade/tests/rpc/test_rpc.py index c17ab6b2f..efc136777 100644 --- a/freqtrade/tests/rpc/test_rpc.py +++ b/freqtrade/tests/rpc/test_rpc.py @@ -13,7 +13,7 @@ from freqtrade.persistence import Trade from freqtrade.rpc import RPC, RPCException from freqtrade.state import State from freqtrade.tests.test_freqtradebot import patch_get_signal -from freqtrade.tests.conftest import patch_coinmarketcap +from freqtrade.tests.conftest import patch_coinmarketcap, patch_exchange # Functions for recurrent object patching @@ -30,7 +30,7 @@ def test_rpc_trade_status(default_conf, ticker, fee, markets, mocker) -> None: mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -68,10 +68,10 @@ def test_rpc_trade_status(default_conf, ticker, fee, markets, mocker) -> None: def test_rpc_status_table(default_conf, ticker, fee, markets, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -99,10 +99,10 @@ def test_rpc_status_table(default_conf, ticker, fee, markets, mocker) -> None: def test_rpc_daily_profit(default_conf, update, ticker, fee, limit_buy_order, limit_sell_order, markets, mocker) -> None: patch_coinmarketcap(mocker, value={'price_usd': 15000.0}) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -152,11 +152,11 @@ def test_rpc_trade_statistics(default_conf, ticker, ticker_sell_up, fee, ticker=MagicMock(return_value={'price_usd': 15000.0}), ) patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.rpc.CryptoToFiatConverter._find_price', return_value=15000.0) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -182,7 +182,6 @@ def test_rpc_trade_statistics(default_conf, ticker, ticker_sell_up, fee, # Update the ticker with a market going up mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_up ) trade.update(limit_sell_order) @@ -197,7 +196,6 @@ def test_rpc_trade_statistics(default_conf, ticker, ticker_sell_up, fee, # Update the ticker with a market going up mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_up ) trade.update(limit_sell_order) @@ -223,6 +221,7 @@ def test_rpc_trade_statistics(default_conf, ticker, ticker_sell_up, fee, # trade.open_rate (it is set to None) def test_rpc_trade_statistics_closed(mocker, default_conf, ticker, fee, markets, ticker_sell_up, limit_buy_order, limit_sell_order): + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.fiat_convert.Market', ticker=MagicMock(return_value={'price_usd': 15000.0}), @@ -231,7 +230,6 @@ def test_rpc_trade_statistics_closed(mocker, default_conf, ticker, fee, markets, mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -252,7 +250,6 @@ def test_rpc_trade_statistics_closed(mocker, default_conf, ticker, fee, markets, # Update the ticker with a market going up mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_up, get_fee=fee ) @@ -298,11 +295,11 @@ def test_rpc_balance_handle(default_conf, mocker): ticker=MagicMock(return_value={'price_usd': 15000.0}), ) patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.rpc.CryptoToFiatConverter._find_price', return_value=15000.0) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_balances=MagicMock(return_value=mock_balance), get_ticker=MagicMock(side_effect=TemporaryError('Could not load ticker due to xxx')) ) @@ -328,10 +325,10 @@ def test_rpc_balance_handle(default_conf, mocker): def test_rpc_start(mocker, default_conf) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock() ) @@ -351,10 +348,10 @@ def test_rpc_start(mocker, default_conf) -> None: def test_rpc_stop(mocker, default_conf) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=MagicMock() ) @@ -375,12 +372,12 @@ def test_rpc_stop(mocker, default_conf) -> None: def test_rpc_forcesell(default_conf, ticker, fee, mocker, markets) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) cancel_order_mock = MagicMock() mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, cancel_order=cancel_order_mock, get_order=MagicMock( @@ -476,10 +473,10 @@ def test_rpc_forcesell(default_conf, ticker, fee, mocker, markets) -> None: def test_performance_handle(default_conf, ticker, limit_buy_order, fee, limit_sell_order, markets, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_balances=MagicMock(return_value=ticker), get_ticker=ticker, get_fee=fee, @@ -512,10 +509,10 @@ def test_performance_handle(default_conf, ticker, limit_buy_order, fee, def test_rpc_count(mocker, default_conf, ticker, fee, markets) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.telegram.Telegram', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_balances=MagicMock(return_value=ticker), get_ticker=ticker, get_fee=fee, diff --git a/freqtrade/tests/rpc/test_rpc_telegram.py b/freqtrade/tests/rpc/test_rpc_telegram.py index 4d2b9cda2..182c1d2e7 100644 --- a/freqtrade/tests/rpc/test_rpc_telegram.py +++ b/freqtrade/tests/rpc/test_rpc_telegram.py @@ -177,10 +177,9 @@ def test_status(default_conf, update, mocker, fee, ticker, markets) -> None: default_conf['telegram']['chat_id'] = 123 patch_coinmarketcap(mocker) - + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_pair_detail_url=MagicMock(), get_fee=fee, @@ -228,9 +227,9 @@ def test_status(default_conf, update, mocker, fee, ticker, markets) -> None: def test_status_handle(default_conf, update, ticker, fee, markets, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -273,9 +272,9 @@ def test_status_handle(default_conf, update, ticker, fee, markets, mocker) -> No def test_status_table_handle(default_conf, update, ticker, fee, markets, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': 'mocked_order_id'}), get_fee=fee, @@ -324,13 +323,13 @@ def test_status_table_handle(default_conf, update, ticker, fee, markets, mocker) def test_daily_handle(default_conf, update, ticker, limit_buy_order, fee, limit_sell_order, markets, mocker) -> None: patch_coinmarketcap(mocker, value={'price_usd': 15000.0}) + patch_exchange(mocker) mocker.patch( 'freqtrade.rpc.rpc.CryptoToFiatConverter._find_price', return_value=15000.0 ) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -395,9 +394,9 @@ def test_daily_handle(default_conf, update, ticker, limit_buy_order, fee, def test_daily_wrong_input(default_conf, update, ticker, mocker) -> None: patch_coinmarketcap(mocker, value={'price_usd': 15000.0}) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker ) msg_mock = MagicMock() @@ -431,10 +430,10 @@ def test_daily_wrong_input(default_conf, update, ticker, mocker) -> None: def test_profit_handle(default_conf, update, ticker, ticker_sell_up, fee, limit_buy_order, limit_sell_order, markets, mocker) -> None: patch_coinmarketcap(mocker, value={'price_usd': 15000.0}) + patch_exchange(mocker) mocker.patch('freqtrade.rpc.rpc.CryptoToFiatConverter._find_price', return_value=15000.0) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -678,7 +677,7 @@ def test_forcesell_handle(default_conf, update, ticker, fee, mocker.patch('freqtrade.rpc.telegram.Telegram._init', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -727,7 +726,7 @@ def test_forcesell_down_handle(default_conf, update, ticker, fee, mocker.patch('freqtrade.rpc.telegram.Telegram._init', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -743,7 +742,6 @@ def test_forcesell_down_handle(default_conf, update, ticker, fee, # Decrease the price and sell it mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker_sell_down ) @@ -775,13 +773,13 @@ def test_forcesell_down_handle(default_conf, update, ticker, fee, def test_forcesell_all_handle(default_conf, update, ticker, fee, markets, mocker) -> None: patch_coinmarketcap(mocker, value={'price_usd': 15000.0}) + patch_exchange(mocker) mocker.patch('freqtrade.fiat_convert.CryptoToFiatConverter._find_price', return_value=15000.0) rpc_mock = mocker.patch('freqtrade.rpc.telegram.Telegram.send_msg', MagicMock()) mocker.patch('freqtrade.rpc.telegram.Telegram._init', MagicMock()) mocker.patch('freqtrade.exchange.Exchange.get_pair_detail_url', MagicMock()) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -827,7 +825,7 @@ def test_forcesell_handle_invalid(default_conf, update, mocker) -> None: _init=MagicMock(), _send_msg=msg_mock ) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) + patch_exchange(mocker) freqtradebot = FreqtradeBot(default_conf) patch_get_signal(freqtradebot, (True, False)) @@ -860,6 +858,7 @@ def test_forcesell_handle_invalid(default_conf, update, mocker) -> None: def test_performance_handle(default_conf, update, ticker, fee, limit_buy_order, limit_sell_order, markets, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) msg_mock = MagicMock() mocker.patch.multiple( 'freqtrade.rpc.telegram.Telegram', @@ -868,7 +867,6 @@ def test_performance_handle(default_conf, update, ticker, fee, ) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -899,13 +897,13 @@ def test_performance_handle(default_conf, update, ticker, fee, def test_performance_handle_invalid(default_conf, update, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) msg_mock = MagicMock() mocker.patch.multiple( 'freqtrade.rpc.telegram.Telegram', _init=MagicMock(), _send_msg=msg_mock ) - mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock()) freqtradebot = FreqtradeBot(default_conf) patch_get_signal(freqtradebot, (True, False)) telegram = Telegram(freqtradebot) @@ -919,6 +917,7 @@ def test_performance_handle_invalid(default_conf, update, mocker) -> None: def test_count_handle(default_conf, update, ticker, fee, markets, mocker) -> None: patch_coinmarketcap(mocker) + patch_exchange(mocker) msg_mock = MagicMock() mocker.patch.multiple( 'freqtrade.rpc.telegram.Telegram', @@ -927,7 +926,6 @@ def test_count_handle(default_conf, update, ticker, fee, markets, mocker) -> Non ) mocker.patch.multiple( 'freqtrade.exchange.Exchange', - validate_pairs=MagicMock(), get_ticker=ticker, buy=MagicMock(return_value={'id': 'mocked_order_id'}), get_markets=markets diff --git a/freqtrade/tests/test_freqtradebot.py b/freqtrade/tests/test_freqtradebot.py index 3bbc01f37..0b17a2475 100644 --- a/freqtrade/tests/test_freqtradebot.py +++ b/freqtrade/tests/test_freqtradebot.py @@ -1155,9 +1155,9 @@ def test_handle_timedout_limit_sell(mocker, default_conf) -> None: def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) - patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1200,9 +1200,9 @@ def test_execute_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, moc def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) - patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1247,9 +1247,9 @@ def test_execute_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee, ticker_sell_up, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) - patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -1292,9 +1292,9 @@ def test_execute_sell_without_conf_sell_up(default_conf, ticker, fee, def test_execute_sell_without_conf_sell_down(default_conf, ticker, fee, ticker_sell_down, markets, mocker) -> None: rpc_mock = patch_RPCManager(mocker) - patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', + _load_markets=MagicMock(return_value={}), get_ticker=ticker, get_fee=fee, get_markets=markets @@ -2038,6 +2038,7 @@ def test_order_book_ask_strategy(default_conf, limit_buy_order, limit_sell_order default_conf['ask_strategy']['order_book_max'] = 2 default_conf['telegram']['enabled'] = False patch_RPCManager(mocker) + patch_exchange(mocker) mocker.patch.multiple( 'freqtrade.exchange.Exchange', get_ticker=MagicMock(return_value={