Skip to content

Commit 7d17922

Browse files
authored
feat(zb-experimental): implement state_lookup (#1617)
feat(zb-experimental): implement state_lookup
1 parent fdd0a50 commit 7d17922

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

google/cloud/storage/_experimental/asyncio/async_appendable_object_writer.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
2323
"""
2424
from typing import Optional
25+
from google.cloud import _storage_v2
2526
from google.cloud.storage._experimental.asyncio.async_grpc_client import (
2627
AsyncGrpcClient,
2728
)
@@ -112,9 +113,16 @@ def __init__(
112113
self.offset: Optional[int] = None
113114
self.persisted_size: Optional[int] = None
114115

115-
async def state_lookup(self):
116+
async def state_lookup(self) -> int:
116117
"""Returns the persisted_size."""
117-
raise NotImplementedError("state_lookup is not implemented yet.")
118+
await self.write_obj_stream.send(
119+
_storage_v2.BidiWriteObjectRequest(
120+
state_lookup=True,
121+
)
122+
)
123+
response = await self.write_obj_stream.recv()
124+
self.persisted_size = response.persisted_size
125+
return self.persisted_size
118126

119127
async def open(self) -> None:
120128
"""Opens the underlying bidi-gRPC stream."""

tests/unit/asyncio/test_async_appendable_object_writer.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,14 @@
1818
from google.cloud.storage._experimental.asyncio.async_appendable_object_writer import (
1919
AsyncAppendableObjectWriter,
2020
)
21+
from google.cloud import _storage_v2
22+
2123

2224
BUCKET = "test-bucket"
2325
OBJECT = "test-object"
2426
GENERATION = 123
2527
WRITE_HANDLE = b"test-write-handle"
28+
PERSISTED_SIZE = 456
2629

2730

2831
@pytest.fixture
@@ -82,14 +85,37 @@ def test_init_with_optional_args(mock_write_object_stream, mock_client):
8285
)
8386

8487

88+
@pytest.mark.asyncio
89+
@mock.patch(
90+
"google.cloud.storage._experimental.asyncio.async_appendable_object_writer._AsyncWriteObjectStream"
91+
)
92+
async def test_state_lookup(mock_write_object_stream, mock_client):
93+
"""Test state_lookup method."""
94+
# Arrange
95+
writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT)
96+
mock_stream = mock_write_object_stream.return_value
97+
mock_stream.send = mock.AsyncMock()
98+
mock_stream.recv = mock.AsyncMock(
99+
return_value=_storage_v2.BidiWriteObjectResponse(persisted_size=PERSISTED_SIZE)
100+
)
101+
102+
expected_request = _storage_v2.BidiWriteObjectRequest(state_lookup=True)
103+
104+
# Act
105+
response = await writer.state_lookup()
106+
107+
# Assert
108+
mock_stream.send.assert_awaited_once_with(expected_request)
109+
mock_stream.recv.assert_awaited_once()
110+
assert writer.persisted_size == PERSISTED_SIZE
111+
assert response == PERSISTED_SIZE
112+
113+
85114
@pytest.mark.asyncio
86115
async def test_unimplemented_methods_raise_error(mock_client):
87116
"""Test that all currently unimplemented methods raise NotImplementedError."""
88117
writer = AsyncAppendableObjectWriter(mock_client, BUCKET, OBJECT)
89118

90-
with pytest.raises(NotImplementedError):
91-
await writer.state_lookup()
92-
93119
with pytest.raises(NotImplementedError):
94120
await writer.open()
95121

0 commit comments

Comments
 (0)