Skip to content

Commit 1c65d43

Browse files
committed
revert: remove other api-core changes
1 parent 695e6bf commit 1c65d43

5 files changed

Lines changed: 73 additions & 40 deletions

File tree

packages/google-api-core/.coveragerc

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@
22
branch = True
33

44
[report]
5-
fail_under = 99
5+
fail_under = 100
66
show_missing = True
7+
omit =
8+
tests/*
9+
*/tests/*
710
exclude_lines =
811
# Re-enable the standard pragma
912
pragma: NO COVER

packages/google-api-core/google/api_core/gapic_v1/requests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ def setup_request_id(
6565
setattr(request, field_name, str(uuid.uuid4()))
6666
except (AttributeError, ValueError):
6767
# Proto-plus messages or other objects
68-
if not getattr(request, field_name, None):
68+
if getattr(request, field_name, None) is None:
6969
setattr(request, field_name, str(uuid.uuid4()))
7070
else:
7171
if not getattr(request, field_name, None):

packages/google-api-core/tests/conftest.py

Lines changed: 0 additions & 31 deletions
This file was deleted.

packages/google-api-core/tests/unit/gapic/test_requests.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,6 @@ def __init__(self, **kwargs):
2727
for k, v in kwargs.items():
2828
setattr(self, k, v)
2929

30-
def __contains__(self, key):
31-
return hasattr(self, key)
32-
3330

3431
class MockProtoRequest:
3532
def __init__(self, **kwargs):
@@ -44,9 +41,6 @@ class MockValueErrorRequest:
4441
def HasField(self, key):
4542
raise ValueError("Mismatched field")
4643

47-
def __contains__(self, key):
48-
return hasattr(self, key)
49-
5044

5145
# --- Parameterized Test ---
5246

@@ -59,6 +53,7 @@ def __contains__(self, key):
5953
# MockRequest cases
6054
(MockRequest(), True, "uuid"),
6155
(MockRequest(request_id="already_set"), True, "already_set"),
56+
(MockRequest(request_id=""), True, ""),
6257
(MockRequest(request_id=""), False, "uuid"),
6358
(MockRequest(request_id="already_set"), False, "already_set"),
6459
# MockProtoRequest cases
@@ -70,6 +65,7 @@ def __contains__(self, key):
7065
({}, True, "uuid"),
7166
({"request_id": None}, True, "uuid"),
7267
({"request_id": "already_set"}, True, "already_set"),
68+
({"request_id": ""}, True, ""),
7369
({"request_id": ""}, False, "uuid"),
7470
({"request_id": None}, False, "uuid"),
7571
({"request_id": "already_set"}, False, "already_set"),
@@ -79,6 +75,7 @@ def __contains__(self, key):
7975
ids=[
8076
"proto3_optional_not_in_request",
8177
"proto3_optional_already_in_request",
78+
"proto3_optional_explicit_empty",
8279
"non_proto3_optional_empty",
8380
"non_proto3_optional_already_set",
8481
"proto3_optional_not_in_request_proto",
@@ -87,6 +84,7 @@ def __contains__(self, key):
8784
"dict_proto3_optional_not_in_request",
8885
"dict_proto3_optional_value_none",
8986
"dict_proto3_optional_already_in_request",
87+
"dict_proto3_optional_explicit_empty",
9088
"dict_non_proto3_optional_empty",
9189
"dict_non_proto3_optional_value_none",
9290
"dict_non_proto3_optional_already_set",
@@ -110,6 +108,20 @@ def test_setup_request_id(request_obj, is_proto3_optional, expected):
110108
)
111109

112110
if expected == "uuid":
113-
assert re.match(UUID_REGEX, value)
111+
assert re.fullmatch(UUID_REGEX, value)
114112
else:
115113
assert value == expected
114+
115+
116+
def test_setup_request_id_assertion_strictness(mocker):
117+
# Mock uuid.uuid4 to return a UUID with trailing characters
118+
mock_uuid = mocker.patch("uuid.uuid4")
119+
mock_uuid.return_value.__str__.return_value = (
120+
"12345678-1234-4123-8123-123456789012-extra"
121+
)
122+
123+
# We expect test_setup_request_id to fail (raise AssertionError) because the UUID is invalid.
124+
# If test_setup_request_id uses re.fullmatch, it will fail (raise AssertionError), so pytest.raises passes.
125+
# If test_setup_request_id uses re.match, it will NOT fail, so pytest.raises fails!
126+
with pytest.raises(AssertionError):
127+
test_setup_request_id(MockRequest(), is_proto3_optional=True, expected="uuid")

packages/google-api-core/tests/unit/operations_v1/test_operations_client.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,52 @@ def test_cancel_operation():
100100

101101
def test_operations_client_config():
102102
assert operations_client_config.config["interfaces"]
103+
104+
105+
def test_operations_v1_transport_base_to_dict_protobuf_versions(monkeypatch):
106+
from google.auth import credentials as ga_credentials
107+
from google.longrunning import operations_pb2
108+
109+
from google.api_core.operations_v1.transports import base
110+
111+
message = operations_pb2.Operation(name="test_op")
112+
transport = base.OperationsTransport(
113+
credentials=ga_credentials.AnonymousCredentials()
114+
)
115+
116+
calls = []
117+
118+
def mock_message_to_dict(*args, **kwargs):
119+
calls.append(kwargs)
120+
return {"name": "test_op"}
121+
122+
monkeypatch.setattr(base.json_format, "MessageToDict", mock_message_to_dict)
123+
124+
monkeypatch.setattr(base, "PROTOBUF_VERSION", "3.20.0")
125+
res3 = transport._convert_protobuf_message_to_dict(message)
126+
assert res3.get("name") == "test_op"
127+
assert "including_default_value_fields" in calls[-1]
128+
129+
monkeypatch.setattr(base, "PROTOBUF_VERSION", "5.26.0")
130+
res5 = transport._convert_protobuf_message_to_dict(message)
131+
assert res5.get("name") == "test_op"
132+
assert "always_print_fields_with_no_presence" in calls[-1]
133+
134+
135+
def test_operations_v1_init_import_error_fallback(monkeypatch):
136+
import importlib
137+
138+
import google.api_core.operations_v1 as op_v1
139+
140+
orig_import = __import__
141+
142+
def mock_import(name, globals=None, locals=None, fromlist=(), level=0):
143+
if "operations_rest_client_async" in name or (
144+
fromlist and "AsyncOperationsRestClient" in fromlist
145+
):
146+
raise ImportError("Simulated async rest import error")
147+
return orig_import(name, globals, locals, fromlist, level)
148+
149+
monkeypatch.setattr("builtins.__import__", mock_import)
150+
monkeypatch.setattr(op_v1, "_has_async_rest", True)
151+
importlib.reload(op_v1)

0 commit comments

Comments
 (0)