@@ -297,9 +297,8 @@ async def test_no_retry_with_proper_connection_close(
297
297
298
298
299
299
@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 :
303
302
"""Test that without the retry decorator on post_xml, ServerDisconnectedError propagates."""
304
303
305
304
# Create a mock session
@@ -327,9 +326,8 @@ async def test_post_xml_without_retry_decorator_fails(
327
326
328
327
329
328
@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 :
333
331
"""Test that with the retry decorator on post_xml, ServerDisconnectedError is retried."""
334
332
335
333
# Create a mock session
@@ -369,7 +367,8 @@ async def test_post_xml_with_retry_decorator_succeeds(
369
367
370
368
371
369
@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 :
373
372
"""Verify that the post_xml method has the retry decorator applied."""
374
373
375
374
# 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) ->
408
407
409
408
410
409
@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 :
414
412
"""Test that retry only happens for ServerDisconnectedError, not other exceptions."""
415
413
416
414
mock_session = Mock (spec = ClientSession )
@@ -431,3 +429,125 @@ async def test_retry_only_for_server_disconnected(
431
429
432
430
# Should only be called once (no retry for other errors)
433
431
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