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)
|