diff --git a/tests/exchange/test_exchange_ws.py b/tests/exchange/test_exchange_ws.py index a9a247b20..ef431d9a4 100644 --- a/tests/exchange/test_exchange_ws.py +++ b/tests/exchange/test_exchange_ws.py @@ -5,9 +5,11 @@ from datetime import timedelta from time import sleep from unittest.mock import AsyncMock, MagicMock +import pytest from ccxt import NotSupported from freqtrade.enums import CandleType +from freqtrade.exceptions import TemporaryError from freqtrade.exchange.exchange_ws import ExchangeWS from ft_client.test_client.test_rest_client import log_has_re @@ -335,6 +337,68 @@ async def test_exchangews_get_ohlcv_missing_refresh_date(mocker, caplog): exchange_ws.cleanup() +def test_exchangews_ohlcvs_deepcopy_and_retry(mocker): + config = MagicMock() + ccxt_object = MagicMock() + ccxt_object.ohlcvs = { + "ETH/USDT": { + "1m": [[1, 2, 3, 4, 5, 6]], + } + } + mocker.patch("freqtrade.exchange.exchange_ws.ExchangeWS._start_forever", MagicMock()) + + exchange_ws = ExchangeWS(config, ccxt_object) + + call_count = {"count": 0} + + def deepcopy_side_effect(value): + call_count["count"] += 1 + if call_count["count"] < 3: + raise RuntimeError("copy failed") + return [candle.copy() for candle in value] + + mocker.patch("freqtrade.exchange.exchange_ws.deepcopy", deepcopy_side_effect) + + result = exchange_ws.ohlcvs("ETH/USDT", "1m") + + assert call_count["count"] == 3 + assert result == [[1, 2, 3, 4, 5, 6]] + assert result is not ccxt_object.ohlcvs["ETH/USDT"]["1m"] + + # Fail all the time + mocker.patch("freqtrade.exchange.exchange_ws.deepcopy", side_effect=RuntimeError("copy failed")) + with pytest.raises(TemporaryError, match=r"Error deepcopying: copy failed"): + exchange_ws.ohlcvs("ETH/USDT", "1m") + + exchange_ws.cleanup() + + +def test_exchangews_get_ohlcv_with_refresh(mocker): + config = MagicMock() + ccxt_object = MagicMock() + mocker.patch("freqtrade.exchange.exchange_ws.ExchangeWS._start_forever", MagicMock()) + + exchange_ws = ExchangeWS(config, ccxt_object) + ohlcvs_mock = mocker.patch.object( + exchange_ws, "ohlcvs", return_value=[[10, 11, 12, 13, 14, 15]] + ) + + paircomb = ("ETH/USDT", "1m", CandleType.SPOT) + exchange_ws._klines_last_refresh[paircomb] = 123456789 + + candles, refresh = exchange_ws.get_ohlcv_with_refresh("ETH/USDT", "1m", CandleType.SPOT) + + ohlcvs_mock.assert_called_once_with("ETH/USDT", "1m") + assert candles == [[10, 11, 12, 13, 14, 15]] + assert refresh == 123456789 + + candles, refresh = exchange_ws.get_ohlcv_with_refresh("ETH/USDT", "5m", CandleType.SPOT) + assert candles == [[10, 11, 12, 13, 14, 15]] + assert refresh == 0 + + exchange_ws.cleanup() + + def test_exchangews_continuous_stopped_task_exception(mocker, caplog): config = MagicMock() ccxt_object = MagicMock()