| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | import base64 | 
					
						
							| 
									
										
										
										
											2017-07-30 20:44:06 +08:00
										 |  |  | import json | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | import boto3 | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  | import re | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | from freezegun import freeze_time | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  | from botocore.exceptions import ClientError | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  | import pytest | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  | from moto import mock_sns, mock_sqs, settings | 
					
						
							| 
									
										
										
										
											2019-12-16 21:05:29 -05:00
										 |  |  | from moto.core import ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2021-01-15 01:12:41 -08:00
										 |  |  | from moto.core.models import responses_mock | 
					
						
							| 
									
										
										
										
											2022-03-03 22:25:06 -01:00
										 |  |  | from moto.sns import sns_backends | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-16 21:25:20 -05:00
										 |  |  | MESSAGE_FROM_SQS_TEMPLATE = ( | 
					
						
							|  |  |  |     '{\n  "Message": "%s",\n  "MessageId": "%s",\n  "Signature": "EXAMPLElDMXvB8r9R83tGoNn0ecwd5UjllzsvSvbItzfaMpN2nk5HVSw7XnOn/49IkxDKz8YrlH2qJXj2iZB0Zo2O71c4qQk1fMUDi3LGpij7RCW7AW9vYYsSqIKRnFS94ilu7NFhUzLiieYr4BKHpdTmdD6c0esKEYBpabxDSc=",\n  "SignatureVersion": "1",\n  "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-f3ecfb7224c7233fe7bb5f59f96de52f.pem",\n  "Subject": "my subject",\n  "Timestamp": "2015-01-01T12:00:00.000Z",\n  "TopicArn": "arn:aws:sns:%s:' | 
					
						
							|  |  |  |     + ACCOUNT_ID | 
					
						
							|  |  |  |     + ':some-topic",\n  "Type": "Notification",\n  "UnsubscribeURL": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&SubscriptionArn=arn:aws:sns:us-east-1:' | 
					
						
							|  |  |  |     + ACCOUNT_ID | 
					
						
							|  |  |  |     + ':some-topic:2bcfbf39-05c3-41de-beaa-fcfcc21c8f55"\n}' | 
					
						
							|  |  |  | ) | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs_conn = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  |     sqs_conn.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         Endpoint="arn:aws:sqs:us-east-1:{}:test-queue".format(ACCOUNT_ID), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     message = "my message" | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							| 
									
										
										
										
											2021-10-27 11:57:25 -07:00
										 |  |  |         published_message = conn.publish( | 
					
						
							|  |  |  |             TopicArn=topic_arn, Message=message, Subject="my subject" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     published_message_id = published_message["MessageId"] | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     queue = sqs_conn.get_queue_by_name(QueueName="test-queue") | 
					
						
							| 
									
										
										
										
											2021-05-13 23:06:54 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:01"): | 
					
						
							|  |  |  |         messages = queue.receive_messages(MaxNumberOfMessages=1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     expected = MESSAGE_FROM_SQS_TEMPLATE % (message, published_message_id, "us-east-1") | 
					
						
							|  |  |  |     acquired_message = re.sub( | 
					
						
							| 
									
										
										
										
											2020-09-10 13:50:26 +05:30
										 |  |  |         r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "2015-01-01T12:00:00.000Z", | 
					
						
							|  |  |  |         messages[0].body, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  |     acquired_message.should.equal(expected) | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_raw(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic(Name="some-topic") | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     queue = sqs.create_queue(QueueName="test-queue") | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscription = topic.subscribe( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Protocol="sqs", Endpoint=queue.attributes["QueueArn"] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscription.set_attributes( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         AttributeName="RawMessageDelivery", AttributeValue="true" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message = "my message" | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							|  |  |  |         topic.publish(Message=message) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-05-13 23:06:54 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:01"): | 
					
						
							|  |  |  |         messages = queue.receive_messages(MaxNumberOfMessages=1) | 
					
						
							| 
									
										
										
										
											2018-05-29 16:06:25 +02:00
										 |  |  |     messages[0].body.should.equal(message) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | def test_publish_to_sqs_fifo(): | 
					
						
							|  |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic( | 
					
						
							|  |  |  |         Name="topic.fifo", | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |         Attributes={"FifoTopic": "true", "ContentBasedDeduplication": "true"}, | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sqs = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     queue = sqs.create_queue( | 
					
						
							|  |  |  |         QueueName="queue.fifo", | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |         Attributes={"FifoQueue": "true", "ContentBasedDeduplication": "true"}, | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |     topic.subscribe(Protocol="sqs", Endpoint=queue.attributes["QueueArn"]) | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish(Message="message", MessageGroupId="message_group_id") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_bad(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs_conn = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     sqs_conn.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         Endpoint="arn:aws:sqs:us-east-1:{}:test-queue".format(ACCOUNT_ID), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     message = "my message" | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     try: | 
					
						
							|  |  |  |         # Test missing Value | 
					
						
							|  |  |  |         conn.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             TopicArn=topic_arn, | 
					
						
							|  |  |  |             Message=message, | 
					
						
							|  |  |  |             MessageAttributes={"store": {"DataType": "String"}}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     except ClientError as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         err.response["Error"]["Code"].should.equal("InvalidParameterValue") | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     try: | 
					
						
							|  |  |  |         # Test empty DataType (if the DataType field is missing entirely | 
					
						
							|  |  |  |         # botocore throws an exception during validation) | 
					
						
							|  |  |  |         conn.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             TopicArn=topic_arn, | 
					
						
							|  |  |  |             Message=message, | 
					
						
							|  |  |  |             MessageAttributes={ | 
					
						
							|  |  |  |                 "store": {"DataType": "", "StringValue": "example_corp"} | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     except ClientError as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         err.response["Error"]["Code"].should.equal("InvalidParameterValue") | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     try: | 
					
						
							|  |  |  |         # Test empty Value | 
					
						
							|  |  |  |         conn.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             TopicArn=topic_arn, | 
					
						
							|  |  |  |             Message=message, | 
					
						
							|  |  |  |             MessageAttributes={"store": {"DataType": "String", "StringValue": ""}}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     except ClientError as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         err.response["Error"]["Code"].should.equal("InvalidParameterValue") | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     try: | 
					
						
							|  |  |  |         # Test Number DataType, with a non numeric value | 
					
						
							|  |  |  |         conn.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             TopicArn=topic_arn, | 
					
						
							|  |  |  |             Message=message, | 
					
						
							|  |  |  |             MessageAttributes={"price": {"DataType": "Number", "StringValue": "error"}}, | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     except ClientError as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         err.response["Error"]["Code"].should.equal("InvalidParameterValue") | 
					
						
							|  |  |  |         err.response["Error"]["Message"].should.equal( | 
					
						
							|  |  |  |             "An error occurred (ParameterValueInvalid) when calling the Publish operation: Could not cast message attribute 'price' value to number." | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_msg_attr_byte_value(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |     sqs = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     queue = sqs.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  |     conn.subscribe( | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  |         TopicArn=topic_arn, Protocol="sqs", Endpoint=queue.attributes["QueueArn"] | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  |     queue_raw = sqs.create_queue(QueueName="test-queue-raw") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |         Endpoint=queue_raw.attributes["QueueArn"], | 
					
						
							|  |  |  |         Attributes={"RawMessageDelivery": "true"}, | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  |     conn.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         TopicArn=topic_arn, | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |         Message="my message", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "Binary", "BinaryValue": b"\x02\x03\x04"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     message = json.loads(queue.receive_messages()[0].body) | 
					
						
							|  |  |  |     message["Message"].should.equal("my message") | 
					
						
							|  |  |  |     message["MessageAttributes"].should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "store": { | 
					
						
							|  |  |  |                 "Type": "Binary", | 
					
						
							|  |  |  |                 "Value": base64.b64encode(b"\x02\x03\x04").decode(), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message = queue_raw.receive_messages()[0] | 
					
						
							|  |  |  |     message.body.should.equal("my message") | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-16 14:46:05 +01:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_msg_attr_number_type(): | 
					
						
							|  |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic(Name="test-topic") | 
					
						
							|  |  |  |     sqs = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     queue = sqs.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  |     topic.subscribe(Protocol="sqs", Endpoint=queue.attributes["QueueArn"]) | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |     queue_raw = sqs.create_queue(QueueName="test-queue-raw") | 
					
						
							|  |  |  |     topic.subscribe( | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							|  |  |  |         Endpoint=queue_raw.attributes["QueueArn"], | 
					
						
							|  |  |  |         Attributes={"RawMessageDelivery": "true"}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-11-16 14:46:05 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							|  |  |  |         Message="test message", | 
					
						
							|  |  |  |         MessageAttributes={"retries": {"DataType": "Number", "StringValue": "0"}}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     message = json.loads(queue.receive_messages()[0].body) | 
					
						
							|  |  |  |     message["Message"].should.equal("test message") | 
					
						
							|  |  |  |     message["MessageAttributes"].should.equal( | 
					
						
							|  |  |  |         {"retries": {"Type": "Number", "Value": 0}} | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-03-21 19:25:25 +01:00
										 |  |  |     message = queue_raw.receive_messages()[0] | 
					
						
							|  |  |  |     message.body.should.equal("test message") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-11-16 14:46:05 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-21 21:01:38 -01:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_msg_attr_different_formats(): | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     Verify different Number-formats are processed correctly | 
					
						
							|  |  |  |     """
 | 
					
						
							|  |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic(Name="test-topic") | 
					
						
							|  |  |  |     sqs = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     sqs_client = boto3.client("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     queue_raw = sqs.create_queue(QueueName="test-queue-raw") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     topic.subscribe( | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							|  |  |  |         Endpoint=queue_raw.attributes["QueueArn"], | 
					
						
							|  |  |  |         Attributes={"RawMessageDelivery": "true"}, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							|  |  |  |         Message="test message", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "integer": {"DataType": "Number", "StringValue": "123"}, | 
					
						
							|  |  |  |             "float": {"DataType": "Number", "StringValue": "12.34"}, | 
					
						
							|  |  |  |             "big-integer": {"DataType": "Number", "StringValue": "123456789"}, | 
					
						
							|  |  |  |             "big-float": {"DataType": "Number", "StringValue": "123456.789"}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     messages_resp = sqs_client.receive_message( | 
					
						
							|  |  |  |         QueueUrl=queue_raw.url, MessageAttributeNames=["All"] | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     message = messages_resp["Messages"][0] | 
					
						
							|  |  |  |     message_attributes = message["MessageAttributes"] | 
					
						
							|  |  |  |     message_attributes.should.equal( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "integer": {"DataType": "Number", "StringValue": "123"}, | 
					
						
							|  |  |  |             "float": {"DataType": "Number", "StringValue": "12.34"}, | 
					
						
							|  |  |  |             "big-integer": {"DataType": "Number", "StringValue": "123456789"}, | 
					
						
							|  |  |  |             "big-float": {"DataType": "Number", "StringValue": "123456.789"}, | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_sms(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     result = client.publish(PhoneNumber="+15551234567", Message="my message") | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     result.should.contain("MessageId") | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2022-03-03 22:25:06 -01:00
										 |  |  |         sns_backend = sns_backends["us-east-1"] | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  |         sns_backend.sms_messages.should.have.key(result["MessageId"]).being.equal( | 
					
						
							|  |  |  |             ("+15551234567", "my message") | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_bad_sms(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     client = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  |     # Test invalid number | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as cm: | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  |         client.publish(PhoneNumber="NAA+15551234567", Message="my message") | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     cm.value.response["Error"]["Code"].should.equal("InvalidParameter") | 
					
						
							|  |  |  |     cm.value.response["Error"]["Message"].should.contain("not meet the E164") | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Test to long ASCII message | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError) as cm: | 
					
						
							| 
									
										
										
										
											2020-08-25 14:05:49 +02:00
										 |  |  |         client.publish(PhoneNumber="+15551234567", Message="a" * 1601) | 
					
						
							| 
									
										
										
										
											2020-10-06 08:04:09 +02:00
										 |  |  |     cm.value.response["Error"]["Code"].should.equal("InvalidParameter") | 
					
						
							|  |  |  |     cm.value.response["Error"]["Message"].should.contain("must be less than 1600") | 
					
						
							| 
									
										
										
										
											2017-09-26 00:21:07 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_dump_json(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs_conn = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  |     sqs_conn.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         Endpoint="arn:aws:sqs:us-east-1:{}:test-queue".format(ACCOUNT_ID), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message = json.dumps( | 
					
						
							|  |  |  |         { | 
					
						
							|  |  |  |             "Records": [ | 
					
						
							|  |  |  |                 { | 
					
						
							|  |  |  |                     "eventVersion": "2.0", | 
					
						
							|  |  |  |                     "eventSource": "aws:s3", | 
					
						
							|  |  |  |                     "s3": {"s3SchemaVersion": "1.0"}, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ] | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         sort_keys=True, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							| 
									
										
										
										
											2021-10-27 11:57:25 -07:00
										 |  |  |         published_message = conn.publish( | 
					
						
							|  |  |  |             TopicArn=topic_arn, Message=message, Subject="my subject" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     published_message_id = published_message["MessageId"] | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  |     queue = sqs_conn.get_queue_by_name(QueueName="test-queue") | 
					
						
							| 
									
										
										
										
											2021-05-13 23:06:54 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:01"): | 
					
						
							|  |  |  |         messages = queue.receive_messages(MaxNumberOfMessages=1) | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  |     escaped = message.replace('"', '\\"') | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     expected = MESSAGE_FROM_SQS_TEMPLATE % (escaped, published_message_id, "us-east-1") | 
					
						
							|  |  |  |     acquired_message = re.sub( | 
					
						
							| 
									
										
										
										
											2020-09-10 13:50:26 +05:30
										 |  |  |         r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "2015-01-01T12:00:00.000Z", | 
					
						
							|  |  |  |         messages[0].body, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  |     acquired_message.should.equal(expected) | 
					
						
							| 
									
										
										
										
											2017-08-17 22:40:39 +09:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_sqs_in_different_region(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-west-1") | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs_conn = boto3.resource("sqs", region_name="us-west-2") | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  |     sqs_conn.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         Endpoint="arn:aws:sqs:us-west-2:{}:test-queue".format(ACCOUNT_ID), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message = "my message" | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							| 
									
										
										
										
											2021-10-27 11:57:25 -07:00
										 |  |  |         published_message = conn.publish( | 
					
						
							|  |  |  |             TopicArn=topic_arn, Message=message, Subject="my subject" | 
					
						
							|  |  |  |         ) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     published_message_id = published_message["MessageId"] | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     queue = sqs_conn.get_queue_by_name(QueueName="test-queue") | 
					
						
							| 
									
										
										
										
											2021-05-13 23:06:54 +09:00
										 |  |  |     with freeze_time("2015-01-01 12:00:01"): | 
					
						
							|  |  |  |         messages = queue.receive_messages(MaxNumberOfMessages=1) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     expected = MESSAGE_FROM_SQS_TEMPLATE % (message, published_message_id, "us-west-1") | 
					
						
							|  |  |  |     acquired_message = re.sub( | 
					
						
							| 
									
										
										
										
											2020-09-10 13:50:26 +05:30
										 |  |  |         r"\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z", | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         "2015-01-01T12:00:00.000Z", | 
					
						
							|  |  |  |         messages[0].body, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2017-08-22 04:29:34 +09:00
										 |  |  |     acquired_message.should.equal(expected) | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @freeze_time("2013-01-01") | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_to_http(): | 
					
						
							| 
									
										
										
										
											2017-07-30 20:44:06 +08:00
										 |  |  |     def callback(request): | 
					
						
							| 
									
										
										
										
											2018-06-02 06:18:27 +08:00
										 |  |  |         request.headers["Content-Type"].should.equal("text/plain; charset=UTF-8") | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         json.loads.when.called_with(request.body.decode()).should_not.throw(Exception) | 
					
						
							| 
									
										
										
										
											2017-07-30 20:44:06 +08:00
										 |  |  |         return 200, {}, "" | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-01-15 01:12:41 -08:00
										 |  |  |     responses_mock.add_callback( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         method="POST", url="http://example.com/foobar", callback=callback | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, Protocol="http", Endpoint="http://example.com/foobar" | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2015-08-20 11:12:25 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-02-21 21:01:38 -01:00
										 |  |  |     conn.publish(TopicArn=topic_arn, Message="my message", Subject="my subject") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if not settings.TEST_SERVER_MODE: | 
					
						
							| 
									
										
										
										
											2022-03-03 22:25:06 -01:00
										 |  |  |         sns_backend = sns_backends["us-east-1"] | 
					
						
							| 
									
										
										
										
											2022-02-21 21:01:38 -01:00
										 |  |  |         sns_backend.topics[topic_arn].sent_notifications.should.have.length_of(1) | 
					
						
							|  |  |  |         notification = sns_backend.topics[topic_arn].sent_notifications[0] | 
					
						
							|  |  |  |         _, msg, subject, _, _ = notification | 
					
						
							|  |  |  |         msg.should.equal("my message") | 
					
						
							|  |  |  |         subject.should.equal("my subject") | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_subject(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs_conn = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  |     sqs_conn.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2019-12-15 19:22:26 -05:00
										 |  |  |         Endpoint="arn:aws:sqs:us-east-1:{}:test-queue".format(ACCOUNT_ID), | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     ) | 
					
						
							|  |  |  |     message = "my message" | 
					
						
							|  |  |  |     subject1 = "test subject" | 
					
						
							|  |  |  |     subject2 = "test subject" * 20 | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							| 
									
										
										
										
											2017-10-20 14:52:24 +01:00
										 |  |  |         conn.publish(TopicArn=topic_arn, Message=message, Subject=subject1) | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Just that it doesnt error is a pass | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         with freeze_time("2015-01-01 12:00:00"): | 
					
						
							| 
									
										
										
										
											2017-10-20 14:52:24 +01:00
										 |  |  |             conn.publish(TopicArn=topic_arn, Message=message, Subject=subject2) | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  |     except ClientError as err: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         err.response["Error"]["Code"].should.equal("InvalidParameter") | 
					
						
							| 
									
										
										
										
											2017-10-20 13:19:55 +01:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         raise RuntimeError("Should have raised an InvalidParameter exception") | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-27 11:57:25 -07:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_null_subject(): | 
					
						
							|  |  |  |     conn = boto3.client("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     conn.create_topic(Name="some-topic") | 
					
						
							|  |  |  |     response = conn.list_topics() | 
					
						
							|  |  |  |     topic_arn = response["Topics"][0]["TopicArn"] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sqs_conn = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     sqs_conn.create_queue(QueueName="test-queue") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							|  |  |  |         Endpoint="arn:aws:sqs:us-east-1:{}:test-queue".format(ACCOUNT_ID), | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     message = "my message" | 
					
						
							|  |  |  |     with freeze_time("2015-01-01 12:00:00"): | 
					
						
							|  |  |  |         conn.publish(TopicArn=topic_arn, Message=message) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     queue = sqs_conn.get_queue_by_name(QueueName="test-queue") | 
					
						
							|  |  |  |     with freeze_time("2015-01-01 12:00:01"): | 
					
						
							|  |  |  |         messages = queue.receive_messages(MaxNumberOfMessages=1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     acquired_message = json.loads(messages[0].body) | 
					
						
							|  |  |  |     acquired_message["Message"].should.equal(message) | 
					
						
							| 
									
										
										
										
											2021-12-12 18:07:31 -01:00
										 |  |  |     acquired_message.shouldnt.have.key("Subject") | 
					
						
							| 
									
										
										
										
											2021-10-27 11:57:25 -07:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-06-04 12:53:24 +00:00
										 |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_message_too_long(): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic(Name="some-topic") | 
					
						
							| 
									
										
										
										
											2018-06-04 12:53:24 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-10-06 07:54:49 +02:00
										 |  |  |     with pytest.raises(ClientError): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         topic.publish(Message="".join(["." for i in range(0, 262145)])) | 
					
						
							| 
									
										
										
										
											2018-06-04 12:53:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # message short enough - does not raise an error | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic.publish(Message="".join(["." for i in range(0, 262144)])) | 
					
						
							| 
									
										
										
										
											2018-06-04 12:53:24 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  | @mock_sns | 
					
						
							|  |  |  | def test_publish_fifo_needs_group_id(): | 
					
						
							|  |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic( | 
					
						
							|  |  |  |         Name="topic.fifo", | 
					
						
							| 
									
										
										
										
											2022-03-10 13:39:59 -01:00
										 |  |  |         Attributes={"FifoTopic": "true", "ContentBasedDeduplication": "true"}, | 
					
						
							| 
									
										
										
										
											2022-01-06 16:04:55 +00:00
										 |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises( | 
					
						
							|  |  |  |         ClientError, match="The request must contain the parameter MessageGroupId" | 
					
						
							|  |  |  |     ): | 
					
						
							|  |  |  |         topic.publish(Message="message") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # message group included - OK | 
					
						
							|  |  |  |     topic.publish(Message="message", MessageGroupId="message_group_id") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | def test_publish_group_id_to_non_fifo(): | 
					
						
							|  |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic(Name="topic") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     with pytest.raises( | 
					
						
							|  |  |  |         ClientError, | 
					
						
							|  |  |  |         match="The request include parameter that is not valid for this queue type", | 
					
						
							|  |  |  |     ): | 
					
						
							|  |  |  |         topic.publish(Message="message", MessageGroupId="message_group_id") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # message group not included - OK | 
					
						
							|  |  |  |     topic.publish(Message="message") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | def _setup_filter_policy_test(filter_policy): | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sns = boto3.resource("sns", region_name="us-east-1") | 
					
						
							|  |  |  |     topic = sns.create_topic(Name="some-topic") | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     sqs = boto3.resource("sqs", region_name="us-east-1") | 
					
						
							|  |  |  |     queue = sqs.create_queue(QueueName="test-queue") | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscription = topic.subscribe( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Protocol="sqs", Endpoint=queue.attributes["QueueArn"] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     subscription.set_attributes( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         AttributeName="FilterPolicy", AttributeValue=json.dumps(filter_policy) | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     return topic, queue | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": ["example_corp"]}) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-04-17 16:27:48 +00:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"store": {"Type": "String", "Value": "example_corp"}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-04-17 16:27:48 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string_multiple_message_attributes(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": ["example_corp"]}) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"}, | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_cancelled"}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							|  |  |  |     message_attributes.should.equal( | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "store": {"Type": "String", "Value": "example_corp"}, | 
					
						
							|  |  |  |                 "event": {"Type": "String", "Value": "order_cancelled"}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string_OR_matching(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         {"store": ["example_corp", "different_corp"]} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match example_corp", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match different_corp", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "different_corp"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match example_corp", "match different_corp"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							|  |  |  |     message_attributes.should.equal( | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             {"store": {"Type": "String", "Value": "example_corp"}}, | 
					
						
							|  |  |  |             {"store": {"Type": "String", "Value": "different_corp"}}, | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string_AND_matching_positive(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         {"store": ["example_corp"], "event": ["order_cancelled"]} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match example_corp order_cancelled", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"}, | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_cancelled"}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match example_corp order_cancelled"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							|  |  |  |     message_attributes.should.equal( | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "store": {"Type": "String", "Value": "example_corp"}, | 
					
						
							|  |  |  |                 "event": {"Type": "String", "Value": "order_cancelled"}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string_AND_matching_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         {"store": ["example_corp"], "event": ["order_cancelled"]} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match example_corp order_accepted", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"}, | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_accepted"}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-04-17 16:27:48 +00:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": ["example_corp"]}) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "different_corp"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-04-17 16:27:48 +00:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-27 23:10:30 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_string_no_attributes_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": ["example_corp"]}) | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     topic.publish(Message="no match") | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-03-21 15:49:11 +00:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2018-04-17 16:27:48 +00:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_number_int(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={"price": {"DataType": "Number", "StringValue": "100"}}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							|  |  |  |     message_attributes.should.equal([{"price": {"Type": "Number", "Value": 100}}]) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_number_float(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100.1]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={"price": {"DataType": "Number", "StringValue": "100.1"}}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							|  |  |  |     message_attributes.should.equal([{"price": {"Type": "Number", "Value": 100.1}}]) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_number_float_accuracy(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100.123456789]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "price": {"DataType": "Number", "StringValue": "100.1234561"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"price": {"Type": "Number", "Value": 100.1234561}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_number_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no match", | 
					
						
							|  |  |  |         MessageAttributes={"price": {"DataType": "Number", "StringValue": "101"}}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_exact_number_with_string_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no match", | 
					
						
							|  |  |  |         MessageAttributes={"price": {"DataType": "String", "StringValue": "100"}}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_string_array_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         {"customer_interests": ["basketball", "baseball"]} | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "customer_interests": { | 
					
						
							|  |  |  |                 "DataType": "String.Array", | 
					
						
							|  |  |  |                 "StringValue": json.dumps(["basketball", "rugby"]), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "customer_interests": { | 
					
						
							|  |  |  |                     "Type": "String.Array", | 
					
						
							|  |  |  |                     "Value": json.dumps(["basketball", "rugby"]), | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_string_array_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"customer_interests": ["baseball"]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no_match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "customer_interests": { | 
					
						
							|  |  |  |                 "DataType": "String.Array", | 
					
						
							|  |  |  |                 "StringValue": json.dumps(["basketball", "rugby"]), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_string_array_with_number_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100, 500]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "price": {"DataType": "String.Array", "StringValue": json.dumps([100, 50])} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"price": {"Type": "String.Array", "Value": json.dumps([100, 50])}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_string_array_with_number_float_accuracy_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100.123456789, 500]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "price": { | 
					
						
							|  |  |  |                 "DataType": "String.Array", | 
					
						
							|  |  |  |                 "StringValue": json.dumps([100.1234561, 50]), | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"price": {"Type": "String.Array", "Value": json.dumps([100.1234561, 50])}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | # this is the correct behavior from SNS | 
					
						
							|  |  |  | def test_filtering_string_array_with_number_no_array_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100, 500]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={"price": {"DataType": "String.Array", "StringValue": "100"}}, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"price": {"Type": "String.Array", "Value": "100"}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_string_array_with_number_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [500]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no_match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "price": {"DataType": "String.Array", "StringValue": json.dumps([100, 50])} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | # this is the correct behavior from SNS | 
					
						
							|  |  |  | def test_filtering_string_array_with_string_no_array_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"price": [100]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no_match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							| 
									
										
										
										
											2020-01-20 15:21:11 -08:00
										 |  |  |             "price": {"DataType": "String.Array", "StringValue": "one hundred"} | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_attribute_key_exists_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": [{"exists": True}]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"store": {"Type": "String", "Value": "example_corp"}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_attribute_key_exists_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": [{"exists": True}]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_cancelled"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_attribute_key_not_exists_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": [{"exists": False}]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_cancelled"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         [{"event": {"Type": "String", "Value": "order_cancelled"}}] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_attribute_key_not_exists_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test({"store": [{"exists": False}]}) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"} | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_all_AND_matching_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |             "store": [{"exists": True}], | 
					
						
							|  |  |  |             "event": ["order_cancelled"], | 
					
						
							|  |  |  |             "customer_interests": ["basketball", "baseball"], | 
					
						
							|  |  |  |             "price": [100], | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"}, | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_cancelled"}, | 
					
						
							|  |  |  |             "customer_interests": { | 
					
						
							|  |  |  |                 "DataType": "String.Array", | 
					
						
							|  |  |  |                 "StringValue": json.dumps(["basketball", "rugby"]), | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             "price": {"DataType": "Number", "StringValue": "100"}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							|  |  |  |     message_bodies.should.equal(["match"]) | 
					
						
							|  |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							|  |  |  |     message_attributes.should.equal( | 
					
						
							|  |  |  |         [ | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "store": {"Type": "String", "Value": "example_corp"}, | 
					
						
							|  |  |  |                 "event": {"Type": "String", "Value": "order_cancelled"}, | 
					
						
							|  |  |  |                 "customer_interests": { | 
					
						
							|  |  |  |                     "Type": "String.Array", | 
					
						
							|  |  |  |                     "Value": json.dumps(["basketball", "rugby"]), | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |                 "price": {"Type": "Number", "Value": 100}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ] | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_filtering_all_AND_matching_no_match(): | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  |     topic, queue = _setup_filter_policy_test( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         { | 
					
						
							|  |  |  |             "store": [{"exists": True}], | 
					
						
							|  |  |  |             "event": ["order_cancelled"], | 
					
						
							|  |  |  |             "customer_interests": ["basketball", "baseball"], | 
					
						
							|  |  |  |             "price": [100], | 
					
						
							|  |  |  |             "encrypted": [False], | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     topic.publish( | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |         Message="no match", | 
					
						
							|  |  |  |         MessageAttributes={ | 
					
						
							|  |  |  |             "store": {"DataType": "String", "StringValue": "example_corp"}, | 
					
						
							|  |  |  |             "event": {"DataType": "String", "StringValue": "order_cancelled"}, | 
					
						
							|  |  |  |             "customer_interests": { | 
					
						
							|  |  |  |                 "DataType": "String.Array", | 
					
						
							|  |  |  |                 "StringValue": json.dumps(["basketball", "rugby"]), | 
					
						
							|  |  |  |             }, | 
					
						
							|  |  |  |             "price": {"DataType": "Number", "StringValue": "100"}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=5) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_bodies = [json.loads(m.body)["Message"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_bodies.should.equal([]) | 
					
						
							| 
									
										
										
										
											2019-10-31 08:44:26 -07:00
										 |  |  |     message_attributes = [json.loads(m.body)["MessageAttributes"] for m in messages] | 
					
						
							| 
									
										
										
										
											2019-08-25 16:48:14 +02:00
										 |  |  |     message_attributes.should.equal([]) |