Skip to content

Commit 9d912d6

Browse files
committed
fix
1 parent 1a44aae commit 9d912d6

File tree

1 file changed

+130
-10
lines changed

1 file changed

+130
-10
lines changed

tests/test_server_disconnected_retry.py

Lines changed: 130 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,8 @@ async def test_no_retry_with_proper_connection_close(
297297

298298

299299
@pytest.mark.asyncio
300-
async def test_post_xml_without_retry_decorator_fails(
301-
mock_etree_to_string: MagicMock,
302-
) -> None:
300+
@pytest.mark.usefixtures("mock_etree_to_string")
301+
async def test_post_xml_without_retry_decorator_fails() -> None:
303302
"""Test that without the retry decorator on post_xml, ServerDisconnectedError propagates."""
304303

305304
# Create a mock session
@@ -327,9 +326,8 @@ async def test_post_xml_without_retry_decorator_fails(
327326

328327

329328
@pytest.mark.asyncio
330-
async def test_post_xml_with_retry_decorator_succeeds(
331-
mock_etree_to_string: MagicMock,
332-
) -> None:
329+
@pytest.mark.usefixtures("mock_etree_to_string")
330+
async def test_post_xml_with_retry_decorator_succeeds() -> None:
333331
"""Test that with the retry decorator on post_xml, ServerDisconnectedError is retried."""
334332

335333
# Create a mock session
@@ -369,7 +367,8 @@ async def test_post_xml_with_retry_decorator_succeeds(
369367

370368

371369
@pytest.mark.asyncio
372-
async def test_post_xml_decorator_is_applied(mock_etree_to_string: MagicMock) -> None:
370+
@pytest.mark.usefixtures("mock_etree_to_string")
371+
async def test_post_xml_decorator_is_applied() -> None:
373372
"""Verify that the post_xml method has the retry decorator applied."""
374373

375374
# Check that AsyncTransportProtocolErrorHandler.post_xml has the decorator
@@ -408,9 +407,8 @@ async def test_post_xml_decorator_is_applied(mock_etree_to_string: MagicMock) ->
408407

409408

410409
@pytest.mark.asyncio
411-
async def test_retry_only_for_server_disconnected(
412-
mock_etree_to_string: MagicMock,
413-
) -> None:
410+
@pytest.mark.usefixtures("mock_etree_to_string")
411+
async def test_retry_only_for_server_disconnected() -> None:
414412
"""Test that retry only happens for ServerDisconnectedError, not other exceptions."""
415413

416414
mock_session = Mock(spec=ClientSession)
@@ -431,3 +429,125 @@ async def test_retry_only_for_server_disconnected(
431429

432430
# Should only be called once (no retry for other errors)
433431
assert mock_session.post.call_count == 1
432+
433+
434+
@pytest.mark.asyncio
435+
@pytest.mark.usefixtures("mock_etree_to_string")
436+
async def test_post_with_retry_decorator_succeeds() -> None:
437+
"""Test that with the retry decorator on post, ServerDisconnectedError is retried."""
438+
439+
# Create a mock session
440+
mock_session = Mock(spec=ClientSession)
441+
mock_session.timeout = Mock(total=30, sock_read=10)
442+
443+
# Create the transport with retry decorator
444+
transport = AsyncTransportProtocolErrorHandler(
445+
session=mock_session, verify_ssl=False
446+
)
447+
448+
# First call fails, second succeeds
449+
mock_response = Mock()
450+
mock_response.status = 200
451+
mock_response.headers = {}
452+
mock_response.cookies = {}
453+
mock_response.charset = "utf-8"
454+
mock_response.read = AsyncMock(return_value=b"<response/>")
455+
456+
mock_session.post = AsyncMock(
457+
side_effect=[
458+
aiohttp.ServerDisconnectedError("Server disconnected"),
459+
mock_response,
460+
]
461+
)
462+
463+
# This should succeed after retry
464+
result = await transport.post("http://example.com/onvif", "<test/>", {})
465+
466+
# Should be called twice (initial + retry)
467+
assert mock_session.post.call_count == 2
468+
assert result.status_code == 200
469+
470+
471+
@pytest.mark.asyncio
472+
async def test_get_with_retry_decorator_succeeds() -> None:
473+
"""Test that with the retry decorator on get, ServerDisconnectedError is retried."""
474+
475+
# Create a mock session
476+
mock_session = Mock(spec=ClientSession)
477+
mock_session.timeout = Mock(total=30, sock_read=10)
478+
479+
# Create the transport with retry decorator
480+
transport = AsyncTransportProtocolErrorHandler(
481+
session=mock_session, verify_ssl=False
482+
)
483+
484+
# First call fails, second succeeds
485+
mock_response = Mock()
486+
mock_response.status = 200
487+
mock_response.headers = {}
488+
mock_response.cookies = {}
489+
mock_response.charset = "utf-8"
490+
mock_response.read = AsyncMock(return_value=b"<response/>")
491+
492+
mock_session.get = AsyncMock(
493+
side_effect=[
494+
aiohttp.ServerDisconnectedError("Server disconnected"),
495+
mock_response,
496+
]
497+
)
498+
499+
# This should succeed after retry
500+
result = await transport.get("http://example.com/onvif")
501+
502+
# Should be called twice (initial + retry)
503+
assert mock_session.get.call_count == 2
504+
assert result.status_code == 200
505+
506+
507+
@pytest.mark.asyncio
508+
@pytest.mark.usefixtures("mock_etree_to_string")
509+
async def test_post_without_retry_decorator_fails() -> None:
510+
"""Test that without the retry decorator on post, ServerDisconnectedError propagates."""
511+
512+
# Create a mock session
513+
mock_session = Mock(spec=ClientSession)
514+
mock_session.timeout = Mock(total=30, sock_read=10)
515+
516+
# Create the base transport (without retry decorator)
517+
transport = AIOHTTPTransport(session=mock_session, verify_ssl=False)
518+
519+
# Make session.post raise ServerDisconnectedError
520+
mock_session.post = AsyncMock(
521+
side_effect=aiohttp.ServerDisconnectedError("Server disconnected")
522+
)
523+
524+
# This should raise ServerDisconnectedError without retry
525+
with pytest.raises(aiohttp.ServerDisconnectedError):
526+
await transport.post("http://example.com/onvif", "<test/>", {})
527+
528+
# Should only be called once (no retry)
529+
assert mock_session.post.call_count == 1
530+
531+
532+
@pytest.mark.asyncio
533+
async def test_get_without_retry_decorator_fails() -> None:
534+
"""Test that without the retry decorator on get, ServerDisconnectedError propagates."""
535+
536+
# Create a mock session
537+
mock_session = Mock(spec=ClientSession)
538+
mock_session.timeout = Mock(total=30, sock_read=10)
539+
540+
# Create the base transport (without retry decorator)
541+
transport = AIOHTTPTransport(session=mock_session, verify_ssl=False)
542+
543+
# Make session.get raise ServerDisconnectedError
544+
mock_session.get = AsyncMock(
545+
side_effect=aiohttp.ServerDisconnectedError("Server disconnected")
546+
)
547+
548+
# This should raise ServerDisconnectedError without retry
549+
with pytest.raises(aiohttp.ServerDisconnectedError):
550+
await transport.get("http://example.com/onvif")
551+
552+
# Should only be called once (no retry)
553+
assert mock_session.get.call_count == 1

0 commit comments

Comments
 (0)