diff --git a/freqtrade/exchange/exchange_ws.py b/freqtrade/exchange/exchange_ws.py index afe65765b..7b4209cb6 100644 --- a/freqtrade/exchange/exchange_ws.py +++ b/freqtrade/exchange/exchange_ws.py @@ -4,7 +4,7 @@ import logging import time from datetime import datetime from threading import Thread -from typing import Dict, List, Set, Tuple +from typing import Dict, List, Optional, Set, Tuple import ccxt @@ -20,23 +20,24 @@ class ExchangeWS(): def __init__(self, config: Config, ccxt_object: ccxt.Exchange) -> None: self.config = config self.ccxt_object = ccxt_object - self._thread = Thread(name="ccxt_ws", target=self.__start_forever) self._background_tasks: Set[asyncio.Task] = set() self._klines_watching: Set[PairWithTimeframe] = set() self._klines_scheduled: Set[PairWithTimeframe] = set() self.klines_last_refresh: Dict[PairWithTimeframe, float] = {} self.klines_last_request: Dict[PairWithTimeframe, float] = {} + self._thread = Thread(name="ccxt_ws", target=self._start_forever) self._thread.start() - def __start_forever(self) -> None: + def _start_forever(self) -> None: self._loop = asyncio.new_event_loop() self._loop.run_forever() def cleanup(self) -> None: logger.debug("Cleanup called - stopping") self._klines_watching.clear() - self._loop.stop() + if hasattr(self, '_loop'): + self._loop.stop() self._thread.join() logger.debug("Stopped") diff --git a/tests/exchange/test_exchange_ws.py b/tests/exchange/test_exchange_ws.py new file mode 100644 index 000000000..d119230f1 --- /dev/null +++ b/tests/exchange/test_exchange_ws.py @@ -0,0 +1,30 @@ + + +from time import sleep +from unittest.mock import MagicMock + +from freqtrade.exchange.exchange_ws import ExchangeWS + + +def test_exchangews_init(mocker): + + config = MagicMock() + ccxt_object = MagicMock() + mocker.patch("freqtrade.exchange.exchange_ws.ExchangeWS._start_forever", MagicMock()) + + exchange_ws = ExchangeWS(config, ccxt_object) + + assert exchange_ws.config == config + assert exchange_ws.ccxt_object == ccxt_object + assert exchange_ws._thread.name == "ccxt_ws" + assert exchange_ws._background_tasks == set() + assert exchange_ws._klines_watching == set() + assert exchange_ws._klines_scheduled == set() + assert exchange_ws.klines_last_refresh == {} + assert exchange_ws.klines_last_request == {} + assert exchange_ws._ob_watching == set() + assert exchange_ws._ob_scheduled == set() + assert exchange_ws.ob_last_request == {} + sleep(0.1) + # Cleanup + exchange_ws.cleanup()