Skip to content

Commit f87e2a5

Browse files
committed
Improve tests for health servicer
Signed-off-by: Yevgen Polyak <yevgen.polyak@gmail.com>
1 parent ece0d3d commit f87e2a5

File tree

4 files changed

+50
-30
lines changed

4 files changed

+50
-30
lines changed

ext/dapr-ext-grpc/dapr/ext/grpc/_health_servicer.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
from dapr.proto import appcallback_service_v1
55
from dapr.proto.runtime.v1.appcallback_pb2 import HealthCheckResponse
66

7-
HealthCheckCallable = Callable[[], None]
7+
HealthCheckCallable = Optional[Callable[[], None]]
88

99

1010
class _HealthCheckServicer(appcallback_service_v1.AppCallbackHealthCheckServicer):
@@ -13,19 +13,19 @@ class _HealthCheckServicer(appcallback_service_v1.AppCallbackHealthCheckServicer
1313
:class:`App` provides useful decorators to register method, topic, input bindings.
1414
"""
1515

16+
def __init__(self):
17+
self._health_check_cb: Optional[HealthCheckCallable] = None
18+
1619
def register_health_check(self, cb: HealthCheckCallable) -> None:
1720
if not cb:
1821
raise ValueError('health check callback must be defined')
1922
self._health_check_cb = cb
2023

21-
def __init__(self):
22-
self._health_check_cb: Optional[HealthCheckCallable] = None
23-
2424
def HealthCheck(self, request, context):
2525
"""Health check."""
2626

2727
if not self._health_check_cb:
28-
context.set_code(grpc.StatusCode.UNIMPLEMENTED)
28+
context.set_code(grpc.StatusCode.UNIMPLEMENTED) # type: ignore
2929
context.set_details('Method not implemented!')
3030
raise NotImplementedError('Method not implemented!')
3131
self._health_check_cb()

ext/dapr-ext-grpc/dapr/ext/grpc/app.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020

2121
from dapr.conf import settings
2222
from dapr.ext.grpc._servicer import _CallbackServicer, Rule # type: ignore
23-
from dapr.ext.grpc._health_servicer import _HealthCheckServicer
23+
from dapr.ext.grpc._health_servicer import _HealthCheckServicer # type: ignore
2424
from dapr.proto import appcallback_service_v1
2525

2626

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import unittest
2+
from unittest.mock import MagicMock
3+
4+
from dapr.ext.grpc._health_servicer import _HealthCheckServicer
5+
6+
7+
class OnInvokeTests(unittest.TestCase):
8+
def setUp(self):
9+
self._health_servicer = _HealthCheckServicer()
10+
11+
def test_healthcheck_cb_called(self):
12+
health_cb = MagicMock()
13+
self._health_servicer.register_health_check(health_cb)
14+
self._health_servicer.HealthCheck(None, MagicMock())
15+
health_cb.assert_called_once()
16+
17+
def test_no_healthcheck_cb(self):
18+
with self.assertRaises(NotImplementedError) as exception_context:
19+
self._health_servicer.HealthCheck(None, MagicMock())
20+
self.assertIn('Method not implemented!', exception_context.exception.args[0])

ext/dapr-ext-grpc/tests/test_servicier.py

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,18 @@
1919

2020
from dapr.clients.grpc._request import InvokeMethodRequest
2121
from dapr.clients.grpc._response import InvokeMethodResponse, TopicEventResponse
22-
from dapr.ext.grpc._servicier import _CallbackServicer
22+
from dapr.ext.grpc._servicer import _CallbackServicer
2323
from dapr.proto import common_v1, appcallback_v1
2424

2525
from google.protobuf.any_pb2 import Any as GrpcAny
2626

2727

2828
class OnInvokeTests(unittest.TestCase):
2929
def setUp(self):
30-
self._servicier = _CallbackServicer()
30+
self._servicer = _CallbackServicer()
3131

3232
def _on_invoke(self, method_name, method_cb):
33-
self._servicier.register_method(method_name, method_cb)
33+
self._servicer.register_method(method_name, method_cb)
3434

3535
# fake context
3636
fake_context = MagicMock()
@@ -39,7 +39,7 @@ def _on_invoke(self, method_name, method_cb):
3939
('key2', 'value1'),
4040
)
4141

42-
return self._servicier.OnInvoke(
42+
return self._servicer.OnInvoke(
4343
common_v1.InvokeRequest(method=method_name, data=GrpcAny()),
4444
fake_context,
4545
)
@@ -93,18 +93,18 @@ def method_cb(request: InvokeMethodRequest):
9393

9494
class TopicSubscriptionTests(unittest.TestCase):
9595
def setUp(self):
96-
self._servicier = _CallbackServicer()
96+
self._servicer = _CallbackServicer()
9797
self._topic1_method = Mock()
9898
self._topic2_method = Mock()
9999
self._topic3_method = Mock()
100100
self._topic3_method.return_value = TopicEventResponse('success')
101101
self._topic4_method = Mock()
102102

103-
self._servicier.register_topic('pubsub1', 'topic1', self._topic1_method, {'session': 'key'})
104-
self._servicier.register_topic('pubsub1', 'topic3', self._topic3_method, {'session': 'key'})
105-
self._servicier.register_topic('pubsub2', 'topic2', self._topic2_method, {'session': 'key'})
106-
self._servicier.register_topic('pubsub2', 'topic3', self._topic3_method, {'session': 'key'})
107-
self._servicier.register_topic(
103+
self._servicer.register_topic('pubsub1', 'topic1', self._topic1_method, {'session': 'key'})
104+
self._servicer.register_topic('pubsub1', 'topic3', self._topic3_method, {'session': 'key'})
105+
self._servicer.register_topic('pubsub2', 'topic2', self._topic2_method, {'session': 'key'})
106+
self._servicer.register_topic('pubsub2', 'topic3', self._topic3_method, {'session': 'key'})
107+
self._servicer.register_topic(
108108
'pubsub3',
109109
'topic4',
110110
self._topic4_method,
@@ -121,12 +121,12 @@ def setUp(self):
121121

122122
def test_duplicated_topic(self):
123123
with self.assertRaises(ValueError):
124-
self._servicier.register_topic(
124+
self._servicer.register_topic(
125125
'pubsub1', 'topic1', self._topic1_method, {'session': 'key'}
126126
)
127127

128128
def test_list_topic_subscription(self):
129-
resp = self._servicier.ListTopicSubscriptions(None, None)
129+
resp = self._servicer.ListTopicSubscriptions(None, None)
130130
self.assertEqual('pubsub1', resp.subscriptions[0].pubsub_name)
131131
self.assertEqual('topic1', resp.subscriptions[0].topic)
132132
self.assertEqual({'session': 'key'}, resp.subscriptions[0].metadata)
@@ -143,23 +143,23 @@ def test_list_topic_subscription(self):
143143
self.assertEqual({'session': 'key'}, resp.subscriptions[4].metadata)
144144

145145
def test_topic_event(self):
146-
self._servicier.OnTopicEvent(
146+
self._servicer.OnTopicEvent(
147147
appcallback_v1.TopicEventRequest(pubsub_name='pubsub1', topic='topic1'),
148148
self.fake_context,
149149
)
150150

151151
self._topic1_method.assert_called_once()
152152

153153
def test_topic3_event_called_once(self):
154-
self._servicier.OnTopicEvent(
154+
self._servicer.OnTopicEvent(
155155
appcallback_v1.TopicEventRequest(pubsub_name='pubsub1', topic='topic3'),
156156
self.fake_context,
157157
)
158158

159159
self._topic3_method.assert_called_once()
160160

161161
def test_topic3_event_response(self):
162-
response = self._servicier.OnTopicEvent(
162+
response = self._servicer.OnTopicEvent(
163163
appcallback_v1.TopicEventRequest(pubsub_name='pubsub1', topic='topic3'),
164164
self.fake_context,
165165
)
@@ -169,7 +169,7 @@ def test_topic3_event_response(self):
169169
)
170170

171171
def test_disable_topic_validation(self):
172-
self._servicier.OnTopicEvent(
172+
self._servicer.OnTopicEvent(
173173
appcallback_v1.TopicEventRequest(pubsub_name='pubsub3', topic='should_be_ignored'),
174174
self.fake_context,
175175
)
@@ -178,20 +178,20 @@ def test_disable_topic_validation(self):
178178

179179
def test_non_registered_topic(self):
180180
with self.assertRaises(NotImplementedError):
181-
self._servicier.OnTopicEvent(
181+
self._servicer.OnTopicEvent(
182182
appcallback_v1.TopicEventRequest(pubsub_name='pubsub1', topic='topic_non_existed'),
183183
self.fake_context,
184184
)
185185

186186

187187
class BindingTests(unittest.TestCase):
188188
def setUp(self):
189-
self._servicier = _CallbackServicer()
189+
self._servicer = _CallbackServicer()
190190
self._binding1_method = Mock()
191191
self._binding2_method = Mock()
192192

193-
self._servicier.register_binding('binding1', self._binding1_method)
194-
self._servicier.register_binding('binding2', self._binding2_method)
193+
self._servicer.register_binding('binding1', self._binding1_method)
194+
self._servicer.register_binding('binding2', self._binding2_method)
195195

196196
# fake context
197197
self.fake_context = MagicMock()
@@ -202,15 +202,15 @@ def setUp(self):
202202

203203
def test_duplicated_binding(self):
204204
with self.assertRaises(ValueError):
205-
self._servicier.register_binding('binding1', self._binding1_method)
205+
self._servicer.register_binding('binding1', self._binding1_method)
206206

207207
def test_list_bindings(self):
208-
resp = self._servicier.ListInputBindings(None, None)
208+
resp = self._servicer.ListInputBindings(None, None)
209209
self.assertEqual('binding1', resp.bindings[0])
210210
self.assertEqual('binding2', resp.bindings[1])
211211

212212
def test_binding_event(self):
213-
self._servicier.OnBindingEvent(
213+
self._servicer.OnBindingEvent(
214214
appcallback_v1.BindingEventRequest(name='binding1'),
215215
self.fake_context,
216216
)
@@ -219,7 +219,7 @@ def test_binding_event(self):
219219

220220
def test_non_registered_binding(self):
221221
with self.assertRaises(NotImplementedError):
222-
self._servicier.OnBindingEvent(
222+
self._servicer.OnBindingEvent(
223223
appcallback_v1.BindingEventRequest(name='binding3'),
224224
self.fake_context,
225225
)

0 commit comments

Comments
 (0)