@@ -401,3 +401,44 @@ async def test_download_ranges_raises_on_checksum_mismatch(
401401
402402 assert "Checksum mismatch" in str (exc_info .value )
403403 mock_checksum_class .assert_called_once_with (test_data )
404+
405+ @mock .patch (
406+ "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.open" ,
407+ new_callable = AsyncMock ,
408+ )
409+ @mock .patch (
410+ "google.cloud.storage._experimental.asyncio.async_multi_range_downloader.AsyncMultiRangeDownloader.close" ,
411+ new_callable = AsyncMock ,
412+ )
413+ @mock .patch (
414+ "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client"
415+ )
416+ @pytest .mark .asyncio
417+ async def test_async_context_manager_calls_open_and_close (
418+ self , mock_grpc_client , mock_close , mock_open
419+ ):
420+ # Arrange
421+ mrd = AsyncMultiRangeDownloader (
422+ mock_grpc_client , _TEST_BUCKET_NAME , _TEST_OBJECT_NAME
423+ )
424+
425+ # To simulate the behavior of open and close changing the stream state
426+ async def open_side_effect ():
427+ mrd ._is_stream_open = True
428+
429+ async def close_side_effect ():
430+ mrd ._is_stream_open = False
431+
432+ mock_open .side_effect = open_side_effect
433+ mock_close .side_effect = close_side_effect
434+ mrd ._is_stream_open = False
435+
436+ # Act
437+ async with mrd as downloader :
438+ # Assert
439+ mock_open .assert_called_once ()
440+ assert downloader == mrd
441+ assert mrd .is_stream_open
442+
443+ mock_close .assert_called_once ()
444+ assert not mrd .is_stream_open
0 commit comments