| 
									
										
										
										
											2021-10-04 13:47:40 +00:00
										 |  |  | import boto3 | 
					
						
							|  |  |  | import json | 
					
						
							| 
									
										
										
										
											2021-10-18 19:44:29 +00:00
										 |  |  | import sure  # noqa # pylint: disable=unused-import | 
					
						
							| 
									
										
										
										
											2021-10-04 13:47:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | from moto import mock_cloudformation, mock_sns | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_sns_topic(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "MySNSTopic": { | 
					
						
							|  |  |  |                 "Type": "AWS::SNS::Topic", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "Subscription": [ | 
					
						
							|  |  |  |                         {"Endpoint": "https://example.com", "Protocol": "https"} | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     "TopicName": "my_topics", | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "Outputs": { | 
					
						
							|  |  |  |             "topic_name": {"Value": {"Fn::GetAtt": ["MySNSTopic", "TopicName"]}}, | 
					
						
							|  |  |  |             "topic_arn": {"Value": {"Ref": "MySNSTopic"}}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-1") | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sns = boto3.client("sns", region_name="us-west-1") | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(1) | 
					
						
							|  |  |  |     topic_arn = topics[0]["TopicArn"] | 
					
						
							|  |  |  |     topic_arn.should.contain("my_topics") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     subscriptions = sns.list_subscriptions()["Subscriptions"] | 
					
						
							|  |  |  |     subscriptions.should.have.length_of(1) | 
					
						
							|  |  |  |     subscription = subscriptions[0] | 
					
						
							|  |  |  |     subscription["TopicArn"].should.equal(topic_arn) | 
					
						
							|  |  |  |     subscription["Protocol"].should.equal("https") | 
					
						
							|  |  |  |     subscription["SubscriptionArn"].should.contain(topic_arn) | 
					
						
							|  |  |  |     subscription["Endpoint"].should.equal("https://example.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     stack = cf.describe_stacks(StackName="test_stack")["Stacks"][0] | 
					
						
							|  |  |  |     topic_name_output = [x for x in stack["Outputs"] if x["OutputKey"] == "topic_name"][ | 
					
						
							|  |  |  |         0 | 
					
						
							|  |  |  |     ] | 
					
						
							|  |  |  |     topic_name_output["OutputValue"].should.equal("my_topics") | 
					
						
							|  |  |  |     topic_arn_output = [x for x in stack["Outputs"] if x["OutputKey"] == "topic_arn"][0] | 
					
						
							|  |  |  |     topic_arn_output["OutputValue"].should.equal(topic_arn) | 
					
						
							| 
									
										
										
										
											2021-10-11 21:56:39 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_sns_update_topic(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "MySNSTopic": { | 
					
						
							|  |  |  |                 "Type": "AWS::SNS::Topic", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "Subscription": [ | 
					
						
							|  |  |  |                         {"Endpoint": "https://example.com", "Protocol": "https"} | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     "TopicName": "my_topics", | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "Outputs": { | 
					
						
							|  |  |  |             "topic_name": {"Value": {"Fn::GetAtt": ["MySNSTopic", "TopicName"]}}, | 
					
						
							|  |  |  |             "topic_arn": {"Value": {"Ref": "MySNSTopic"}}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     sns_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-1") | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=sns_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sns = boto3.client("sns", region_name="us-west-1") | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dummy_template["Resources"]["MySNSTopic"]["Properties"]["Subscription"][0][ | 
					
						
							|  |  |  |         "Endpoint" | 
					
						
							|  |  |  |     ] = "https://example-updated.com" | 
					
						
							|  |  |  |     sns_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cf.update_stack(StackName="test_stack", TemplateBody=sns_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(1) | 
					
						
							|  |  |  |     topic_arn = topics[0]["TopicArn"] | 
					
						
							|  |  |  |     topic_arn.should.contain("my_topics") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     subscriptions = sns.list_subscriptions()["Subscriptions"] | 
					
						
							|  |  |  |     subscriptions.should.have.length_of(1) | 
					
						
							|  |  |  |     subscription = subscriptions[0] | 
					
						
							|  |  |  |     subscription["TopicArn"].should.equal(topic_arn) | 
					
						
							|  |  |  |     subscription["Protocol"].should.equal("https") | 
					
						
							|  |  |  |     subscription["SubscriptionArn"].should.contain(topic_arn) | 
					
						
							|  |  |  |     subscription["Endpoint"].should.equal("https://example-updated.com") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_sns_update_remove_topic(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "MySNSTopic": { | 
					
						
							|  |  |  |                 "Type": "AWS::SNS::Topic", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "Subscription": [ | 
					
						
							|  |  |  |                         {"Endpoint": "https://example.com", "Protocol": "https"} | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     "TopicName": "my_topics", | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "Outputs": { | 
					
						
							|  |  |  |             "topic_name": {"Value": {"Fn::GetAtt": ["MySNSTopic", "TopicName"]}}, | 
					
						
							|  |  |  |             "topic_arn": {"Value": {"Ref": "MySNSTopic"}}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     sns_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-1") | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=sns_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sns = boto3.client("sns", region_name="us-west-1") | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     dummy_template["Resources"].pop("MySNSTopic") | 
					
						
							|  |  |  |     dummy_template.pop("Outputs") | 
					
						
							|  |  |  |     sns_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cf.update_stack(StackName="test_stack", TemplateBody=sns_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @mock_cloudformation | 
					
						
							|  |  |  | @mock_sns | 
					
						
							|  |  |  | def test_sns_delete_topic(): | 
					
						
							|  |  |  |     dummy_template = { | 
					
						
							|  |  |  |         "AWSTemplateFormatVersion": "2010-09-09", | 
					
						
							|  |  |  |         "Resources": { | 
					
						
							|  |  |  |             "MySNSTopic": { | 
					
						
							|  |  |  |                 "Type": "AWS::SNS::Topic", | 
					
						
							|  |  |  |                 "Properties": { | 
					
						
							|  |  |  |                     "Subscription": [ | 
					
						
							|  |  |  |                         {"Endpoint": "https://example.com", "Protocol": "https"} | 
					
						
							|  |  |  |                     ], | 
					
						
							|  |  |  |                     "TopicName": "my_topics", | 
					
						
							|  |  |  |                 }, | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         "Outputs": { | 
					
						
							|  |  |  |             "topic_name": {"Value": {"Fn::GetAtt": ["MySNSTopic", "TopicName"]}}, | 
					
						
							|  |  |  |             "topic_arn": {"Value": {"Ref": "MySNSTopic"}}, | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |     sns_template_json = json.dumps(dummy_template) | 
					
						
							|  |  |  |     cf = boto3.client("cloudformation", region_name="us-west-1") | 
					
						
							|  |  |  |     cf.create_stack(StackName="test_stack", TemplateBody=sns_template_json) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     sns = boto3.client("sns", region_name="us-west-1") | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(1) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     cf.delete_stack(StackName="test_stack") | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     topics = sns.list_topics()["Topics"] | 
					
						
							|  |  |  |     topics.should.have.length_of(0) |