Skip to content

Commit a0e9f65

Browse files
authored
Fixed base handler async/added tests for SBSender + SBReceiver (Azure#16051)
* fixed base handler async to use async credential + added test for sync/async SBSender + SBReceiver * changed sb base handler methods for reusability * changed base handler to take class type of credentials * small update to kwargs call * remove unnecessary import
1 parent 78eb1b3 commit a0e9f65

File tree

4 files changed

+94
-25
lines changed

4 files changed

+94
-25
lines changed

sdk/servicebus/azure-servicebus/azure/servicebus/_base_handler.py

Lines changed: 9 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -226,19 +226,17 @@ def _convert_connection_string_to_kwargs(cls, conn_str, **kwargs):
226226

227227
kwargs["fully_qualified_namespace"] = host
228228
kwargs["entity_name"] = entity_in_conn_str or entity_in_kwargs
229-
# This has to be defined seperately to support sync vs async credentials.
230-
kwargs["credential"] = cls._create_credential_from_connection_string_parameters(
231-
token, token_expiry, policy, key
232-
)
233-
return kwargs
234229

235-
@classmethod
236-
def _create_credential_from_connection_string_parameters(
237-
cls, token, token_expiry, policy, key
238-
):
230+
# Set the type to sync credentials, unless async credentials are passed in.
231+
token_cred_type = kwargs.pop("token_cred_type", ServiceBusSASTokenCredential)
232+
key_cred_type = kwargs.pop("key_cred_type", ServiceBusSharedKeyCredential)
233+
239234
if token and token_expiry:
240-
return ServiceBusSASTokenCredential(token, token_expiry)
241-
return ServiceBusSharedKeyCredential(policy, key)
235+
kwargs["credential"] = token_cred_type(token, token_expiry)
236+
else:
237+
kwargs["credential"] = key_cred_type(policy, key)
238+
239+
return kwargs
242240

243241
def __enter__(self):
244242
if self._shutdown.is_set():

sdk/servicebus/azure-servicebus/azure/servicebus/aio/_base_handler_async.py

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -112,15 +112,12 @@ def __init__(
112112
@classmethod
113113
def _convert_connection_string_to_kwargs(cls, conn_str, **kwargs):
114114
# pylint:disable=protected-access
115-
return BaseHandlerSync._convert_connection_string_to_kwargs(conn_str, **kwargs)
116-
117-
@classmethod
118-
def _create_credential_from_connection_string_parameters(
119-
cls, token, token_expiry, policy, key
120-
):
121-
if token and token_expiry:
122-
return ServiceBusSASTokenCredential(token, token_expiry)
123-
return ServiceBusSharedKeyCredential(policy, key)
115+
return BaseHandlerSync._convert_connection_string_to_kwargs(
116+
conn_str,
117+
token_cred_type=ServiceBusSASTokenCredential,
118+
key_cred_type=ServiceBusSharedKeyCredential,
119+
**kwargs
120+
)
124121

125122
async def __aenter__(self):
126123
if self._shutdown.is_set():

sdk/servicebus/azure-servicebus/tests/async_tests/test_sb_client_async.py

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import pytest
1010

1111
from azure.mgmt.servicebus.models import AccessRights
12-
from azure.servicebus.aio import ServiceBusClient, ServiceBusSender
12+
from azure.servicebus.aio import ServiceBusClient, ServiceBusSender, ServiceBusReceiver
1313
from azure.servicebus import ServiceBusMessage
1414
from azure.servicebus.aio._base_handler_async import ServiceBusSharedKeyCredential
1515
from azure.servicebus.exceptions import (
@@ -173,6 +173,60 @@ async def test_async_sb_client_close_spawned_handlers(self, servicebus_namespace
173173
assert not receiver._handler and not receiver._running
174174
assert len(client._handlers) == 0
175175

176+
@pytest.mark.liveTest
177+
@pytest.mark.live_test_only
178+
@CachedResourceGroupPreparer(name_prefix='servicebustest')
179+
@CachedServiceBusNamespacePreparer(name_prefix='servicebustest')
180+
@ServiceBusNamespaceAuthorizationRulePreparer(name_prefix='servicebustest')
181+
@ServiceBusQueuePreparer(name_prefix='servicebustest_qone', parameter_name='wrong_queue', dead_lettering_on_message_expiration=True)
182+
@ServiceBusQueuePreparer(name_prefix='servicebustest_qtwo', dead_lettering_on_message_expiration=True)
183+
@ServiceBusQueueAuthorizationRulePreparer(name_prefix='servicebustest_qtwo')
184+
async def test_sb_client_incorrect_queue_conn_str_async(self, servicebus_queue_authorization_rule_connection_string, servicebus_queue, wrong_queue, **kwargs):
185+
186+
client = ServiceBusClient.from_connection_string(servicebus_queue_authorization_rule_connection_string)
187+
async with client:
188+
# Validate that the wrong sender/receiver queues with the right credentials fail.
189+
with pytest.raises(ValueError):
190+
async with client.get_queue_sender(wrong_queue.name) as sender:
191+
await sender.send_messages(ServiceBusMessage("test"))
192+
193+
with pytest.raises(ValueError):
194+
async with client.get_queue_receiver(wrong_queue.name) as receiver:
195+
messages = await receiver.receive_messages(max_message_count=1, max_wait_time=1)
196+
197+
# But that the correct ones work.
198+
async with client.get_queue_sender(servicebus_queue.name) as sender:
199+
await sender.send_messages(ServiceBusMessage("test"))
200+
201+
async with client.get_queue_receiver(servicebus_queue.name) as receiver:
202+
messages = await receiver.receive_messages(max_message_count=1, max_wait_time=1)
203+
204+
# Now do the same but with direct connstr initialization.
205+
with pytest.raises(ValueError):
206+
async with ServiceBusSender._from_connection_string(
207+
servicebus_queue_authorization_rule_connection_string,
208+
queue_name=wrong_queue.name,
209+
) as sender:
210+
await sender.send_messages(ServiceBusMessage("test"))
211+
212+
with pytest.raises(ValueError):
213+
async with ServiceBusReceiver._from_connection_string(
214+
servicebus_queue_authorization_rule_connection_string,
215+
queue_name=wrong_queue.name,
216+
) as receiver:
217+
messages = await receiver.receive_messages(max_message_count=1, max_wait_time=1)
218+
219+
async with ServiceBusSender._from_connection_string(
220+
servicebus_queue_authorization_rule_connection_string,
221+
queue_name=servicebus_queue.name,
222+
) as sender:
223+
await sender.send_messages(ServiceBusMessage("test"))
224+
225+
async with ServiceBusReceiver._from_connection_string(
226+
servicebus_queue_authorization_rule_connection_string,
227+
queue_name=servicebus_queue.name,
228+
) as receiver:
229+
messages = await receiver.receive_messages(max_message_count=1, max_wait_time=1)
176230

177231
@pytest.mark.liveTest
178232
@pytest.mark.live_test_only

sdk/servicebus/azure-servicebus/tests/test_sb_client.py

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313

1414
from azure.common import AzureHttpError, AzureConflictHttpError
1515
from azure.mgmt.servicebus.models import AccessRights
16-
from azure.servicebus import ServiceBusClient, ServiceBusSender
16+
from azure.servicebus import ServiceBusClient, ServiceBusSender, ServiceBusReceiver
1717
from azure.servicebus._base_handler import ServiceBusSharedKeyCredential
1818
from azure.servicebus._common.message import ServiceBusMessage, ServiceBusReceivedMessage
1919
from azure.servicebus.exceptions import (
@@ -152,29 +152,49 @@ def test_sb_client_incorrect_queue_conn_str(self, servicebus_queue_authorization
152152

153153
client = ServiceBusClient.from_connection_string(servicebus_queue_authorization_rule_connection_string)
154154
with client:
155-
# Validate that the wrong queue with the right credentials fails.
155+
# Validate that the wrong sender/receiver queues with the right credentials fail.
156156
with pytest.raises(ValueError):
157157
with client.get_queue_sender(wrong_queue.name) as sender:
158158
sender.send_messages(ServiceBusMessage("test"))
159159

160-
# But that the correct one works.
160+
with pytest.raises(ValueError):
161+
with client.get_queue_receiver(wrong_queue.name) as receiver:
162+
messages = receiver.receive_messages(max_message_count=1, max_wait_time=1)
163+
164+
# But that the correct ones work.
161165
with client.get_queue_sender(servicebus_queue.name) as sender:
162166
sender.send_messages(ServiceBusMessage("test"))
163167

168+
with client.get_queue_receiver(servicebus_queue.name) as receiver:
169+
messages = receiver.receive_messages(max_message_count=1, max_wait_time=1)
170+
164171
# Now do the same but with direct connstr initialization.
165172
with pytest.raises(ValueError):
166173
with ServiceBusSender._from_connection_string(
167174
servicebus_queue_authorization_rule_connection_string,
168175
queue_name=wrong_queue.name,
169176
) as sender:
170-
sender.send_messages(ServiceBusMessage("test"))
177+
sender.send_messages(ServiceBusMessage("test"))
178+
179+
with pytest.raises(ValueError):
180+
with ServiceBusReceiver._from_connection_string(
181+
servicebus_queue_authorization_rule_connection_string,
182+
queue_name=wrong_queue.name,
183+
) as receiver:
184+
messages = receiver.receive_messages(max_message_count=1, max_wait_time=1)
171185

172186
with ServiceBusSender._from_connection_string(
173187
servicebus_queue_authorization_rule_connection_string,
174188
queue_name=servicebus_queue.name,
175189
) as sender:
176190
sender.send_messages(ServiceBusMessage("test"))
177191

192+
with ServiceBusReceiver._from_connection_string(
193+
servicebus_queue_authorization_rule_connection_string,
194+
queue_name=servicebus_queue.name,
195+
) as receiver:
196+
messages = receiver.receive_messages(max_message_count=1, max_wait_time=1)
197+
178198
@pytest.mark.liveTest
179199
@pytest.mark.live_test_only
180200
@CachedResourceGroupPreparer()

0 commit comments

Comments
 (0)