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"}}
							 | 
						||
| 
								 | 
							
								            ],
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								    )
							 |