コード例 #1
0
    def test_connect_raises_exception(self, ws_connect_mock):
        throttler = AsyncThrottler(CONSTANTS.RATE_LIMITS)
        ws_connect_mock.side_effect = Exception("TEST ERROR")

        self.websocket = MexcWebSocketAdaptor(throttler)

        with self.assertRaisesRegex(Exception, "TEST ERROR"):
            self.async_run_with_timeout(self.websocket.connect())

        self.assertTrue(
            self._is_logged("ERROR", "Websocket error: 'TEST ERROR'"))
コード例 #2
0
    def setUp(self) -> None:
        super().setUp()
        self.log_records = []
        throttler = AsyncThrottler(CONSTANTS.RATE_LIMITS)

        self.websocket = MexcWebSocketAdaptor(throttler)
        self.websocket.logger().setLevel(1)
        self.websocket.logger().addHandler(self)

        self.mocking_assistant = NetworkMockingAssistant()
        self.async_task: Optional[asyncio.Task] = None

        self.resume_test_event = asyncio.Event()
コード例 #3
0
 async def _create_websocket_connection(self) -> MexcWebSocketAdaptor:
     """
     Initialize WebSocket client for UserStreamDataSource
     """
     try:
         ws = MexcWebSocketAdaptor(throttler=self._throttler,
                                   shared_client=self._shared_client)
         await ws.connect()
         return ws
     except asyncio.CancelledError:
         raise
     except Exception as e:
         self.logger().network(
             f"Unexpected error occured connecting to {CONSTANTS.EXCHANGE_NAME} WebSocket API. "
             f"({e})")
         raise
コード例 #4
0
class MexcWebSocketUnitTests(unittest.TestCase):
    # the level is required to receive logs from the data source logger
    level = 0

    @classmethod
    def setUpClass(cls) -> None:
        super().setUpClass()
        cls.ev_loop = asyncio.get_event_loop()
        cls.trading_pairs = ["COINALPHA-HBOT"]

        cls.api_key = "someKey"
        cls.secret_key = "someSecretKey"
        cls.auth = MexcAuth(api_key=cls.api_key, secret_key=cls.secret_key)

    def setUp(self) -> None:
        super().setUp()
        self.log_records = []
        throttler = AsyncThrottler(CONSTANTS.RATE_LIMITS)

        self.websocket = MexcWebSocketAdaptor(throttler)
        self.websocket.logger().setLevel(1)
        self.websocket.logger().addHandler(self)

        self.mocking_assistant = NetworkMockingAssistant()
        self.async_task: Optional[asyncio.Task] = None

        self.resume_test_event = asyncio.Event()

    def tearDown(self) -> None:
        self.async_run_with_timeout(self.websocket.disconnect())
        self.async_task and self.async_task.cancel()
        super().tearDown()

    def handle(self, record):
        self.log_records.append(record)

    def _is_logged(self, log_level: str, message: str) -> bool:
        return any(
            record.levelname == log_level and record.getMessage() == message
            for record in self.log_records)

    def async_run_with_timeout(self, coroutine: Awaitable, timeout: float = 1):
        ret = self.ev_loop.run_until_complete(
            asyncio.wait_for(coroutine, timeout))
        return ret

    def resume_test_callback(self):
        self.resume_test_event.set()

    async def _iter_message(self):
        async for _ in self.websocket.iter_messages():
            self.resume_test_callback()
            self.async_task.cancel()

    @patch("aiohttp.ClientSession.ws_connect", new_callable=AsyncMock)
    def test_connect_raises_exception(self, ws_connect_mock):
        throttler = AsyncThrottler(CONSTANTS.RATE_LIMITS)
        ws_connect_mock.side_effect = Exception("TEST ERROR")

        self.websocket = MexcWebSocketAdaptor(throttler)

        with self.assertRaisesRegex(Exception, "TEST ERROR"):
            self.async_run_with_timeout(self.websocket.connect())

        self.assertTrue(
            self._is_logged("ERROR", "Websocket error: 'TEST ERROR'"))

    def test_disconnect(self):
        ws = AsyncMock()
        self.websocket._websocket = ws

        self.async_run_with_timeout(self.websocket.disconnect())

        self.assertEqual(1, ws.close.await_count)

    @patch("aiohttp.ClientSession.ws_connect", new_callable=AsyncMock)
    def test_subscribe_to_order_book_streams_raises_cancelled_exception(
            self, ws_connect_mock):
        ws_connect_mock.return_value = self.mocking_assistant.create_websocket_mock(
        )

        self.async_run_with_timeout(self.websocket.connect())

        ws_connect_mock.return_value.send_str.side_effect = asyncio.CancelledError

        with self.assertRaises(asyncio.CancelledError):
            self.async_run_with_timeout(
                self.websocket.subscribe_to_order_book_streams(
                    self.trading_pairs))

    @patch("aiohttp.ClientSession.ws_connect", new_callable=AsyncMock)
    def test_subscribe_to_order_book_streams_logs_exception(
            self, ws_connect_mock):
        ws_connect_mock.return_value = self.mocking_assistant.create_websocket_mock(
        )

        self.async_run_with_timeout(self.websocket.connect())

        ws_connect_mock.return_value.send_str.side_effect = Exception(
            "TEST ERROR")

        with self.assertRaisesRegex(Exception, "TEST ERROR"):
            self.async_run_with_timeout(
                self.websocket.subscribe_to_order_book_streams(
                    self.trading_pairs))

        self.assertTrue(
            self._is_logged(
                "ERROR",
                "Unexpected error occurred subscribing to order book trading and delta streams..."
            ))