176 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			176 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import boto3
 | |
| import json
 | |
| import sure  # noqa # pylint: disable=unused-import
 | |
| 
 | |
| 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)
 | |
| 
 | |
| 
 | |
| @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)
 |