@@ -477,7 +477,7 @@ async def make_request(client_session: ClientSession):
477477 tg .start_soon (mock_server )
478478 tg .start_soon (make_request , client_session )
479479
480- with anyio .fail_after (2 ):
480+ with anyio .fail_after (2 ): # pragma: no branch
481481 await ev_server_received_error .wait ()
482482
483483 assert len (server_error_holder ) == 1
@@ -508,3 +508,22 @@ async def make_request(client_session: ClientSession):
508508 ):
509509 tg .start_soon (mock_server , client_session )
510510 tg .start_soon (make_request , client_session )
511+
512+
513+ @pytest .mark .anyio
514+ async def test_receive_loop_handles_closed_response_stream ():
515+ """Cover receive loop cleanup when a response stream is already closed."""
516+ async with create_client_server_memory_streams () as (client_streams , server_streams ):
517+ client_read , client_write = client_streams
518+ _server_read , server_write = server_streams
519+
520+ async with ClientSession (read_stream = client_read , write_stream = client_write ) as client_session :
521+ response_stream , _ = anyio .create_memory_object_stream [JSONRPCResponse | JSONRPCError ](1 )
522+ await response_stream .aclose ()
523+ client_session ._response_streams [0 ] = response_stream
524+
525+ server_write .close ()
526+
527+ with anyio .fail_after (2 ): # pragma: no branch
528+ while client_session ._response_streams :
529+ await anyio .sleep (0 )
0 commit comments