Azure Storage Queue

Create and Manage Azure Storage Queues and Messages.

IT Services · Azure Storage Queue

Details

IDAzure Storage Queue
ProviderMicrosoft
CategoryIT Services
From Version6.0.0
Docker Imagedemisto/python3:3.12.13.10116658
Supported ModulesAgentix XSIAM

README

Azure Storage Queue

Create and Manage Azure Storage Queues and Messages.
This integration was integrated and tested with version “2020-10-02” of Azure Storage Queue

Configure Azure Storage Queue in Cortex

Parameter Description Required
Storage account name   True
Account SAS Token   False
Use Azure Managed Identities Relevant only if the integration is running on Azure VM. If selected, authenticates based on the value provided for the Azure Managed Identities Client ID field. If no value is provided for the Azure Managed Identities Client ID field, authenticates based on the System Assigned Managed Identity. For additional information, see the Help tab. False
Azure Managed Identities Client ID The Managed Identities client ID for authentication - relevant only if the integration is running on Azure VM. False
Use system proxy settings   False
Trust any certificate (not secure)   False
Maximum incidents for one fetch. Default is 10. Maximum is 32 (due to an API limit). False
Queue name The name of the queue from which the messages will be retrieved. False
Incident type   False
Fetch incidents   False

Shared Access Signatures (SAS) Permissions

In order to use the integration use-cases,
please make sure your SAS token contains the following permissions:

  1. ‘Queue’ service.
  2. ‘Service’ and ‘Object’ resource types.
  3. ‘Read’, ‘Write’, ‘Delete’, ‘List’, ‘Create’, ‘Add’, ‘Update’, ‘Process’ and ‘Immutable storage’ permissions.

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

azure-storage-queue-list


List queues in storage account.

Base Command

azure-storage-queue-list

Input

Argument Name Description Required
limit Number of queues to retrieve. Default is 50. Default is 50. Optional
prefix Filters the results to return only queues with names that begin with the specified prefix. Optional
page Page number. Default is 1. Default is 1. Optional

Context Output

Path Type Description
AzureStorageQueue.Queue.name String Queue name.

Command Example

!azure-storage-queue-list limit="2" prefix="xs"

Context Example

{
    "AzureStorageQueue": {
        "Queue": [
            {
                "name": "xsoar-new-test"
            },
            {
                "name": "xsoar-test"
            }
        ]
    }
}

Human Readable Output

Queues List

Current page size: 2
Showing page 1 out others that may exist

Name
xsoar-new-test
xsoar-test

azure-storage-queue-create


Create new queue in storage account.

Base Command

azure-storage-queue-create

Input

Argument Name Description Required
queue_name The name of the Queue to create. Rules for naming queues can be found here: https://docs.microsoft.com/en-us/rest/api/storageservices/naming-queues-and-metadata. Required

Context Output

There is no context output for this command.

Command Example

!azure-storage-queue-create queue_name="xsoar-test"

Human Readable Output

Queue xsoar-test successfully created.

azure-storage-queue-delete


Delete queue from storage account.

Base Command

azure-storage-queue-delete

Input

Argument Name Description Required
queue_name The name of the Queue to delete. Required

Context Output

There is no context output for this command.

Command Example

!azure-storage-queue-delete queue_name="xsoar-test"

Human Readable Output

Queue xsoar-test successfully deleted.

azure-storage-queue-message-create


Add a new message to the back of the queue.

Base Command

azure-storage-queue-message-create

Input

Argument Name Description Required
message_content The text content of the new message. Required
queue_name The name of the Queue. Required
base64_encoding Indicates whether the message should be encoded or not. Default is ‘False’. Possible values are: False, True. Default is False. Optional
visibility_time_out Specifies the new visibility timeout value, in seconds, relative to server time. 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.
Default is 0.
Optional
expiration Specifies the time-to-live (expiration) interval for the message, in seconds.
the maximum time-to-live can be any positive number, as well as -1 indicating that the message does not expire.
Default expiration time is 7 days.
Optional

Context Output

Path Type Description
AzureStorageQueue.Queue.Message.MessageId String Message ID.
AzureStorageQueue.Queue.Message.InsertionTime Date Message insertion time.
AzureStorageQueue.Queue.Message.ExpirationTime Date Message expiration time.
AzureStorageQueue.Queue.Message.PopReceipt String Message pop receipt value. This value changes each time the message is retrieved or updated and used to ensure that message has not been dequeued by another user before deleting or updating the message.
AzureStorageQueue.Queue.Message.TimeNextVisible Date Message next visible time.
AzureStorageQueue.Queue.name String Queue name.

Command Example

!azure-storage-queue-message-create message_content="test demo" queue_name="xsoar-test" base64_encoding="True"

Context Example

{
    "AzureStorageQueue": {
        "Queue": {
            "Message": {
                "ExpirationTime": "2021-12-05T11:55:31",
                "InsertionTime": "2021-11-28T11:55:31",
                "MessageId": "0d579602-222f-4256-9003-8772f0d65399",
                "PopReceipt": "AgAAAAMAAAAAAAAAN734107k1wE=",
                "TimeNextVisible": "2021-11-28T11:55:31"
            },
            "name": "xsoar-test"
        }
    }
}

Human Readable Output

xsoar-test Queue message

Message Id Expiration Time Insertion Time Time Next Visible Pop Receipt
0d579602-222f-4256-9003-8772f0d65399 2021-12-05T11:55:31 2021-11-28T11:55:31 2021-11-28T11:55:31 AgAAAAMAAAAAAAAAN734107k1wE=

azure-storage-queue-message-get


Retrieves messages from the front of the queue. Retrieved messages will move to the end of the queue,and will be visible after ‘TimeNextVisible’ param.

Base Command

azure-storage-queue-message-get

Input

Argument Name Description Required
limit Number of messages to retrieve. Default is 1, maximum is 32. Default is 1. Optional
queue_name The name of the Queue. Required
visibility_time_out Specifies the new visibility timeout value, in seconds, relative to server time. The default value is 30 seconds.
A specified value must be larger than or equal to 1.
Optional

Context Output

Path Type Description
AzureStorageQueue.Queue.Message.MessageId String Message ID.
AzureStorageQueue.Queue.Message.InsertionTime Date Message insertion time.
AzureStorageQueue.Queue.Message.ExpirationTime Date Message expiration time.
AzureStorageQueue.Queue.Message.PopReceipt String Message pop receipt value. This value changes each time the message is retrieved or updated and used to ensure that message has not been dequeued by another user before deleting or updating the message.
AzureStorageQueue.Queue.Message.TimeNextVisible Date Message next visible time.
AzureStorageQueue.Queue.Message.MessageText String Message text content.
AzureStorageQueue.Queue.name String Queue name.
AzureStorageQueue.Queue.Message.DequeueCount Number Indicates how many times a message has been retrieved.

Command Example

!azure-storage-queue-message-get limit="1" queue_name="xsoar-test"

Context Example

{
    "AzureStorageQueue": {
        "Queue": {
            "Message": [
                {
                    "DequeueCount": "1",
                    "ExpirationTime": "2021-12-05T11:55:31",
                    "InsertionTime": "2021-11-28T11:55:31",
                    "MessageId": "0d579602-222f-4256-9003-8772f0d65399",
                    "MessageText": "test demo",
                    "PopReceipt": "AgAAAAMAAAAAAAAAziUx7U7k1wE=",
                    "TimeNextVisible": "2021-11-28T11:56:06"
                }
            ],
            "name": "xsoar-test"
        }
    }
}

Human Readable Output

xsoar-test Queue messages

Message Text Message Id Pop Receipt Dequeue Count Expiration Time Insertion Time Time Next Visible
test demo 0d579602-222f-4256-9003-8772f0d65399 AgAAAAMAAAAAAAAAziUx7U7k1wE= 1 2021-12-05T11:55:31 2021-11-28T11:55:31 2021-11-28T11:56:06

azure-storage-queue-message-peek


Retrieves messages from the front of the queue. The command does not alter the visibility of the message.

Base Command

azure-storage-queue-message-peek

Input

Argument Name Description Required
limit Number of messages to retrieve. Default is 1, maximum is 32. Default is 1. Optional
queue_name The name of the Queue. Required

Context Output

Path Type Description
AzureStorageQueue.Queue.Message.MessageId String Message ID.
AzureStorageQueue.Queue.Message.InsertionTime Date Message insertion time.
AzureStorageQueue.Queue.Message.ExpirationTime Date Message expiration time.
AzureStorageQueue.Queue.Message.MessageText String Message text content.
AzureStorageQueue.Queue.name String Queue name.
AzureStorageQueue.Queue.Message.DequeueCount Number Indicates how many times a message has been retrieved.

Command Example

!azure-storage-queue-message-peek limit="1" queue_name="xsoar-test"

Context Example

{
    "AzureStorageQueue": {
        "Queue": {
            "Message": [],
            "name": "xsoar-test"
        }
    }
}

Human Readable Output

xsoar-test Queue messages

No entries.

azure-storage-queue-message-dequeue


Dequeue a message from the front of the queue.

Base Command

azure-storage-queue-message-dequeue

Input

Argument Name Description Required
queue_name The name of the Queue. Required

Context Output

There is no context output for this command.

Command Example

!azure-storage-queue-message-dequeue queue_name="xsoar-test"

Human Readable Output

There are no messages in xsoar-test queue.

azure-storage-queue-message-update


Update message content in the queue.

Base Command

azure-storage-queue-message-update

Input

Argument Name Description Required
queue_name The name of the Queue. Required
message_content New message content. Required
message_id The ID of the message to update. Required
pop_receipt Message PopReceipt parameter. This value changes each time the message is retrieved or updated and used to ensure that message has not been dequeued by another user before deleting or updating the message. Required
base64_encoding Indicates whether the message content should be encoded or not. Default is ‘False’. Possible values are: False, True. Default is False. Optional
visibility_time_out Specifies the new visibility timeout value of the message. The new 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. Default is 0. Possible values are: . Default is 0. Optional

Context Output

There is no context output for this command.

Command Example

!azure-storage-queue-message-update queue_name="test-xsoar" message_content="new content" message_id="ea0db196-dad3-4c12-b845-dc6223739870" pop_receipt="AgAAAAMAAAAAAAAA0xNSmE7k1wE="

Human Readable Output

The message in test-xsoar successfully updated.

azure-storage-queue-message-delete


Delete message from a Queue.

Base Command

azure-storage-queue-message-delete

Input

Argument Name Description Required
message_id The ID of the message to delete. Required
pop_receipt Message PopReceipt parameter. This value changes each time the message is retrieved or updated and used to ensure that message has not been dequeued by another user before deleting or updating the message. Required
queue_name The name of the Queue. Required

Context Output

There is no context output for this command.

Command Example

!azure-storage-queue-message-delete queue_name="test-xsoar" message_id="66df94e9-4a66-428a-9c4a-e2a3c4fe7284" pop_receipt="AgAAAAMAAAAAAAAA0xNSmE7k1wE="

Human Readable Output

Message in test-xsoar successfully deleted.

azure-storage-queue-message-clear


Delete all messages from the specified Queue.

Base Command

azure-storage-queue-message-clear

Input

Argument Name Description Required
queue_name The name of the queue. Required

Context Output

There is no context output for this command.

Command Example

!azure-storage-queue-message-clear queue_name="xsoar-test"

Human Readable Output

xsoar-test was cleared of messages successfully.

Configuration parameters

  • credentials — Storage account name
  • use_managed_identities — Use Azure Managed Identities
  • managed_identities_client_id
  • proxy — Use system proxy settings
  • insecure — Trust any certificate (not secure)
  • max_fetch — Maximum incidents for one fetch.
  • queue_name — Queue name
  • incidentType — Incident type
  • incidentFetchInterval — Incidents Fetch Interval
  • isFetch — Fetch incidents

Commands (10)

  • azure-storage-queue-create

    Create new queue in storage account.

  • azure-storage-queue-delete

    Delete queue from storage account.

  • azure-storage-queue-list

    List queues in storage account.

  • azure-storage-queue-message-clear

    Delete all messages from the specified Queue.

  • azure-storage-queue-message-create

    Add a new message to the back of the queue.

  • azure-storage-queue-message-delete

    Delete message from a Queue.

  • azure-storage-queue-message-dequeue

    Dequeue a message from the front of the queue.

  • azure-storage-queue-message-get

    Retrieves messages from the front of the queue. Retrieved messages will move to the end of the queue,and will be visible after 'TimeNextVisible' param.

  • azure-storage-queue-message-peek

    Retrieves messages from the front of the queue. The command does not alter the visibility of the message.

  • azure-storage-queue-message-update

    Update message content in the queue.

import defusedxml.ElementTree as defused_ET
import pytest
from CommonServerPython import *

ACCOUNT_NAME = "test"
BASE_URL = f"https://{ACCOUNT_NAME}.queue.core.windows.net"
SAS_TOKEN = "XXXX"
API_VERSION = "2020-10-02"


def load_xml_mock_response(file_name: str) -> str:
    """
    Load one of the mock responses to be used for assertion.
    Args:
        file_name (str): Name of the mock response XML file to return.
    """
    file_path = f"test_data/{file_name}"

    top = defused_ET.parse(file_path)
    return ET.tostring(top.getroot(), encoding="utf8").decode("utf-8")


def test_azure_storage_queue_list_queues_command(requests_mock):
    """
    Scenario: List queues.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-list called.
    Then:
     - Ensure number of items is correct.
     - Ensure outputs prefix is correct.
     - Ensure a sample value from the API matches what is generated in the context.
    """
    from AzureStorageQueue import Client, list_queues_command

    url = f"{BASE_URL}/?{SAS_TOKEN}&comp=list&maxresults=50"

    mock_response = load_xml_mock_response("queues.xml")
    requests_mock.get(url, text=mock_response)

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = list_queues_command(client, {})

    assert len(result.outputs) == 3
    assert result.outputs_prefix == "AzureStorageQueue.Queue"
    assert result.outputs[0].get("name") == "my-queue"
    assert result.outputs[1].get("name") == "test"
    assert result.outputs[2].get("name") == "xsoar-test"


def test_azure_storage_queue_create_queue_command(requests_mock):
    """
    Scenario: Create queue.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-queue-create called.
    Then:
     - Ensure that the output is empty (None).
     - Ensure validation of the queue name.
     - Ensure readable output message content.
    """
    from AzureStorageQueue import Client, create_queue_command

    queue_name = "test-queue"
    url = f"{BASE_URL}/{queue_name}?{SAS_TOKEN}"

    requests_mock.put(url, text="", status_code=201)

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = create_queue_command(client, {"queue_name": queue_name})

    assert result.outputs is None
    assert result.outputs_prefix is None
    assert result.readable_output == f"Queue {queue_name} successfully created."

    invalid_queue_name = "test--1"

    with pytest.raises(Exception):
        create_queue_command(client, {"queue_name": invalid_queue_name})


def test_azure_storage_queue_delete_queue_command(requests_mock):
    """
    Scenario: Delete queue.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-delete called.
    Then:
     - Ensure that the output is empty (None).
     - Ensure readable output message content.
    """
    from AzureStorageQueue import Client, delete_queue_command

    queue_name = "test-queue"
    url = f"{BASE_URL}/{queue_name}?{SAS_TOKEN}"

    requests_mock.delete(url, text="")

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = delete_queue_command(client, {"queue_name": queue_name})

    assert result.outputs is None
    assert result.outputs_prefix is None
    assert result.readable_output == f"Queue {queue_name} successfully deleted."


def test_azure_storage_queue_create_message_command(requests_mock):
    """
    Scenario: Create message.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-create called.
    Then:
     - Ensure number of items is correct.
     - Ensure outputs prefix is correct.
     - Ensure a sample value from the API matches what is generated in the context.
    """
    from AzureStorageQueue import Client, create_message_command

    queue_name = "test-queue"
    url = f"{BASE_URL}/{queue_name}/messages?{SAS_TOKEN}"

    mock_response = load_xml_mock_response("create_message.xml")
    requests_mock.post(url, text=mock_response)

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = create_message_command(client, {"message_content": "test", "queue_name": queue_name})

    assert len(result.outputs) == 2
    assert result.outputs_prefix == "AzureStorageQueue.Queue"
    assert result.outputs.get("name") == queue_name
    assert len(result.outputs.get("Message")) == 5
    assert result.outputs.get("Message").get("MessageId") == "111111111"
    assert result.outputs.get("Message").get("InsertionTime") == "2021-08-10T13:42:46"


def test_azure_storage_queue_get_messages_command(requests_mock):
    """
    Scenario: Get messages.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-get called.
    Then:
     - Ensure number of items is correct.
     - Ensure outputs prefix is correct.
     - Ensure a sample value from the API matches what is generated in the context.
    """
    from AzureStorageQueue import Client, get_messages_command

    queue_name = "test-queue"
    url = f"{BASE_URL}/{queue_name}/messages?{SAS_TOKEN}&numofmessages=1"

    mock_response = load_xml_mock_response("get_message.xml")
    requests_mock.get(url, text=mock_response)

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = get_messages_command(client, {"queue_name": queue_name})

    assert len(result.outputs) == 2
    assert len(result.outputs.get("Message")) == 1
    assert len(result.outputs.get("Message")[0]) == 7
    assert result.outputs_prefix == "AzureStorageQueue.Queue"
    assert result.outputs.get("Message")[0].get("MessageId") == "1111111111111"
    assert result.outputs.get("Message")[0].get("InsertionTime") == "2021-08-22T13:00:49"
    assert result.outputs.get("name") == queue_name


def test_azure_storage_queue_peek_messages_command(requests_mock):
    """
    Scenario: Peek message.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-peek called.
    Then:
     - Ensure number of items is correct.
     - Ensure outputs prefix is correct.
     - Ensure a sample value from the API matches what is generated in the context.
    """
    from AzureStorageQueue import Client, peek_messages_command

    queue_name = "test-queue"
    url = f"{BASE_URL}/{queue_name}/messages?{SAS_TOKEN}&numofmessages=1&peekonly=true"

    mock_response = load_xml_mock_response("peek_message.xml")
    requests_mock.get(url, text=mock_response)

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = peek_messages_command(client, {"queue_name": queue_name})

    assert len(result.outputs) == 2
    assert len(result.outputs.get("Message")) == 1
    assert len(result.outputs.get("Message")[0]) == 5
    assert result.outputs_prefix == "AzureStorageQueue.Queue"
    assert result.outputs.get("Message")[0].get("MessageId") == "222222222"
    assert result.outputs.get("Message")[0].get("InsertionTime") == "2021-08-22T13:00:49"
    assert result.outputs.get("Message")[0].get("TimeNextVisible") is None
    assert result.outputs.get("name") == queue_name


def test_azure_storage_queue_dequeue_messages_command(requests_mock):
    """
    Scenario: Dequeue message.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-dequeue called.
    Then:
     - Ensure that the output is empty (None).
     - Ensure readable output message content.
    """
    from AzureStorageQueue import Client, dequeue_message_command

    queue_name = "test-queue"
    get_url = f"{BASE_URL}/{queue_name}/messages?{SAS_TOKEN}&numofmessages=1&visibilitytimeout=30"

    mock_response = load_xml_mock_response("get_message.xml")
    requests_mock.get(get_url, text=mock_response)

    message_id = "1111111111111"
    pop_receipt = "AgAAAAMAAAAAAAAAsIN/0VWX1wE="

    delete_url = f"{BASE_URL}/{queue_name}/messages/{message_id}?{SAS_TOKEN}&popreceipt={pop_receipt}"
    requests_mock.delete(delete_url, text="")

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = dequeue_message_command(client, {"queue_name": queue_name})

    assert result.outputs is None
    assert result.outputs_prefix is None
    assert result.readable_output == f"Message in {queue_name} successfully deleted."


def test_azure_storage_queue_update_messages_command(requests_mock):
    """
    Scenario: Update message.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-update called.
    Then:
     - Ensure that the output is empty (None).
     - Ensure readable output message content.
    """
    from AzureStorageQueue import Client, update_message_command

    queue_name = "test-queue"

    message_id = "1111111111111"
    pop_receipt = "AgAAAAMAAAAAAAAAsIN/0VWX1wE="
    visibility_time_out = "30"

    url = (
        f"{BASE_URL}/{queue_name}/messages/{message_id}?{SAS_TOKEN}"
        f"&popreceipt={pop_receipt}&visibilitytimeout={visibility_time_out}"
    )

    requests_mock.put(url, text="")

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = update_message_command(
        client,
        {
            "queue_name": queue_name,
            "message_id": message_id,
            "pop_receipt": pop_receipt,
            "message_content": "update test",
            "visibility_time_out": visibility_time_out,
        },
    )

    assert result.outputs is None
    assert result.outputs_prefix is None
    assert result.readable_output == f"The message in {queue_name} successfully updated."


def test_azure_storage_queue_delete_messages_command(requests_mock):
    """
    Scenario: Delete message.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-delete called.
    Then:
     - Ensure that the output is empty (None).
     - Ensure readable output message content.
    """
    from AzureStorageQueue import Client, delete_message_command

    queue_name = "test-queue"

    message_id = "1111111111111"
    pop_receipt = "AgAAAAMAAAAAAAAAsIN/0VWX1wE="

    delete_url = f"{BASE_URL}/{queue_name}/messages/{message_id}?{SAS_TOKEN}&popreceipt={pop_receipt}"
    requests_mock.delete(delete_url, text="")

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = delete_message_command(client, {"queue_name": queue_name, "message_id": message_id, "pop_receipt": pop_receipt})

    assert result.outputs is None
    assert result.outputs_prefix is None
    assert result.readable_output == f"Message in {queue_name} successfully deleted."


def test_azure_storage_queue_clear_queue_command(requests_mock):
    """
    Scenario: Clear queue messages command.
    Given:
     - User has provided valid credentials.
    When:
     - azure-storage-queue-message-clear called.
    Then:
     - Ensure that the output is empty (None).
     - Ensure readable output message content.
    """
    from AzureStorageQueue import Client, clear_messages_command

    queue_name = "test-queue"

    url = f"/{queue_name}/messages?{SAS_TOKEN}"
    requests_mock.delete(url, text="")

    client = Client(
        server_url=BASE_URL,
        verify=False,
        proxy=False,
        account_sas_token=SAS_TOKEN,
        storage_account_name=ACCOUNT_NAME,
        api_version=API_VERSION,
    )
    result = clear_messages_command(client, {"queue_name": queue_name})

    assert result.outputs is None
    assert result.outputs_prefix is None
    assert result.readable_output == f"{queue_name} was cleared of messages successfully."


@pytest.mark.parametrize(argnames="client_id", argvalues=["test_client_id", None])
def test_test_module_command_with_managed_identities(mocker, requests_mock, client_id):
    """
    Given:
        - Managed Identities client id for authentication.
    When:
        - Calling test_module.
    Then:
        - Ensure the output are as expected.
    """

    import re

    import AzureStorageQueue
    import demistomock as demisto
    from AzureStorageQueue import MANAGED_IDENTITIES_TOKEN_URL, main

    mock_token = {"access_token": "test_token", "expires_in": "86400"}
    get_mock = requests_mock.get(MANAGED_IDENTITIES_TOKEN_URL, json=mock_token)
    requests_mock.get(re.compile(".queue.core.windows.net/.*"))

    params = {
        "managed_identities_client_id": {"password": client_id},
        "use_managed_identities": "True",
        "credentials": {"identifier": "test_storage_account_name"},
        "max_fetch": 20,
    }
    mocker.patch.object(demisto, "params", return_value=params)
    mocker.patch.object(demisto, "command", return_value="test-module")
    mocker.patch.object(AzureStorageQueue, "return_results", return_value=params)

    main()

    assert "ok" in AzureStorageQueue.return_results.call_args[0][0]
    qs = get_mock.last_request.qs
    assert (client_id and qs["client_id"] == [client_id]) or "client_id" not in qs