moto/tests/test_events/test_events_cloudformation.py
2024-01-27 19:38:09 +00:00

186 lines
5.5 KiB
Python

import copy
import json
from string import Template
import boto3
import pytest
from botocore.exceptions import ClientError
from moto import mock_aws
from moto.core import DEFAULT_ACCOUNT_ID as ACCOUNT_ID
archive_template = Template(
json.dumps(
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "EventBridge Archive Test",
"Resources": {
"Archive": {
"Type": "AWS::Events::Archive",
"Properties": {
"ArchiveName": "${archive_name}",
"SourceArn": {
"Fn::Sub": "arn:aws:events:$${AWS::Region}:$${AWS::AccountId}:event-bus/default"
},
},
}
},
"Outputs": {
"Arn": {
"Description": "Archive Arn",
"Value": {"Fn::GetAtt": ["Archive", "Arn"]},
}
},
}
)
)
rule_template = Template(
json.dumps(
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "EventBridge Rule Test",
"Resources": {
"Rule": {
"Type": "AWS::Events::Rule",
"Properties": {
"Name": "${rule_name}",
"EventPattern": {"detail-type": ["SomeDetailType"]},
},
}
},
"Outputs": {
"Arn": {
"Description": "Rule Arn",
"Value": {"Fn::GetAtt": ["Rule", "Arn"]},
}
},
}
)
)
empty = json.dumps(
{
"AWSTemplateFormatVersion": "2010-09-09",
"Description": "EventBridge Rule Test",
"Resources": {},
}
)
@mock_aws
def test_create_archive():
# given
cfn_client = boto3.client("cloudformation", region_name="eu-central-1")
name = "test-archive"
stack_name = "test-stack"
template = archive_template.substitute({"archive_name": name})
# when
cfn_client.create_stack(StackName=stack_name, TemplateBody=template)
# then
archive_arn = f"arn:aws:events:eu-central-1:{ACCOUNT_ID}:archive/{name}"
stack = cfn_client.describe_stacks(StackName=stack_name)["Stacks"][0]
assert stack["Outputs"][0]["OutputValue"] == archive_arn
events_client = boto3.client("events", region_name="eu-central-1")
response = events_client.describe_archive(ArchiveName=name)
assert response["ArchiveArn"] == archive_arn
@mock_aws
def test_update_archive():
# given
cfn_client = boto3.client("cloudformation", region_name="eu-central-1")
name = "test-archive"
stack_name = "test-stack"
template = archive_template.substitute({"archive_name": name})
cfn_client.create_stack(StackName=stack_name, TemplateBody=template)
template_update = copy.deepcopy(json.loads(template))
template_update["Resources"]["Archive"]["Properties"][
"Description"
] = "test archive"
# when
cfn_client.update_stack(
StackName=stack_name, TemplateBody=json.dumps(template_update)
)
# then
events_client = boto3.client("events", region_name="eu-central-1")
response = events_client.describe_archive(ArchiveName=name)
assert (
response["ArchiveArn"]
== f"arn:aws:events:eu-central-1:{ACCOUNT_ID}:archive/{name}"
)
assert response["Description"] == "test archive"
@mock_aws
def test_delete_archive():
# given
cfn_client = boto3.client("cloudformation", region_name="eu-central-1")
name = "test-archive"
stack_name = "test-stack"
template = archive_template.substitute({"archive_name": name})
cfn_client.create_stack(StackName=stack_name, TemplateBody=template)
# when
cfn_client.delete_stack(StackName=stack_name)
# then
events_client = boto3.client("events", region_name="eu-central-1")
response = events_client.list_archives(NamePrefix="test")["Archives"]
assert len(response) == 0
@mock_aws
def test_create_rule():
# given
cfn_client = boto3.client("cloudformation", region_name="eu-central-1")
name = "test-rule"
stack_name = "test-stack"
template = rule_template.substitute({"rule_name": name})
# when
cfn_client.create_stack(StackName=stack_name, TemplateBody=template)
# then
rule_arn = f"arn:aws:events:eu-central-1:{ACCOUNT_ID}:rule/{name}"
stack = cfn_client.describe_stacks(StackName=stack_name)["Stacks"][0]
assert stack["Outputs"][0]["OutputValue"] == rule_arn
events_client = boto3.client("events", region_name="eu-central-1")
response = events_client.describe_rule(Name=name)
assert response["Arn"] == rule_arn
assert response["EventPattern"] == '{"detail-type": ["SomeDetailType"]}'
@mock_aws
def test_delete_rule():
# given
cfn_client = boto3.client("cloudformation", region_name="eu-central-1")
name = "test-rule"
stack_name = "test-stack"
template = rule_template.substitute({"rule_name": name})
cfn_client.create_stack(StackName=stack_name, TemplateBody=template)
# when
cfn_client.update_stack(StackName=stack_name, TemplateBody=empty)
# then
events_client = boto3.client("events", region_name="eu-central-1")
with pytest.raises(ClientError) as exc:
events_client.describe_rule(Name=name)
err = exc.value.response["Error"]
assert err["Code"] == "ResourceNotFoundException"
assert err["Message"] == "Rule test-rule does not exist."