async def test_when_no_new_available_releases(self, http_settings, proxy_settings): data = { "releases": { "0.1.0": [{ "yanked": False }], "1.0.0": [{ "yanked": False }], "1.0.0.dev1": [{ "yanked": False }], "1.0.1": [{ "yanked": True }], } } _request = hikari_test_helpers.AsyncContextManagerMock() _request.json = mock.AsyncMock(return_value=data) _client_session = hikari_test_helpers.AsyncContextManagerMock() _client_session.get = mock.Mock(return_value=_request) stack = contextlib.ExitStack() logger = stack.enter_context(mock.patch.object(ux, "_LOGGER")) create_client_session = stack.enter_context( mock.patch.object(net, "create_client_session", return_value=_client_session)) create_tcp_connector = stack.enter_context( mock.patch.object(net, "create_tcp_connector")) stack.enter_context( mock.patch.object(_about, "__version__", new="1.0.0")) stack.enter_context( mock.patch.object(_about, "__git_sha1__", new="1234567890")) with stack: await ux.check_for_updates(http_settings=http_settings, proxy_settings=proxy_settings) logger.debug.assert_not_called() logger.info.assert_not_called() create_tcp_connector.assert_called_once_with( dns_cache=False, limit=1, http_settings=http_settings) create_client_session.assert_called_once_with( connector=create_tcp_connector(), connector_owner=True, http_settings=http_settings, raise_for_status=True, trust_env=proxy_settings.trust_env, ) _client_session.get.assert_called_once_with( "https://pypi.org/pypi/hikari/json", allow_redirects=http_settings.max_redirects is not None, max_redirects=http_settings.max_redirects, proxy=proxy_settings.url, proxy_headers=proxy_settings.all_headers, )
async def test_connect_when_error_connecting(self, http_settings, proxy_settings): mock_client_session = hikari_test_helpers.AsyncContextManagerMock() mock_client_session.ws_connect = mock.MagicMock( side_effect=aiohttp.ClientConnectionError("some error")) stack = contextlib.ExitStack() sleep = stack.enter_context(mock.patch.object(asyncio, "sleep")) stack.enter_context( mock.patch.object(aiohttp, "ClientSession", return_value=mock_client_session)) stack.enter_context(mock.patch.object(aiohttp, "TCPConnector")) stack.enter_context(mock.patch.object(aiohttp, "ClientTimeout")) stack.enter_context( pytest.raises( errors.GatewayError, match= r"Failed to connect to Discord: ClientConnectionError\('some error'\)" )) logger = mock.Mock() log_filterer = mock.Mock() with stack: async with shard._GatewayTransport.connect( http_settings=http_settings, proxy_settings=proxy_settings, logger=logger, url="https://some.url", log_filterer=log_filterer, ): pass sleep.assert_awaited_once_with(0.25) mock_client_session.assert_used_once()
async def test_connect_when_unexpected_error_after_connecting( self, http_settings, proxy_settings): class MockWS(hikari_test_helpers.AsyncContextManagerMock, shard._GatewayTransport): closed = False send_close = mock.AsyncMock() sent_close = False def __init__(self): pass mock_websocket = MockWS() mock_client_session = hikari_test_helpers.AsyncContextManagerMock() mock_client_session.ws_connect = mock.MagicMock( return_value=mock_websocket) stack = contextlib.ExitStack() sleep = stack.enter_context(mock.patch.object(asyncio, "sleep")) stack.enter_context( mock.patch.object(aiohttp, "ClientSession", return_value=mock_client_session)) stack.enter_context(mock.patch.object(aiohttp, "TCPConnector")) stack.enter_context(mock.patch.object(aiohttp, "ClientTimeout")) stack.enter_context( pytest.raises(errors.GatewayError, match="Unexpected ValueError: testing")) logger = mock.Mock() log_filterer = mock.Mock() with stack: async with shard._GatewayTransport.connect( http_settings=http_settings, proxy_settings=proxy_settings, logger=logger, url="https://some.url", log_filterer=log_filterer, ): hikari_test_helpers.raiser(ValueError("testing")) mock_websocket.send_close.assert_awaited_once_with( code=errors.ShardCloseCode.UNEXPECTED_CONDITION, message=b"unexpected fatal client error :-(") sleep.assert_awaited_once_with(0.25) mock_client_session.assert_used_once() mock_websocket.assert_used_once()
async def test_connect_when_no_error_and_not_closing( self, http_settings, proxy_settings): class MockWS(hikari_test_helpers.AsyncContextManagerMock, shard._GatewayTransport): closed = False _closing = False sent_close = False send_close = mock.AsyncMock() def __init__(self): pass mock_websocket = MockWS() mock_client_session = hikari_test_helpers.AsyncContextManagerMock() mock_client_session.ws_connect = mock.MagicMock( return_value=mock_websocket) stack = contextlib.ExitStack() sleep = stack.enter_context(mock.patch.object(asyncio, "sleep")) stack.enter_context( mock.patch.object(aiohttp, "ClientSession", return_value=mock_client_session)) stack.enter_context(mock.patch.object(aiohttp, "TCPConnector")) stack.enter_context(mock.patch.object(aiohttp, "ClientTimeout")) logger = mock.Mock() log_filterer = mock.Mock() with stack: async with shard._GatewayTransport.connect( http_settings=http_settings, proxy_settings=proxy_settings, logger=logger, url="https://some.url", log_filterer=log_filterer, ): pass mock_websocket.send_close.assert_awaited_once_with( code=shard._RESUME_CLOSE_CODE, message=b"client is shutting down") sleep.assert_awaited_once_with(0.25) mock_client_session.assert_used_once() mock_websocket.assert_used_once()
async def test_connect_when_handshake_error_with_unknown_reason( self, http_settings, proxy_settings): mock_client_session = hikari_test_helpers.AsyncContextManagerMock() mock_client_session.ws_connect = mock.MagicMock( side_effect=aiohttp.WSServerHandshakeError(status=123, message="some error", request_info=None, history=None)) stack = contextlib.ExitStack() sleep = stack.enter_context(mock.patch.object(asyncio, "sleep")) stack.enter_context( mock.patch.object(aiohttp, "ClientSession", return_value=mock_client_session)) stack.enter_context(mock.patch.object(aiohttp, "TCPConnector")) stack.enter_context(mock.patch.object(aiohttp, "ClientTimeout")) stack.enter_context( pytest.raises( errors.GatewayError, match= (r"Failed to connect to Discord: " r"WSServerHandshakeError\(None, None, status=123, message='some error'\)" ), )) logger = mock.Mock() log_filterer = mock.Mock() with stack: async with shard._GatewayTransport.connect( http_settings=http_settings, proxy_settings=proxy_settings, logger=logger, url="https://some.url", log_filterer=log_filterer, ): pass sleep.assert_awaited_once_with(0.25) mock_client_session.assert_used_once()
async def test_connect_yields_websocket(self, http_settings, proxy_settings): class MockWS(hikari_test_helpers.AsyncContextManagerMock, shard._GatewayTransport): closed = True send_close = mock.AsyncMock() sent_close = False def __init__(self): pass mock_websocket = MockWS() mock_client_session = hikari_test_helpers.AsyncContextManagerMock() mock_client_session.ws_connect = mock.MagicMock( return_value=mock_websocket) stack = contextlib.ExitStack() sleep = stack.enter_context(mock.patch.object(asyncio, "sleep")) client_session = stack.enter_context( mock.patch.object(aiohttp, "ClientSession", return_value=mock_client_session)) tcp_connector = stack.enter_context( mock.patch.object(aiohttp, "TCPConnector")) client_timeout = stack.enter_context( mock.patch.object(aiohttp, "ClientTimeout")) logger = mock.Mock() log_filterer = mock.Mock() with stack: async with shard._GatewayTransport.connect( http_settings=http_settings, proxy_settings=proxy_settings, logger=logger, url="https://some.url", log_filterer=log_filterer, ) as ws: assert ws.logger is logger tcp_connector.assert_called_once_with( limit=1, ttl_dns_cache=10, use_dns_cache=False, ssl_context=http_settings.ssl, enable_cleanup_closed=http_settings.enable_cleanup_closed, force_close=http_settings.force_close_transports, ) client_timeout.assert_called_once_with( total=http_settings.timeouts.total, connect=http_settings.timeouts.acquire_and_connect, sock_read=http_settings.timeouts.request_socket_read, sock_connect=http_settings.timeouts.request_socket_connect, ) client_session.assert_called_once_with( connector=tcp_connector(), connector_owner=True, raise_for_status=True, timeout=client_timeout(), trust_env=proxy_settings.trust_env, version=aiohttp.HttpVersion11, ws_response_class=shard._GatewayTransport, ) mock_client_session.ws_connect.assert_called_once_with( max_msg_size=0, proxy=proxy_settings.url, proxy_headers=proxy_settings.headers, url="https://some.url", ) mock_client_session.assert_used_once() mock_websocket.assert_used_once() sleep.assert_awaited_once_with(0.25)