2525OBJECT = "my-object"
2626GENERATION = 12345
2727WRITE_HANDLE = b"test-handle"
28+ WRITE_HANDLE_PROTO = _storage_v2 .BidiWriteHandle (handle = WRITE_HANDLE )
2829
2930
3031@pytest .fixture
@@ -56,7 +57,7 @@ async def instantiate_write_obj_stream(mock_client, mock_cls_async_bidi_rpc, ope
5657 mock_response .resource = mock .MagicMock (spec = _storage_v2 .Object )
5758 mock_response .resource .generation = GENERATION
5859 mock_response .resource .size = 0
59- mock_response .write_handle = WRITE_HANDLE
60+ mock_response .write_handle = WRITE_HANDLE_PROTO
6061 socket_like_rpc .recv = AsyncMock (return_value = mock_response )
6162
6263 write_obj_stream = _AsyncWriteObjectStream (mock_client , BUCKET , OBJECT )
@@ -90,18 +91,16 @@ def test_async_write_object_stream_init(mock_client):
9091
9192def test_async_write_object_stream_init_with_generation_and_handle (mock_client ):
9293 """Test the constructor with optional arguments."""
93- generation = 12345
94- write_handle = b"test-handle"
9594 stream = _AsyncWriteObjectStream (
9695 mock_client ,
9796 BUCKET ,
9897 OBJECT ,
99- generation_number = generation ,
100- write_handle = write_handle ,
98+ generation_number = GENERATION ,
99+ write_handle = WRITE_HANDLE_PROTO ,
101100 )
102101
103- assert stream .generation_number == generation
104- assert stream .write_handle == write_handle
102+ assert stream .generation_number == GENERATION
103+ assert stream .write_handle == WRITE_HANDLE_PROTO
105104
106105
107106def test_async_write_object_stream_init_raises_value_error ():
@@ -131,7 +130,7 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client):
131130 mock_response .resource = mock .MagicMock (spec = _storage_v2 .Object )
132131 mock_response .resource .generation = GENERATION
133132 mock_response .resource .size = 0
134- mock_response .write_handle = WRITE_HANDLE
133+ mock_response .write_handle = WRITE_HANDLE_PROTO
135134 socket_like_rpc .recv = mock .AsyncMock (return_value = mock_response )
136135
137136 stream = _AsyncWriteObjectStream (mock_client , BUCKET , OBJECT )
@@ -144,7 +143,7 @@ async def test_open_for_new_object(mock_async_bidi_rpc, mock_client):
144143 socket_like_rpc .open .assert_called_once ()
145144 socket_like_rpc .recv .assert_called_once ()
146145 assert stream .generation_number == GENERATION
147- assert stream .write_handle == WRITE_HANDLE
146+ assert stream .write_handle == WRITE_HANDLE_PROTO
148147 assert stream .persisted_size == 0
149148
150149
@@ -163,7 +162,7 @@ async def test_open_for_new_object_with_generation_zero(mock_async_bidi_rpc, moc
163162 mock_response .resource = mock .MagicMock (spec = _storage_v2 .Object )
164163 mock_response .resource .generation = GENERATION
165164 mock_response .resource .size = 0
166- mock_response .write_handle = WRITE_HANDLE
165+ mock_response .write_handle = WRITE_HANDLE_PROTO
167166 socket_like_rpc .recv = mock .AsyncMock (return_value = mock_response )
168167
169168 stream = _AsyncWriteObjectStream (mock_client , BUCKET , OBJECT , generation_number = 0 )
@@ -180,7 +179,7 @@ async def test_open_for_new_object_with_generation_zero(mock_async_bidi_rpc, moc
180179 socket_like_rpc .open .assert_called_once ()
181180 socket_like_rpc .recv .assert_called_once ()
182181 assert stream .generation_number == GENERATION
183- assert stream .write_handle == WRITE_HANDLE
182+ assert stream .write_handle == WRITE_HANDLE_PROTO
184183 assert stream .persisted_size == 0
185184
186185
@@ -199,7 +198,7 @@ async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client):
199198 mock_response .resource = mock .MagicMock (spec = _storage_v2 .Object )
200199 mock_response .resource .size = 1024
201200 mock_response .resource .generation = GENERATION
202- mock_response .write_handle = WRITE_HANDLE
201+ mock_response .write_handle = WRITE_HANDLE_PROTO
203202 socket_like_rpc .recv = mock .AsyncMock (return_value = mock_response )
204203
205204 stream = _AsyncWriteObjectStream (
@@ -214,7 +213,7 @@ async def test_open_for_existing_object(mock_async_bidi_rpc, mock_client):
214213 socket_like_rpc .open .assert_called_once ()
215214 socket_like_rpc .recv .assert_called_once ()
216215 assert stream .generation_number == GENERATION
217- assert stream .write_handle == WRITE_HANDLE
216+ assert stream .write_handle == WRITE_HANDLE_PROTO
218217 assert stream .persisted_size == 1024
219218
220219
@@ -233,7 +232,7 @@ async def test_open_when_already_open_raises_error(mock_async_bidi_rpc, mock_cli
233232 mock_response .resource = mock .MagicMock (spec = _storage_v2 .Object )
234233 mock_response .resource .generation = GENERATION
235234 mock_response .resource .size = 0
236- mock_response .write_handle = WRITE_HANDLE
235+ mock_response .write_handle = WRITE_HANDLE_PROTO
237236 socket_like_rpc .recv = mock .AsyncMock (return_value = mock_response )
238237
239238 stream = _AsyncWriteObjectStream (mock_client , BUCKET , OBJECT )
@@ -315,6 +314,41 @@ async def test_open_raises_error_on_missing_write_handle(
315314 await stream .open ()
316315
317316
317+ @pytest .mark .asyncio
318+ @mock .patch (
319+ "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc"
320+ )
321+ async def test_open_raises_error_on_missing_persisted_size_with_write_handle (
322+ mock_async_bidi_rpc , mock_client
323+ ):
324+ """Test that open raises ValueError if persisted_size is None when opened via write_handle."""
325+ socket_like_rpc = mock .AsyncMock ()
326+ mock_async_bidi_rpc .return_value = socket_like_rpc
327+
328+ #
329+ mock_response = mock .MagicMock (spec = _storage_v2 .BidiWriteObjectResponse )
330+ mock_response .persisted_size = None # This is the key part of the test
331+ mock_response .write_handle = (
332+ WRITE_HANDLE_PROTO # Ensure write_handle is present to avoid that error
333+ )
334+ socket_like_rpc .recv .return_value = mock_response
335+
336+ # ACT
337+ stream = _AsyncWriteObjectStream (
338+ mock_client ,
339+ BUCKET ,
340+ OBJECT ,
341+ write_handle = WRITE_HANDLE_PROTO ,
342+ generation_number = GENERATION ,
343+ )
344+
345+ with pytest .raises (
346+ ValueError ,
347+ match = "Failed to obtain persisted_size after opening the stream via write_handle" ,
348+ ):
349+ await stream .open ()
350+
351+
318352@pytest .mark .asyncio
319353@mock .patch (
320354 "google.cloud.storage._experimental.asyncio.async_write_object_stream.AsyncBidiRpc"
@@ -452,4 +486,4 @@ async def test_requests_done(mock_cls_async_bidi_rpc, mock_client):
452486
453487 # Assert
454488 write_obj_stream .socket_like_rpc .send .assert_called_once_with (None )
455- write_obj_stream .socket_like_rpc .recv .assert_called_once ()
489+ write_obj_stream .socket_like_rpc .recv .assert_called_once ()
0 commit comments