fix mocking

This commit is contained in:
J. Nick Koston 2023-12-09 17:52:46 -10:00
parent 4871bcb651
commit 3da6e9dcee
No known key found for this signature in database
5 changed files with 84 additions and 37 deletions

View File

@ -134,7 +134,9 @@ async def plaintext_connect_task_no_login(
transport = MagicMock()
connected = asyncio.Event()
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -151,7 +153,9 @@ async def plaintext_connect_task_no_login_with_expected_name(
transport = MagicMock()
connected = asyncio.Event()
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
event_loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -170,7 +174,9 @@ async def plaintext_connect_task_with_login(
transport = MagicMock()
connected = asyncio.Event()
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
event_loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -193,11 +199,15 @@ async def api_client(
password=None,
)
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
event_loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
), patch("aioesphomeapi.client.APIConnection", PatchableAPIConnection):
), patch(
"aioesphomeapi.client.APIConnection", PatchableAPIConnection
):
connect_task = asyncio.create_task(connect_client(client, login=False))
await connected.wait()
conn = client._connection

View File

@ -198,10 +198,10 @@ async def test_finish_connection_wraps_exceptions_as_unhandled_api_error() -> No
"""Verify finish_connect re-wraps exceptions as UnhandledAPIError."""
cli = APIClient("1.2.3.4", 1234, None)
loop = asyncio.get_event_loop()
with patch(
"aioesphomeapi.client.APIConnection", PatchableAPIConnection
), patch.object(loop, "sock_connect"):
asyncio.get_event_loop()
with patch("aioesphomeapi.client.APIConnection", PatchableAPIConnection), patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
):
await cli.start_connection()
with patch.object(
@ -217,9 +217,12 @@ async def test_finish_connection_wraps_exceptions_as_unhandled_api_error() -> No
async def test_connection_released_if_connecting_is_cancelled() -> None:
"""Verify connection is unset if connecting is cancelled."""
cli = APIClient("1.2.3.4", 1234, None)
loop = asyncio.get_event_loop()
asyncio.get_event_loop()
with patch.object(loop, "sock_connect", side_effect=partial(asyncio.sleep, 1)):
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection",
side_effect=partial(asyncio.sleep, 1),
):
start_task = asyncio.create_task(cli.start_connection())
await asyncio.sleep(0)
assert cli._connection is not None
@ -229,9 +232,9 @@ async def test_connection_released_if_connecting_is_cancelled() -> None:
await start_task
assert cli._connection is None
with patch(
"aioesphomeapi.client.APIConnection", PatchableAPIConnection
), patch.object(loop, "sock_connect"):
with patch("aioesphomeapi.client.APIConnection", PatchableAPIConnection), patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
):
await cli.start_connection()
await asyncio.sleep(0)
@ -252,8 +255,9 @@ async def test_request_while_handshaking(event_loop) -> None:
pass
cli = PatchableApiClient("host", 1234, None)
with patch.object(
event_loop, "sock_connect", side_effect=partial(asyncio.sleep, 1)
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection",
side_effect=partial(asyncio.sleep, 1),
), patch.object(cli, "finish_connection"):
connect_task = asyncio.create_task(cli.connect())

View File

@ -241,14 +241,15 @@ async def test_start_connection_times_out(
conn: APIConnection, resolve_host, socket_socket
):
"""Test handling of start connection timing out."""
loop = asyncio.get_event_loop()
asyncio.get_event_loop()
async def _mock_socket_connect(*args, **kwargs):
await asyncio.sleep(500)
with patch.object(loop, "sock_connect", side_effect=_mock_socket_connect), patch(
"aioesphomeapi.connection.TCP_CONNECT_TIMEOUT", 0.0
):
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection",
side_effect=_mock_socket_connect,
), patch("aioesphomeapi.connection.TCP_CONNECT_TIMEOUT", 0.0):
connect_task = asyncio.create_task(connect(conn, login=False))
await asyncio.sleep(0)
@ -267,9 +268,12 @@ async def test_start_connection_os_error(
conn: APIConnection, resolve_host, socket_socket
):
"""Test handling of start connection has an OSError."""
loop = asyncio.get_event_loop()
asyncio.get_event_loop()
with patch.object(loop, "sock_connect", side_effect=OSError("Socket error")):
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection",
side_effect=OSError("Socket error"),
):
connect_task = asyncio.create_task(connect(conn, login=False))
await asyncio.sleep(0)
with pytest.raises(APIConnectionError, match="Socket error"):
@ -284,9 +288,12 @@ async def test_start_connection_is_cancelled(
conn: APIConnection, resolve_host, socket_socket
):
"""Test handling of start connection is cancelled."""
loop = asyncio.get_event_loop()
asyncio.get_event_loop()
with patch.object(loop, "sock_connect", side_effect=asyncio.CancelledError):
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection",
side_effect=asyncio.CancelledError,
):
connect_task = asyncio.create_task(connect(conn, login=False))
await asyncio.sleep(0)
with pytest.raises(APIConnectionError, match="Starting connection cancelled"):
@ -559,7 +566,9 @@ async def test_connect_resolver_times_out(
with patch(
"aioesphomeapi.host_resolver.async_resolve_host",
side_effect=asyncio.TimeoutError,
), patch.object(event_loop, "sock_connect"), patch.object(
), patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
event_loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -590,7 +599,9 @@ async def test_disconnect_fails_to_send_response(
nonlocal expected_disconnect
expected_disconnect = _expected_disconnect
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -640,7 +651,9 @@ async def test_disconnect_success_case(
nonlocal expected_disconnect
expected_disconnect = _expected_disconnect
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),

View File

@ -69,9 +69,13 @@ async def test_log_runner(event_loop: asyncio.AbstractEventLoop, conn: APIConnec
await original_subscribe_logs(*args, **kwargs)
subscribed.set()
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop, "create_connection", side_effect=_create_mock_transport_protocol
), patch.object(cli, "subscribe_logs", _wait_subscribe_cli):
), patch.object(
cli, "subscribe_logs", _wait_subscribe_cli
):
stop = await async_run(cli, on_log, aio_zeroconf_instance=async_zeroconf)
await connected.wait()
protocol = cli._connection._frame_helper
@ -135,9 +139,13 @@ async def test_log_runner_reconnects_on_disconnect(
await original_subscribe_logs(*args, **kwargs)
subscribed.set()
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop, "create_connection", side_effect=_create_mock_transport_protocol
), patch.object(cli, "subscribe_logs", _wait_subscribe_cli):
), patch.object(
cli, "subscribe_logs", _wait_subscribe_cli
):
stop = await async_run(cli, on_log, aio_zeroconf_instance=async_zeroconf)
await connected.wait()
protocol = cli._connection._frame_helper
@ -214,7 +222,9 @@ async def test_log_runner_reconnects_on_subscribe_failure(
with patch.object(
cli, "disconnect", partial(cli.disconnect, force=True)
), patch.object(cli, "subscribe_logs", _wait_and_fail_subscribe_cli):
with patch.object(loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop, "create_connection", side_effect=_create_mock_transport_protocol
):
stop = await async_run(cli, on_log, aio_zeroconf_instance=async_zeroconf)
@ -227,9 +237,13 @@ async def test_log_runner_reconnects_on_subscribe_failure(
assert cli._connection is None
with patch.object(loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop, "create_connection", side_effect=_create_mock_transport_protocol
), patch.object(cli, "subscribe_logs"):
), patch.object(
cli, "subscribe_logs"
):
connected.clear()
await asyncio.sleep(0)
async_fire_time_changed(

View File

@ -710,7 +710,9 @@ async def test_handling_unexpected_disconnect(event_loop: asyncio.AbstractEventL
name="fake",
)
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -726,7 +728,9 @@ async def test_handling_unexpected_disconnect(event_loop: asyncio.AbstractEventL
assert cli._connection.is_connected is True
await asyncio.sleep(0)
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),
@ -785,7 +789,9 @@ async def test_backoff_on_encryption_error(
name="fake",
)
with patch.object(event_loop, "sock_connect"), patch.object(
with patch(
"aioesphomeapi.connection.aiohappyeyeballs.start_connection"
), patch.object(
loop,
"create_connection",
side_effect=partial(_create_mock_transport_protocol, transport, connected),