|
14 | 14 |
|
15 | 15 | import pytest |
16 | 16 | from unittest import mock |
| 17 | +from google.cloud import _storage_v2 |
17 | 18 |
|
18 | | -from google.cloud.storage._experimental.asyncio.async_abstract_object_stream import ( |
19 | | - _AsyncAbstractObjectStream, |
20 | | -) |
21 | 19 | from google.cloud.storage._experimental.asyncio.async_read_object_stream import ( |
22 | 20 | _AsyncReadObjectStream, |
23 | 21 | ) |
24 | 22 |
|
25 | 23 |
|
26 | | -def test_inheritance(): |
27 | | - """Test that _AsyncReadObjectStream inherits from _AsyncAbstractObjectStream.""" |
28 | | - assert issubclass(_AsyncReadObjectStream, _AsyncAbstractObjectStream) |
29 | | - |
30 | | - |
31 | | -def test_init(): |
32 | | - """Test the constructor of _AsyncReadObjectStream.""" |
33 | | - mock_client = mock.Mock(name="client") |
| 24 | +@mock.patch( |
| 25 | + "google.cloud.storage._experimental.asyncio.async_read_object_stream.AsyncBidiRpc" |
| 26 | +) |
| 27 | +@mock.patch( |
| 28 | + "google.cloud.storage._experimental.asyncio.async_grpc_client.AsyncGrpcClient.grpc_client" |
| 29 | +) |
| 30 | +def test_init_with_bucket_object_generation(mock_client, mock_async_bidi_rpc): |
| 31 | + # initialize with bucket, object_name and generation number. & client. |
34 | 32 | bucket_name = "test-bucket" |
35 | 33 | object_name = "test-object" |
36 | | - generation = 12345 |
37 | | - read_handle = "some-handle" |
| 34 | + generation_number = 12345 |
| 35 | + mock_client._client._transport.bidi_read_object = "bidi_read_object_rpc" |
| 36 | + mock_client._client._transport._wrapped_methods = { |
| 37 | + "bidi_read_object_rpc": mock.sentinel.A |
| 38 | + } |
38 | 39 |
|
39 | | - # Test with all parameters |
40 | | - stream = _AsyncReadObjectStream( |
41 | | - mock_client, |
| 40 | + read_obj_stream = _AsyncReadObjectStream( |
| 41 | + client=mock_client, |
42 | 42 | bucket_name=bucket_name, |
43 | 43 | object_name=object_name, |
44 | | - generation_number=generation, |
45 | | - read_handle=read_handle, |
| 44 | + generation_number=generation_number, |
46 | 45 | ) |
47 | | - |
48 | | - assert stream.client is mock_client |
49 | | - assert stream.bucket_name == bucket_name |
50 | | - assert stream.object_name == object_name |
51 | | - assert stream.generation_number == generation |
52 | | - assert stream.read_handle == read_handle |
53 | | - |
54 | | - # Test with default parameters |
55 | | - stream_defaults = _AsyncReadObjectStream( |
56 | | - mock_client, bucket_name=bucket_name, object_name=object_name |
| 46 | + full_bucket_name = f"projects/_/buckets/{bucket_name}" |
| 47 | + first_bidi_read_req = _storage_v2.BidiReadObjectRequest( |
| 48 | + read_object_spec=_storage_v2.BidiReadObjectSpec( |
| 49 | + bucket=full_bucket_name, object=object_name |
| 50 | + ), |
| 51 | + ) |
| 52 | + mock_async_bidi_rpc.assert_called_once_with( |
| 53 | + mock.sentinel.A, |
| 54 | + initial_request=first_bidi_read_req, |
| 55 | + metadata=(("x-goog-request-params", f"bucket={full_bucket_name}"),), |
57 | 56 | ) |
58 | | - assert stream_defaults.client is mock_client |
59 | | - assert stream_defaults.bucket_name is bucket_name |
60 | | - assert stream_defaults.object_name is object_name |
61 | | - assert stream_defaults.generation_number is None |
62 | | - assert stream_defaults.read_handle is None |
| 57 | + assert read_obj_stream.socket_like_rpc is mock_async_bidi_rpc.return_value |
63 | 58 |
|
64 | 59 |
|
65 | 60 | def test_init_with_invalid_parameters(): |
66 | 61 | """Test the constructor of _AsyncReadObjectStream with invalid params.""" |
67 | 62 |
|
68 | 63 | with pytest.raises(ValueError): |
69 | 64 | _AsyncReadObjectStream(None, bucket_name=None, object_name=None) |
70 | | - |
71 | | - |
72 | | -@pytest.mark.asyncio |
73 | | -async def test_async_methods_are_awaitable(): |
74 | | - """Test that the async methods exist and are awaitable.""" |
75 | | - mock_client = mock.Mock(name="client") |
76 | | - stream = _AsyncReadObjectStream(mock_client, "bucket", "object") |
77 | | - |
78 | | - # These methods are currently empty, but we can test they are awaitable |
79 | | - # and don't raise exceptions. |
80 | | - try: |
81 | | - await stream.open() |
82 | | - await stream.close() |
83 | | - await stream.send(mock.Mock()) |
84 | | - await stream.recv() |
85 | | - except Exception as e: |
86 | | - pytest.fail(f"Async methods should be awaitable without errors. Raised: {e}") |
0 commit comments