From a20633b577651e2b89cd1ada1a24ae03a222ca5f Mon Sep 17 00:00:00 2001 From: rangerthegood <68432236+rangerthegood@users.noreply.github.com> Date: Sun, 24 Apr 2022 06:03:28 -0400 Subject: [PATCH] events: delete_rule implementation update (#5056) --- moto/events/models.py | 6 +++++- tests/test_events/test_events.py | 36 +++++++++++++++++++++++++------- 2 files changed, 33 insertions(+), 9 deletions(-) diff --git a/moto/events/models.py b/moto/events/models.py index 3ecfdee3f..887ef7ed3 100644 --- a/moto/events/models.py +++ b/moto/events/models.py @@ -1045,7 +1045,11 @@ class EventsBackend(BaseBackend): return rule def delete_rule(self, name): - arn = self.rules.get(name).arn + rule = self.rules.get(name) + if len(rule.targets) > 0: + raise ValidationException("Rule can't be deleted since it has targets.") + + arn = rule.arn if self.tagger.has_tags(arn): self.tagger.delete_all_tags_for_resource(arn) return self.rules.pop(name) is not None diff --git a/tests/test_events/test_events.py b/tests/test_events/test_events.py index e18ea4654..375dcae6e 100644 --- a/tests/test_events/test_events.py +++ b/tests/test_events/test_events.py @@ -62,7 +62,7 @@ def get_random_rule(): return RULES[random.randint(0, len(RULES) - 1)] -def generate_environment(): +def generate_environment(add_targets=True): client = boto3.client("events", "us-west-2") for rule in RULES: @@ -73,12 +73,13 @@ def generate_environment(): Tags=rule.get("Tags", []), ) - targets = [] - for target in TARGETS: - if rule["Name"] in TARGETS[target].get("Rules"): - targets.append({"Id": target, "Arn": TARGETS[target]["Arn"]}) + if add_targets: + targets = [] + for target in TARGETS: + if rule["Name"] in TARGETS[target].get("Rules"): + targets.append({"Id": target, "Arn": TARGETS[target]["Arn"]}) - client.put_targets(Rule=rule["Name"], Targets=targets) + client.put_targets(Rule=rule["Name"], Targets=targets) return client @@ -298,13 +299,32 @@ def test_list_rule_names_by_target_using_limit(): @mock_events def test_delete_rule(): - client = generate_environment() + client = generate_environment(add_targets=False) client.delete_rule(Name=RULES[0]["Name"]) rules = client.list_rules() assert len(rules["Rules"]) == len(RULES) - 1 +@mock_events +def test_delete_rule_with_targets(): + # given + client = generate_environment() + + # when + with pytest.raises(ClientError) as e: + client.delete_rule(Name=RULES[0]["Name"]) + + # then + ex = e.value + ex.operation_name.should.equal("DeleteRule") + ex.response["ResponseMetadata"]["HTTPStatusCode"].should.equal(400) + ex.response["Error"]["Code"].should.contain("ValidationException") + ex.response["Error"]["Message"].should.equal( + "Rule can't be deleted since it has targets." + ) + + @mock_events def test_list_targets_by_rule(): rule_name = get_random_rule()["Name"] @@ -940,7 +960,7 @@ def test_create_rule_with_tags(): @mock_events def test_delete_rule_with_tags(): - client = generate_environment() + client = generate_environment(add_targets=False) rule_name = "test2" rule_arn = client.describe_rule(Name=rule_name).get("Arn") client.delete_rule(Name=rule_name)