| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  | import boto3 | 
					
						
							|  |  |  | import json | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  | from moto import mock_ses, mock_sns, mock_sqs | 
					
						
							|  |  |  | from moto.ses.models import SESFeedback | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  | from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_enable_disable_ses_sns_communication(): | 
					
						
							|  |  |  |     conn = boto3.client("ses", region_name="us-east-1") | 
					
						
							|  |  |  |     conn.set_identity_notification_topic( | 
					
						
							|  |  |  |         Identity="test.com", NotificationType="Bounce", SnsTopic="the-arn" | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |     conn.set_identity_notification_topic(Identity="test.com", NotificationType="Bounce") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | def __setup_feedback_env__( | 
					
						
							|  |  |  |     ses_conn, sns_conn, sqs_conn, domain, topic, queue, region, expected_msg | 
					
						
							|  |  |  | ): | 
					
						
							|  |  |  |     """Setup the AWS environment to test the SES SNS Feedback""" | 
					
						
							|  |  |  |     # Environment setup | 
					
						
							|  |  |  |     # Create SQS queue | 
					
						
							|  |  |  |     sqs_conn.create_queue(QueueName=queue) | 
					
						
							|  |  |  |     # Create SNS topic | 
					
						
							|  |  |  |     create_topic_response = sns_conn.create_topic(Name=topic) | 
					
						
							|  |  |  |     topic_arn = create_topic_response["TopicArn"] | 
					
						
							|  |  |  |     # Subscribe the SNS topic to the SQS queue | 
					
						
							|  |  |  |     sns_conn.subscribe( | 
					
						
							|  |  |  |         TopicArn=topic_arn, | 
					
						
							|  |  |  |         Protocol="sqs", | 
					
						
							| 
									
										
										
										
											2022-11-17 21:41:08 -01:00
										 |  |  |         Endpoint=f"arn:aws:sqs:{region}:{ACCOUNT_ID}:{queue}", | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  |     ) | 
					
						
							|  |  |  |     # Verify SES domain | 
					
						
							|  |  |  |     ses_conn.verify_domain_identity(Domain=domain) | 
					
						
							| 
									
										
										
										
											2020-02-05 09:03:45 -06:00
										 |  |  |     # Specify email address to allow for raw e-mails to be processed | 
					
						
							|  |  |  |     ses_conn.verify_email_identity(EmailAddress="test@example.com") | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  |     # Setup SES notification topic | 
					
						
							|  |  |  |     if expected_msg is not None: | 
					
						
							|  |  |  |         ses_conn.set_identity_notification_topic( | 
					
						
							|  |  |  |             Identity=domain, NotificationType=expected_msg, SnsTopic=topic_arn | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-05 09:03:45 -06:00
										 |  |  | def __test_sns_feedback__(addr, expected_msg, raw_email=False): | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  |     region_name = "us-east-1" | 
					
						
							|  |  |  |     ses_conn = boto3.client("ses", region_name=region_name) | 
					
						
							|  |  |  |     sns_conn = boto3.client("sns", region_name=region_name) | 
					
						
							|  |  |  |     sqs_conn = boto3.resource("sqs", region_name=region_name) | 
					
						
							|  |  |  |     domain = "example.com" | 
					
						
							|  |  |  |     topic = "bounce-arn-feedback" | 
					
						
							|  |  |  |     queue = "feedback-test-queue" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     __setup_feedback_env__( | 
					
						
							|  |  |  |         ses_conn, sns_conn, sqs_conn, domain, topic, queue, region_name, expected_msg | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     # Send the message | 
					
						
							|  |  |  |     kwargs = dict( | 
					
						
							|  |  |  |         Source="test@" + domain, | 
					
						
							|  |  |  |         Destination={ | 
					
						
							|  |  |  |             "ToAddresses": [addr + "@" + domain], | 
					
						
							|  |  |  |             "CcAddresses": ["test_cc@" + domain], | 
					
						
							|  |  |  |             "BccAddresses": ["test_bcc@" + domain], | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         Message={ | 
					
						
							|  |  |  |             "Subject": {"Data": "test subject"}, | 
					
						
							|  |  |  |             "Body": {"Text": {"Data": "test body"}}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2020-02-05 09:03:45 -06:00
										 |  |  |     if raw_email: | 
					
						
							|  |  |  |         kwargs.pop("Message") | 
					
						
							|  |  |  |         kwargs.pop("Destination") | 
					
						
							|  |  |  |         kwargs.update( | 
					
						
							|  |  |  |             { | 
					
						
							|  |  |  |                 "Destinations": [addr + "@" + domain], | 
					
						
							|  |  |  |                 "RawMessage": {"Data": bytearray("raw_email", "utf-8")}, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |         ses_conn.send_raw_email(**kwargs) | 
					
						
							|  |  |  |     else: | 
					
						
							|  |  |  |         ses_conn.send_email(**kwargs) | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     # Wait for messages in the queues | 
					
						
							|  |  |  |     queue = sqs_conn.get_queue_by_name(QueueName=queue) | 
					
						
							|  |  |  |     messages = queue.receive_messages(MaxNumberOfMessages=1) | 
					
						
							|  |  |  |     if expected_msg is not None: | 
					
						
							|  |  |  |         msg = messages[0].body | 
					
						
							|  |  |  |         msg = json.loads(msg) | 
					
						
							| 
									
										
										
										
											2022-08-13 09:49:43 +00:00
										 |  |  |         assert msg["Message"] == SESFeedback.generate_message(ACCOUNT_ID, expected_msg) | 
					
						
							| 
									
										
										
										
											2019-01-11 10:44:30 +01:00
										 |  |  |     else: | 
					
						
							|  |  |  |         assert len(messages) == 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_no_sns_feedback(): | 
					
						
							|  |  |  |     __test_sns_feedback__("test", None) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_sns_feedback_bounce(): | 
					
						
							|  |  |  |     __test_sns_feedback__(SESFeedback.BOUNCE_ADDR, SESFeedback.BOUNCE) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_sns_feedback_complaint(): | 
					
						
							|  |  |  |     __test_sns_feedback__(SESFeedback.COMPLAINT_ADDR, SESFeedback.COMPLAINT) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_sns_feedback_delivery(): | 
					
						
							|  |  |  |     __test_sns_feedback__(SESFeedback.SUCCESS_ADDR, SESFeedback.DELIVERY) | 
					
						
							| 
									
										
										
										
											2020-02-05 09:03:45 -06:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_sqs | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_sns_feedback_delivery_raw_email(): | 
					
						
							|  |  |  |     __test_sns_feedback__( | 
					
						
							|  |  |  |         SESFeedback.SUCCESS_ADDR, SESFeedback.DELIVERY, raw_email=True | 
					
						
							|  |  |  |     ) | 
					
						
							| 
									
										
										
										
											2021-10-19 21:10:28 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_get_identity_notification_attributes_default_values(): | 
					
						
							|  |  |  |     ses = boto3.client("ses", region_name="us-east-1") | 
					
						
							|  |  |  |     ses.verify_domain_identity(Domain="example.com") | 
					
						
							|  |  |  |     ses.verify_email_identity(EmailAddress="test@example.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = ses.get_identity_notification_attributes( | 
					
						
							|  |  |  |         Identities=["test@example.com", "another@example.com"] | 
					
						
							|  |  |  |     )["NotificationAttributes"] | 
					
						
							|  |  |  |     resp.should.have.length_of(2) | 
					
						
							|  |  |  |     resp.should.have.key("test@example.com") | 
					
						
							|  |  |  |     resp.should.have.key("another@example.com") | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key("ForwardingEnabled").equal(True) | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key( | 
					
						
							|  |  |  |         "HeadersInBounceNotificationsEnabled" | 
					
						
							|  |  |  |     ).equal(False) | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key( | 
					
						
							|  |  |  |         "HeadersInComplaintNotificationsEnabled" | 
					
						
							|  |  |  |     ).equal(False) | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key( | 
					
						
							|  |  |  |         "HeadersInDeliveryNotificationsEnabled" | 
					
						
							|  |  |  |     ).equal(False) | 
					
						
							|  |  |  |     resp["test@example.com"].shouldnt.have.key("BounceTopic") | 
					
						
							|  |  |  |     resp["test@example.com"].shouldnt.have.key("ComplaintTopic") | 
					
						
							|  |  |  |     resp["test@example.com"].shouldnt.have.key("DeliveryTopic") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_ses | 
					
						
							|  |  |  | def test_set_identity_feedback_forwarding_enabled(): | 
					
						
							|  |  |  |     ses = boto3.client("ses", region_name="us-east-1") | 
					
						
							|  |  |  |     ses.verify_domain_identity(Domain="example.com") | 
					
						
							|  |  |  |     ses.verify_email_identity(EmailAddress="test@example.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = ses.get_identity_notification_attributes(Identities=["test@example.com"])[ | 
					
						
							|  |  |  |         "NotificationAttributes" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key("ForwardingEnabled").equal(True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ses.set_identity_feedback_forwarding_enabled( | 
					
						
							|  |  |  |         Identity="test@example.com", ForwardingEnabled=False | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = ses.get_identity_notification_attributes(Identities=["test@example.com"])[ | 
					
						
							|  |  |  |         "NotificationAttributes" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key("ForwardingEnabled").equal(False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     ses.set_identity_feedback_forwarding_enabled( | 
					
						
							|  |  |  |         Identity="test@example.com", ForwardingEnabled=True | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     resp = ses.get_identity_notification_attributes(Identities=["test@example.com"])[ | 
					
						
							|  |  |  |         "NotificationAttributes" | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     resp["test@example.com"].should.have.key("ForwardingEnabled").equal(True) |