Skip to content

Commit 64c1b3c

Browse files
committed
Removing mock.Mock() in error reporting.
This actually required a much more comprehensive set of unit test changes than expected. Also incorporated a change from googleapis#3057 (which slipped through due to overly broad mocks).
1 parent d4d0abc commit 64c1b3c

4 files changed

Lines changed: 65 additions & 35 deletions

File tree

error_reporting/google/cloud/error_reporting/_gax.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def make_report_error_api(client):
3636
:returns: An Error Reporting API instance.
3737
"""
3838
channel = make_secure_channel(
39-
client._connection.credentials,
39+
client._credentials,
4040
DEFAULT_USER_AGENT,
4141
report_errors_service_client.ReportErrorsServiceClient.SERVICE_ADDRESS)
4242
gax_client = report_errors_service_client.ReportErrorsServiceClient(

error_reporting/unit_tests/test__gax.py

Lines changed: 27 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,11 @@ def test_make_report_error_api(self):
2828
from google.cloud.error_reporting import __version__
2929
from google.cloud.error_reporting._gax import make_report_error_api
3030

31-
client = mock.Mock()
31+
client = mock.Mock(
32+
_credentials=mock.sentinel.credentials,
33+
project='prahj-ekt',
34+
spec=['project', '_credentials'],
35+
)
3236

3337
# Mock out the constructor for the GAPIC client.
3438
ServiceClient = report_errors_service_client.ReportErrorsServiceClient
@@ -55,24 +59,34 @@ class Test_ErrorReportingGaxApi(unittest.TestCase):
5559

5660
PROJECT = 'PROJECT'
5761

58-
def _call_fut(self, gax_api, project):
62+
def _make_one(self, gax_api, project):
5963
from google.cloud.error_reporting._gax import _ErrorReportingGaxApi
6064

6165
return _ErrorReportingGaxApi(gax_api, project)
6266

6367
def test_constructor(self):
64-
gax_api = mock.Mock()
65-
gax_client_wrapper = self._call_fut(gax_api, self.PROJECT)
68+
gax_api = mock.Mock(spec=[])
69+
gax_client_wrapper = self._make_one(gax_api, self.PROJECT)
6670

6771
self.assertEqual(gax_client_wrapper._project, self.PROJECT)
6872
self.assertEqual(gax_client_wrapper._gax_api, gax_api)
6973

70-
@mock.patch("google.cloud.error_reporting._gax.ParseDict")
71-
def test_report_error_event(self, _):
72-
gax_api = mock.Mock()
73-
gax_client_wrapper = self._call_fut(gax_api, self.PROJECT)
74-
75-
mock_error_report = mock.Mock()
76-
gax_client_wrapper.report_error_event(mock_error_report)
77-
self.assertTrue(gax_api.report_error_event.called_with,
78-
mock_error_report)
74+
def test_report_error_event(self):
75+
from google.cloud.proto.devtools.clouderrorreporting.v1beta1 import (
76+
report_errors_service_pb2)
77+
78+
gax_api = mock.Mock(spec=['project_path', 'report_error_event'])
79+
gax_client_wrapper = self._make_one(gax_api, self.PROJECT)
80+
81+
error_report = {
82+
'message': 'The cabs are here.',
83+
}
84+
gax_client_wrapper.report_error_event(error_report)
85+
86+
gax_api.project_path.assert_called_once_with(self.PROJECT)
87+
project_name = gax_api.project_path.return_value
88+
error_pb = report_errors_service_pb2.ReportedErrorEvent(
89+
message=error_report['message'],
90+
)
91+
gax_api.report_error_event.assert_called_once_with(
92+
project_name, error_pb)

error_reporting/unit_tests/test__logging.py

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,28 +26,36 @@ def _make_credentials():
2626
class Test_ErrorReportingLoggingAPI(unittest.TestCase):
2727

2828
PROJECT = 'PROJECT'
29-
SERVICE = 'SERVICE'
30-
VERSION = 'myversion'
3129

32-
def _call_fut(self, project, credentials):
30+
def _make_one(self, project, credentials):
3331
from google.cloud.error_reporting._logging import (
3432
_ErrorReportingLoggingAPI)
3533

3634
return _ErrorReportingLoggingAPI(project, credentials)
3735

3836
def test_constructor(self):
3937
credentials = _make_credentials()
40-
logger_client = self._call_fut(self.PROJECT, credentials)
38+
logging_api = self._make_one(self.PROJECT, credentials)
4139

42-
self.assertEqual(logger_client.logging_client._connection.credentials,
40+
self.assertEqual(logging_api.logging_client._connection.credentials,
4341
credentials)
44-
self.assertEqual(logger_client.logging_client.project, self.PROJECT)
42+
self.assertEqual(logging_api.logging_client.project, self.PROJECT)
4543

46-
@mock.patch('google.cloud.logging.client')
47-
def test_report_error_event(self, _):
44+
@mock.patch('google.cloud.logging.client.Client')
45+
def test_report_error_event(self, mocked_cls):
4846
credentials = _make_credentials()
49-
logger_client = self._call_fut(self.PROJECT, credentials)
50-
payload = mock.Mock()
51-
logger_client.report_error_event(payload)
52-
logger_mock = mock.Mock()
53-
self.assertTrue(logger_mock.log_struct.called_with, payload)
47+
logging_api = self._make_one(self.PROJECT, credentials)
48+
mocked_cls.assert_called_once_with(self.PROJECT, credentials, None)
49+
self.assertIs(logging_api.logging_client, mocked_cls.return_value)
50+
51+
logger = mock.Mock(spec=['log_struct'])
52+
logging_api.logging_client.logger.return_value = logger
53+
54+
# Actually make the API call.
55+
error_report = {
56+
'message': 'The cabs are here.',
57+
}
58+
logging_api.report_error_event(error_report)
59+
60+
# Check the mocks.
61+
logger.log_struct.assert_called_once_with(error_report)

error_reporting/unit_tests/test_client.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,10 @@ def _make_credentials():
2626

2727
class TestClient(unittest.TestCase):
2828

29+
PROJECT = 'PROJECT'
30+
SERVICE = 'SERVICE'
31+
VERSION = 'myversion'
32+
2933
@staticmethod
3034
def _get_target_class():
3135
from google.cloud.error_reporting.client import Client
@@ -37,16 +41,20 @@ def _getHttpContext(self):
3741

3842
return HTTPContext
3943

44+
def _get_report_payload(self, client):
45+
self.assertEqual(client.report_error_event.call_count, 1)
46+
call = client.report_error_event.mock_calls[0]
47+
_, positional, kwargs = call
48+
self.assertEqual(kwargs, {})
49+
self.assertEqual(len(positional), 1)
50+
return positional[0]
51+
4052
def _make_one(self, *args, **kw):
4153
return self._get_target_class()(*args, **kw)
4254

4355
def _makeHTTP(self, *args, **kw):
4456
return self._getHttpContext()(*args, **kw)
4557

46-
PROJECT = 'PROJECT'
47-
SERVICE = 'SERVICE'
48-
VERSION = 'myversion'
49-
5058
@mock.patch(
5159
'google.cloud.error_reporting.client._determine_default_project')
5260
def test_ctor_default(self, _):
@@ -120,15 +128,15 @@ def test_report_exception_with_service_version_in_constructor(
120128
http_context = self._makeHTTP(method="GET", response_status_code=500)
121129
USER = "user@gmail.com"
122130

123-
client = mock.Mock()
131+
client = mock.Mock(spec=['report_error_event'])
124132
make_client.return_value = client
125133

126134
try:
127135
raise NameError
128136
except NameError:
129137
target.report_exception(http_context=http_context, user=USER)
130138

131-
payload = client.report_error_event.call_args[0][0]
139+
payload = self._get_report_payload(client)
132140
self.assertEqual(payload['serviceContext'], {
133141
'service': SERVICE,
134142
'version': VERSION
@@ -149,13 +157,13 @@ def test_report(self, make_client):
149157
target = self._make_one(project=self.PROJECT,
150158
credentials=CREDENTIALS)
151159

152-
client = mock.Mock()
160+
client = mock.Mock(spec=['report_error_event'])
153161
make_client.return_value = client
154162

155163
MESSAGE = 'this is an error'
156164
target.report(MESSAGE)
157165

158-
payload = client.report_error_event.call_args[0][0]
166+
payload = self._get_report_payload(client)
159167

160168
self.assertEqual(payload['message'], MESSAGE)
161169
report_location = payload['context']['reportLocation']

0 commit comments

Comments
 (0)