Merge pull request #1994 from hroff-1902/fix-validate_timeframes

fix validate_timeframes()
This commit is contained in:
Matthias 2019-07-03 11:11:28 +02:00 committed by GitHub
commit e19c192570
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 31 additions and 6 deletions

View File

@ -274,12 +274,15 @@ class Exchange(object):
""" """
Checks if ticker interval from config is a supported timeframe on the exchange Checks if ticker interval from config is a supported timeframe on the exchange
""" """
if not hasattr(self._api, "timeframes"): if not hasattr(self._api, "timeframes") or self._api.timeframes is None:
# If timeframes is missing, the exchange probably has no fetchOHLCV method. # If timeframes attribute is missing (or is None), the exchange probably
# has no fetchOHLCV method.
# Therefore we also show that. # Therefore we also show that.
raise OperationalException( raise OperationalException(
f"This exchange ({self.name}) does not have a `timeframes` attribute and " f"The ccxt library does not provide the list of timeframes "
f"is therefore not supported. fetchOHLCV: {self.exchange_has('fetchOHLCV')}") f"for the exchange \"{self.name}\" and this exchange "
f"is therefore not supported. ccxt fetchOHLCV: {self.exchange_has('fetchOHLCV')}")
timeframes = self._api.timeframes timeframes = self._api.timeframes
if timeframe not in timeframes: if timeframe not in timeframes:
raise OperationalException( raise OperationalException(

View File

@ -396,7 +396,7 @@ def test_validate_timeframes_failed(default_conf, mocker):
Exchange(default_conf) Exchange(default_conf)
def test_validate_timeframes_emulated_ohlcv(default_conf, mocker): def test_validate_timeframes_emulated_ohlcv_1(default_conf, mocker):
default_conf["ticker_interval"] = "3m" default_conf["ticker_interval"] = "3m"
api_mock = MagicMock() api_mock = MagicMock()
id_mock = PropertyMock(return_value='test_exchange') id_mock = PropertyMock(return_value='test_exchange')
@ -409,7 +409,29 @@ def test_validate_timeframes_emulated_ohlcv(default_conf, mocker):
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_pairs', MagicMock()) mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock())
with pytest.raises(OperationalException, with pytest.raises(OperationalException,
match=r'This exchange (.*) does not have a `timeframes` attribute and*'): match=r'The ccxt library does not provide the list of timeframes '
r'for the exchange ".*" and this exchange '
r'is therefore not supported. *'):
Exchange(default_conf)
def test_validate_timeframes_emulated_ohlcvi_2(default_conf, mocker):
default_conf["ticker_interval"] = "3m"
api_mock = MagicMock()
id_mock = PropertyMock(return_value='test_exchange')
type(api_mock).id = id_mock
# delete timeframes so magicmock does not autocreate it
del api_mock.timeframes
mocker.patch('freqtrade.exchange.Exchange._init_ccxt', MagicMock(return_value=api_mock))
mocker.patch('freqtrade.exchange.Exchange._load_markets',
MagicMock(return_value={'timeframes': None}))
mocker.patch('freqtrade.exchange.Exchange.validate_pairs', MagicMock())
with pytest.raises(OperationalException,
match=r'The ccxt library does not provide the list of timeframes '
r'for the exchange ".*" and this exchange '
r'is therefore not supported. *'):
Exchange(default_conf) Exchange(default_conf)