aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--google/api_core/exceptions.py7
-rw-r--r--tests/unit/test_exceptions.py28
2 files changed, 34 insertions, 1 deletions
diff --git a/google/api_core/exceptions.py b/google/api_core/exceptions.py
index fdb2109..6b1b6f7 100644
--- a/google/api_core/exceptions.py
+++ b/google/api_core/exceptions.py
@@ -487,9 +487,14 @@ def _is_informative_grpc_error(rpc_exc):
def _parse_grpc_error_details(rpc_exc):
- status = rpc_status.from_call(rpc_exc)
+ try:
+ status = rpc_status.from_call(rpc_exc)
+ except NotImplementedError: # workaround
+ return []
+
if not status:
return []
+
possible_errors = [
error_details_pb2.BadRequest,
error_details_pb2.PreconditionFailure,
diff --git a/tests/unit/test_exceptions.py b/tests/unit/test_exceptions.py
index f6345fe..622f58a 100644
--- a/tests/unit/test_exceptions.py
+++ b/tests/unit/test_exceptions.py
@@ -237,6 +237,34 @@ def test_from_grpc_error_non_call():
assert exception.response == error
+@pytest.mark.skipif(grpc is None, reason="No grpc")
+def test_from_grpc_error_bare_call():
+ message = "Testing"
+
+ class TestingError(grpc.Call, grpc.RpcError):
+ def __init__(self, exception):
+ self.exception = exception
+
+ def code(self):
+ return self.exception.grpc_status_code
+
+ def details(self):
+ return message
+
+ nested_message = "message"
+ error = TestingError(exceptions.GoogleAPICallError(nested_message))
+
+ exception = exceptions.from_grpc_error(error)
+
+ assert isinstance(exception, exceptions.GoogleAPICallError)
+ assert exception.code is None
+ assert exception.grpc_status_code is None
+ assert exception.message == message
+ assert exception.errors == [error]
+ assert exception.response == error
+ assert exception.details == []
+
+
def create_bad_request_details():
bad_request_details = error_details_pb2.BadRequest()
field_violation = bad_request_details.field_violations.add()