diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py index 56f4207b2a75..4271bf2a6fc8 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/_queue_client.py @@ -481,6 +481,62 @@ def send_message( # type: ignore except StorageErrorException as error: process_storage_error(error) + @distributed_trace + def receive_message(self, **kwargs): + # type: (Optional[Any]) -> QueueMessage + """Removes one message from the front of the queue. + + When the message is retrieved from the queue, the response includes the message + content and a pop_receipt value, which is required to delete the message. + The message is not automatically deleted from the queue, but after it has + been retrieved, it is not visible to other clients for the time interval + specified by the visibility_timeout parameter. + + If the key-encryption-key or resolver field is set on the local service object, the message will be + decrypted before being returned. + + :keyword int visibility_timeout: + If not specified, the default value is 0. Specifies the + new visibility timeout value, in seconds, relative to server time. + The value must be larger than or equal to 0, and cannot be + larger than 7 days. The visibility timeout of a message cannot be + set to a value later than the expiry time. visibility_timeout + should be set to a value smaller than the time-to-live value. + :keyword int timeout: + The server timeout, expressed in seconds. + :return: + Returns a message from the Queue. + :rtype: ~azure.storage.queue.QueueMessage + + .. admonition:: Example: + + .. literalinclude:: ../samples/queue_samples_message.py + :start-after: [START receive_one_message] + :end-before: [END receive_one_message] + :language: python + :dedent: 12 + :caption: Receive one message from the queue. + """ + visibility_timeout = kwargs.pop('visibility_timeout', None) + timeout = kwargs.pop('timeout', None) + self._config.message_decode_policy.configure( + require_encryption=self.require_encryption, + key_encryption_key=self.key_encryption_key, + resolver=self.key_resolver_function) + try: + message = self._client.messages.dequeue( + number_of_messages=1, + visibilitytimeout=visibility_timeout, + timeout=timeout, + cls=self._config.message_decode_policy, + **kwargs + ) + wrapped_message = QueueMessage._from_generated( # pylint: disable=protected-access + message[0]) if message != [] else None + return wrapped_message + except StorageErrorException as error: + process_storage_error(error) + @distributed_trace def receive_messages(self, **kwargs): # type: (Optional[Any]) -> ItemPaged[QueueMessage] diff --git a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py index 0bf0b9076763..d2d3e49af02c 100644 --- a/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py +++ b/sdk/storage/azure-storage-queue/azure/storage/queue/aio/_queue_client_async.py @@ -400,6 +400,62 @@ async def send_message( # type: ignore except StorageErrorException as error: process_storage_error(error) + @distributed_trace_async + async def receive_message(self, **kwargs): + # type: (Optional[Any]) -> QueueMessage + """Removes one message from the front of the queue. + + When the message is retrieved from the queue, the response includes the message + content and a pop_receipt value, which is required to delete the message. + The message is not automatically deleted from the queue, but after it has + been retrieved, it is not visible to other clients for the time interval + specified by the visibility_timeout parameter. + + If the key-encryption-key or resolver field is set on the local service object, the message will be + decrypted before being returned. + + :keyword int visibility_timeout: + If not specified, the default value is 0. Specifies the + new visibility timeout value, in seconds, relative to server time. + The value must be larger than or equal to 0, and cannot be + larger than 7 days. The visibility timeout of a message cannot be + set to a value later than the expiry time. visibility_timeout + should be set to a value smaller than the time-to-live value. + :keyword int timeout: + The server timeout, expressed in seconds. + :return: + Returns a message from the Queue. + :rtype: ~azure.storage.queue.QueueMessage + + .. admonition:: Example: + + .. literalinclude:: ../samples/queue_samples_message_async.py + :start-after: [START receive_one_message] + :end-before: [END receive_one_message] + :language: python + :dedent: 12 + :caption: Receive one message from the queue. + """ + visibility_timeout = kwargs.pop('visibility_timeout', None) + timeout = kwargs.pop('timeout', None) + self._config.message_decode_policy.configure( + require_encryption=self.require_encryption, + key_encryption_key=self.key_encryption_key, + resolver=self.key_resolver_function) + try: + message = await self._client.messages.dequeue( + number_of_messages=1, + visibilitytimeout=visibility_timeout, + timeout=timeout, + cls=self._config.message_decode_policy, + **kwargs + ) + wrapped_message = QueueMessage._from_generated( # pylint: disable=protected-access + message[0]) if message != [] else None + return wrapped_message + except StorageErrorException as error: + process_storage_error(error) + @distributed_trace def receive_messages(self, **kwargs): # type: (Optional[Any]) -> AsyncItemPaged[QueueMessage] diff --git a/sdk/storage/azure-storage-queue/samples/queue_samples_message.py b/sdk/storage/azure-storage-queue/samples/queue_samples_message.py index f5c72c54a120..79e9a3b4eb23 100644 --- a/sdk/storage/azure-storage-queue/samples/queue_samples_message.py +++ b/sdk/storage/azure-storage-queue/samples/queue_samples_message.py @@ -179,7 +179,7 @@ def list_message_pages(self): finally: queue.delete_queue() - def delete_and_clear_messages(self): + def receive_one_message_from_queue(self): # Instantiate a queue client from azure.storage.queue import QueueClient queue = QueueClient.from_connection_string(self.connection_string, "myqueue5") @@ -187,6 +187,34 @@ def delete_and_clear_messages(self): # Create the queue queue.create_queue() + try: + queue.send_message(u"message1") + queue.send_message(u"message2") + queue.send_message(u"message3") + + # [START receive_one_message] + # Pop two messages from the front of the queue + message1 = queue.receive_message() + message2 = queue.receive_message() + # We should see message 3 if we peek + message3 = queue.peek_messages()[0] + + print(message1.content) + print(message2.content) + print(message3.content) + # [END receive_one_message] + + finally: + queue.delete_queue() + + def delete_and_clear_messages(self): + # Instantiate a queue client + from azure.storage.queue import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "myqueue6") + + # Create the queue + queue.create_queue() + try: # Send messages queue.send_message(u"message1") @@ -214,7 +242,7 @@ def delete_and_clear_messages(self): def peek_messages(self): # Instantiate a queue client from azure.storage.queue import QueueClient - queue = QueueClient.from_connection_string(self.connection_string, "myqueue6") + queue = QueueClient.from_connection_string(self.connection_string, "myqueue7") # Create the queue queue.create_queue() @@ -246,7 +274,7 @@ def peek_messages(self): def update_message(self): # Instantiate a queue client from azure.storage.queue import QueueClient - queue = QueueClient.from_connection_string(self.connection_string, "myqueue7") + queue = QueueClient.from_connection_string(self.connection_string, "myqueue8") # Create the queue queue.create_queue() @@ -279,6 +307,7 @@ def update_message(self): sample.queue_metadata() sample.send_and_receive_messages() sample.list_message_pages() + sample.receive_one_message_from_queue() sample.delete_and_clear_messages() sample.peek_messages() sample.update_message() diff --git a/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py b/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py index 0a73fc1caf8c..539869ef3d58 100644 --- a/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py +++ b/sdk/storage/azure-storage-queue/samples/queue_samples_message_async.py @@ -149,6 +149,36 @@ async def send_and_receive_messages_async(self): # Delete the queue await queue.delete_queue() + async def receive_one_message_from_queue(self): + # Instantiate a queue client + from azure.storage.queue.aio import QueueClient + queue = QueueClient.from_connection_string(self.connection_string, "myqueue3") + + # Create the queue + async with queue: + await queue.create_queue() + + try: + await asyncio.gather( + queue.send_message(u"message1"), + queue.send_message(u"message2"), + queue.send_message(u"message3")) + + # [START receive_one_message] + # Pop two messages from the front of the queue + message1 = await queue.receive_message() + message2 = await queue.receive_message() + # We should see message 3 if we peek + message3 = await queue.peek_messages() + + print(message1.content) + print(message2.content) + print(message3[0].content) + # [END receive_one_message] + + finally: + await queue.delete_queue() + async def delete_and_clear_messages_async(self): # Instantiate a queue client from azure.storage.queue.aio import QueueClient @@ -256,6 +286,7 @@ async def main(): await sample.set_access_policy_async() await sample.queue_metadata_async() await sample.send_and_receive_messages_async() + await sample.receive_one_message_from_queue() await sample.delete_and_clear_messages_async() await sample.peek_messages_async() await sample.update_message_async() diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_receive_one_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_receive_one_message.yaml new file mode 100644 index 000000000000..1873e79653f5 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue.test_receive_one_message.yaml @@ -0,0 +1,318 @@ +interactions: +- request: + body: null + headers: + Accept: + - '*/*' + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '0' + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:17 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a + response: + body: + string: '' + headers: + content-length: + - '0' + date: + - Thu, 29 Oct 2020 02:48:17 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:18 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?numofmessages=1 + response: + body: + string: "\uFEFF" + headers: + cache-control: + - no-cache + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:17 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages + response: + body: + string: "\uFEFF78d04178-05f5-4c46-af2e-d184e4dfb298Thu, + 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18 + GMTAgAAAAMAAAAAAAAAUo399J2t1gE=Thu, + 29 Oct 2020 02:48:18 GMT" + headers: + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:17 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages + response: + body: + string: "\uFEFF0902bc9d-169b-4e22-9ba2-b81fac7ada71Thu, + 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18 + GMTAgAAAAMAAAAAAAAA4FES9Z2t1gE=Thu, + 29 Oct 2020 02:48:18 GMT" + headers: + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:18 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:18 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages + response: + body: + string: "\uFEFF095ce0f7-470d-4c97-8512-69eb14a36ff3Thu, + 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18 + GMTAgAAAAMAAAAAAAAAJIQr9Z2t1gE=Thu, + 29 Oct 2020 02:48:18 GMT" + headers: + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:18 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 201 + message: Created +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?numofmessages=1 + response: + body: + string: "\uFEFF78d04178-05f5-4c46-af2e-d184e4dfb298Thu, + 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18 + GMTAgAAAAMAAAAAAAAArXIjB56t1gE=Thu, + 29 Oct 2020 02:48:49 GMT1message1" + headers: + cache-control: + - no-cache + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:18 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?numofmessages=1 + response: + body: + string: "\uFEFF0902bc9d-169b-4e22-9ba2-b81fac7ada71Thu, + 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18 + GMTAgAAAAMAAAAAAAAAPzc4B56t1gE=Thu, + 29 Oct 2020 02:48:49 GMT1message2" + headers: + cache-control: + - no-cache + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:18 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +- request: + body: null + headers: + Accept: + - application/xml + Accept-Encoding: + - gzip, deflate + Connection: + - keep-alive + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:19 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueuesync3a60e5a/messages?peekonly=true + response: + body: + string: "\uFEFF095ce0f7-470d-4c97-8512-69eb14a36ff3Thu, + 29 Oct 2020 02:48:18 GMTThu, 05 Nov 2020 02:48:18 + GMT0message3" + headers: + cache-control: + - no-cache + content-type: + - application/xml + date: + - Thu, 29 Oct 2020 02:48:18 GMT + server: + - Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: + - chunked + x-ms-version: + - '2018-03-28' + status: + code: 200 + message: OK +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/recordings/test_queue_async.test_receive_one_message.yaml b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_async.test_receive_one_message.yaml new file mode 100644 index 000000000000..bc9191e8d665 --- /dev/null +++ b/sdk/storage/azure-storage-queue/tests/recordings/test_queue_async.test_receive_one_message.yaml @@ -0,0 +1,247 @@ +interactions: +- request: + body: null + headers: + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:29 GMT + x-ms-version: + - '2018-03-28' + method: PUT + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7 + response: + body: + string: '' + headers: + content-length: '0' + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + x-ms-version: '2018-03-28' + status: + code: 201 + message: Created + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7 +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1 + response: + body: + string: "\uFEFF" + headers: + cache-control: no-cache + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 200 + message: OK + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1 +- request: + body: ' + + message1' + headers: + Accept: + - application/xml + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages + response: + body: + string: "\uFEFFc25fa1f7-cb36-4d2a-bf09-6f75389bbc98Thu, + 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30 + GMTAgAAAAMAAAAAAAAAv+re+52t1gE=Thu, + 29 Oct 2020 02:48:30 GMT" + headers: + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 201 + message: Created + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages +- request: + body: ' + + message2' + headers: + Accept: + - application/xml + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages + response: + body: + string: "\uFEFF9159ff30-0b69-4916-8efb-7624a7b1acdbThu, + 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30 + GMTAgAAAAMAAAAAAAAAi7Do+52t1gE=Thu, + 29 Oct 2020 02:48:30 GMT" + headers: + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 201 + message: Created + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages +- request: + body: ' + + message3' + headers: + Accept: + - application/xml + Content-Length: + - '103' + Content-Type: + - application/xml; charset=utf-8 + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: POST + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages + response: + body: + string: "\uFEFFd39f0f34-a85b-4488-924c-d5cf002f4b68Thu, + 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30 + GMTAgAAAAMAAAAAAAAAFyjy+52t1gE=Thu, + 29 Oct 2020 02:48:30 GMT" + headers: + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 201 + message: Created + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1 + response: + body: + string: "\uFEFFc25fa1f7-cb36-4d2a-bf09-6f75389bbc98Thu, + 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30 + GMTAgAAAAMAAAAAAAAAyWndDZ6t1gE=Thu, + 29 Oct 2020 02:49:00 GMT1message1" + headers: + cache-control: no-cache + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 200 + message: OK + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1 +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1 + response: + body: + string: "\uFEFF9159ff30-0b69-4916-8efb-7624a7b1acdbThu, + 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30 + GMTAgAAAAMAAAAAAAAAs1bnDZ6t1gE=Thu, + 29 Oct 2020 02:49:00 GMT1message2" + headers: + cache-control: no-cache + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 200 + message: OK + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?numofmessages=1 +- request: + body: null + headers: + Accept: + - application/xml + User-Agent: + - azsdk-python-storage-queue/12.1.4 Python/3.8.5 (Windows-10-10.0.19041-SP0) + x-ms-date: + - Thu, 29 Oct 2020 02:48:30 GMT + x-ms-version: + - '2018-03-28' + method: GET + uri: https://storagename.queue.core.windows.net/pyqueueasync640e10d7/messages?peekonly=true + response: + body: + string: "\uFEFFd39f0f34-a85b-4488-924c-d5cf002f4b68Thu, + 29 Oct 2020 02:48:30 GMTThu, 05 Nov 2020 02:48:30 + GMT0message3" + headers: + cache-control: no-cache + content-type: application/xml + date: Thu, 29 Oct 2020 02:48:29 GMT + server: Windows-Azure-Queue/1.0 Microsoft-HTTPAPI/2.0 + transfer-encoding: chunked + x-ms-version: '2018-03-28' + status: + code: 200 + message: OK + url: https://seanmcccanary3.queue.core.windows.net/pyqueueasync640e10d7/messages?peekonly=true +version: 1 diff --git a/sdk/storage/azure-storage-queue/tests/test_queue.py b/sdk/storage/azure-storage-queue/tests/test_queue.py index d556a12c8509..d6f21a3f03f8 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue.py @@ -50,7 +50,7 @@ def _get_queue_reference(self, qsc, prefix=TEST_QUEUE_PREFIX): queue = qsc.get_queue_client(queue_name) return queue - def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list = None): + def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list=None): queue = self._get_queue_reference(qsc, prefix) created = queue.create_queue() if queue_list is not None: @@ -322,6 +322,38 @@ def test_get_messages(self, resource_group, location, storage_account, storage_a self.assertIsInstance(message.expires_on, datetime) self.assertIsInstance(message.next_visible_on, datetime) + @GlobalStorageAccountPreparer() + def test_receive_one_message(self, resource_group, location, storage_account, storage_account_key): + # Action + qsc = QueueServiceClient(self.account_url(storage_account, "queue"), storage_account_key) + queue_client = self._get_queue_reference(qsc) + queue_client.create_queue() + self.assertIsNone(queue_client.receive_message()) + + queue_client.send_message(u'message1') + queue_client.send_message(u'message2') + queue_client.send_message(u'message3') + + message1 = queue_client.receive_message() + message2 = queue_client.receive_message() + peeked_message3 = queue_client.peek_messages()[0] + + # Asserts + self.assertIsNotNone(message1) + self.assertNotEqual('', message1.id) + self.assertEqual(u'message1', message1.content) + self.assertNotEqual('', message1.pop_receipt) + self.assertEqual(1, message1.dequeue_count) + + self.assertIsNotNone(message2) + self.assertNotEqual('', message2.id) + self.assertEqual(u'message2', message2.content) + self.assertNotEqual('', message2.pop_receipt) + self.assertEqual(1, message2.dequeue_count) + + self.assertEqual(u'message3', peeked_message3.content) + self.assertEqual(0, peeked_message3.dequeue_count) + @GlobalStorageAccountPreparer() def test_get_messages_with_options(self, resource_group, location, storage_account, storage_account_key): # Action diff --git a/sdk/storage/azure-storage-queue/tests/test_queue_async.py b/sdk/storage/azure-storage-queue/tests/test_queue_async.py index dfc4d008f4de..eea4e4c9f114 100644 --- a/sdk/storage/azure-storage-queue/tests/test_queue_async.py +++ b/sdk/storage/azure-storage-queue/tests/test_queue_async.py @@ -62,7 +62,7 @@ def _get_queue_reference(self, qsc, prefix=TEST_QUEUE_PREFIX): queue = qsc.get_queue_client(queue_name) return queue - async def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list = None): + async def _create_queue(self, qsc, prefix=TEST_QUEUE_PREFIX, queue_list=None): queue = self._get_queue_reference(qsc, prefix) created = await queue.create_queue() if queue_list: @@ -353,6 +353,38 @@ async def test_get_messages(self, resource_group, location, storage_account, sto self.assertIsInstance(message.expires_on, datetime) self.assertIsInstance(message.next_visible_on, datetime) + @GlobalStorageAccountPreparer() + @AsyncStorageTestCase.await_prepared_test + async def test_receive_one_message(self, resource_group, location, storage_account, storage_account_key): + # Action + qsc = QueueServiceClient(self.account_url(storage_account, "queue"), storage_account_key, transport=AiohttpTestTransport()) + queue_client = await self._create_queue(qsc) + self.assertIsNone(await queue_client.receive_message()) + + await queue_client.send_message(u'message1') + await queue_client.send_message(u'message2') + await queue_client.send_message(u'message3') + + message1 = await queue_client.receive_message() + message2 = await queue_client.receive_message() + peeked_message3 = await queue_client.peek_messages() + + # Asserts + self.assertIsNotNone(message1) + self.assertNotEqual('', message1.id) + self.assertEqual(u'message1', message1.content) + self.assertNotEqual('', message1.pop_receipt) + self.assertEqual(1, message1.dequeue_count) + + self.assertIsNotNone(message2) + self.assertNotEqual('', message2.id) + self.assertEqual(u'message2', message2.content) + self.assertNotEqual('', message2.pop_receipt) + self.assertEqual(1, message2.dequeue_count) + + self.assertEqual(u'message3', peeked_message3[0].content) + self.assertEqual(0, peeked_message3[0].dequeue_count) + @GlobalStorageAccountPreparer() @AsyncStorageTestCase.await_prepared_test async def test_get_messages_with_options(self, resource_group, location, storage_account, storage_account_key):