155 lines
5.1 KiB
Python
155 lines
5.1 KiB
Python
|
import boto3
|
||
|
import json
|
||
|
import sure # noqa # pylint: disable=unused-import
|
||
|
|
||
|
from botocore.exceptions import ClientError
|
||
|
import pytest
|
||
|
from moto import mock_sns, mock_sqs
|
||
|
from moto.core import ACCOUNT_ID
|
||
|
|
||
|
|
||
|
@mock_sns
|
||
|
def test_publish_batch_unknown_topic():
|
||
|
client = boto3.client("sns", region_name="us-east-1")
|
||
|
with pytest.raises(ClientError) as exc:
|
||
|
client.publish_batch(
|
||
|
TopicArn=f"arn:aws:sns:us-east-1:{ACCOUNT_ID}:unknown",
|
||
|
PublishBatchRequestEntries=[{"Id": "id_1", "Message": "1"}],
|
||
|
)
|
||
|
err = exc.value.response["Error"]
|
||
|
err["Code"].should.equal("NotFound")
|
||
|
err["Message"].should.equal("Topic does not exist")
|
||
|
|
||
|
|
||
|
@mock_sns
|
||
|
def test_publish_batch_too_many_items():
|
||
|
client = boto3.client("sns", region_name="eu-north-1")
|
||
|
topic = client.create_topic(Name="some-topic")
|
||
|
|
||
|
with pytest.raises(ClientError) as exc:
|
||
|
client.publish_batch(
|
||
|
TopicArn=topic["TopicArn"],
|
||
|
PublishBatchRequestEntries=[
|
||
|
{"Id": f"id_{idx}", "Message": f"{idx}"} for idx in range(11)
|
||
|
],
|
||
|
)
|
||
|
err = exc.value.response["Error"]
|
||
|
err["Code"].should.equal("TooManyEntriesInBatchRequest")
|
||
|
err["Message"].should.equal(
|
||
|
"The batch request contains more entries than permissible."
|
||
|
)
|
||
|
|
||
|
|
||
|
@mock_sns
|
||
|
def test_publish_batch_non_unique_ids():
|
||
|
client = boto3.client("sns", region_name="us-west-2")
|
||
|
topic = client.create_topic(Name="some-topic")
|
||
|
|
||
|
with pytest.raises(ClientError) as exc:
|
||
|
client.publish_batch(
|
||
|
TopicArn=topic["TopicArn"],
|
||
|
PublishBatchRequestEntries=[
|
||
|
{"Id": f"id", "Message": f"{idx}"} for idx in range(5)
|
||
|
],
|
||
|
)
|
||
|
err = exc.value.response["Error"]
|
||
|
err["Code"].should.equal("BatchEntryIdsNotDistinct")
|
||
|
err["Message"].should.equal(
|
||
|
"Two or more batch entries in the request have the same Id."
|
||
|
)
|
||
|
|
||
|
|
||
|
@mock_sns
|
||
|
def test_publish_batch_fifo_without_message_group_id():
|
||
|
client = boto3.client("sns", region_name="us-east-1")
|
||
|
topic = client.create_topic(
|
||
|
Name="fifo_without_msg.fifo",
|
||
|
Attributes={"FifoTopic": "true", "ContentBasedDeduplication": "true"},
|
||
|
)
|
||
|
|
||
|
with pytest.raises(ClientError) as exc:
|
||
|
client.publish_batch(
|
||
|
TopicArn=topic["TopicArn"],
|
||
|
PublishBatchRequestEntries=[{"Id": f"id_2", "Message": f"2"}],
|
||
|
)
|
||
|
err = exc.value.response["Error"]
|
||
|
err["Code"].should.equal("InvalidParameter")
|
||
|
err["Message"].should.equal(
|
||
|
"Invalid parameter: The MessageGroupId parameter is required for FIFO topics"
|
||
|
)
|
||
|
|
||
|
|
||
|
@mock_sns
|
||
|
def test_publish_batch_standard_with_message_group_id():
|
||
|
client = boto3.client("sns", region_name="us-east-1")
|
||
|
topic_arn = client.create_topic(Name="standard_topic")["TopicArn"]
|
||
|
entries = [
|
||
|
{"Id": f"id_1", "Message": f"1"},
|
||
|
{"Id": f"id_2", "Message": f"2", "MessageGroupId": "mgid"},
|
||
|
{"Id": f"id_3", "Message": f"3"},
|
||
|
]
|
||
|
resp = client.publish_batch(TopicArn=topic_arn, PublishBatchRequestEntries=entries)
|
||
|
|
||
|
resp.should.have.key("Successful").length_of(2)
|
||
|
for message_status in resp["Successful"]:
|
||
|
message_status.should.have.key("MessageId")
|
||
|
[m["Id"] for m in resp["Successful"]].should.equal(["id_1", "id_3"])
|
||
|
|
||
|
resp.should.have.key("Failed").length_of(1)
|
||
|
resp["Failed"][0].should.equal(
|
||
|
{
|
||
|
"Id": "id_2",
|
||
|
"Code": "InvalidParameter",
|
||
|
"Message": "Invalid parameter: Value mgid for parameter MessageGroupId is invalid. Reason: The request include parameter that is not valid for this queue type.",
|
||
|
"SenderFault": True,
|
||
|
}
|
||
|
)
|
||
|
|
||
|
|
||
|
@mock_sns
|
||
|
@mock_sqs
|
||
|
def test_publish_batch_to_sqs():
|
||
|
client = boto3.client("sns", region_name="us-east-1")
|
||
|
topic_arn = client.create_topic(Name="standard_topic")["TopicArn"]
|
||
|
entries = [
|
||
|
{"Id": f"id_1", "Message": f"1"},
|
||
|
{"Id": f"id_2", "Message": f"2", "Subject": "subj2"},
|
||
|
{
|
||
|
"Id": f"id_3",
|
||
|
"Message": f"3",
|
||
|
"MessageAttributes": {"a": {"DataType": "String", "StringValue": "v"}},
|
||
|
},
|
||
|
]
|
||
|
|
||
|
sqs_conn = boto3.resource("sqs", region_name="us-east-1")
|
||
|
queue = sqs_conn.create_queue(QueueName="test-queue")
|
||
|
|
||
|
queue_url = "arn:aws:sqs:us-east-1:{}:test-queue".format(ACCOUNT_ID)
|
||
|
client.subscribe(
|
||
|
TopicArn=topic_arn, Protocol="sqs", Endpoint=queue_url,
|
||
|
)
|
||
|
|
||
|
resp = client.publish_batch(TopicArn=topic_arn, PublishBatchRequestEntries=entries)
|
||
|
|
||
|
resp.should.have.key("Successful").length_of(3)
|
||
|
|
||
|
messages = queue.receive_messages(MaxNumberOfMessages=3)
|
||
|
messages.should.have.length_of(3)
|
||
|
|
||
|
messages = [json.loads(m.body) for m in messages]
|
||
|
for m in messages:
|
||
|
for key in list(m.keys()):
|
||
|
if key not in ["Message", "Subject", "MessageAttributes"]:
|
||
|
del m[key]
|
||
|
|
||
|
messages.should.contain({"Message": "1"})
|
||
|
messages.should.contain({"Message": "2", "Subject": "subj2"})
|
||
|
messages.should.contain(
|
||
|
{
|
||
|
"Message": "3",
|
||
|
"MessageAttributes": [
|
||
|
{"Name": "a", "Value": {"DataType": "String", "StringValue": "v"}}
|
||
|
],
|
||
|
}
|
||
|
)
|