From 03803b11cbea74d9b70968397b6b5ec1133a794e Mon Sep 17 00:00:00 2001 From: Maximilian Hoheiser Date: Mon, 6 May 2024 17:25:41 +0200 Subject: [PATCH] feat: test selective input path multiple targets --- tests/aws/services/events/conftest.py | 54 ++++++++----- .../aws/services/events/test_events_inputs.py | 76 +++++++------------ .../events/test_events_inputs.snapshot.json | 49 +++++++++++- .../events/test_events_inputs.validation.json | 9 ++- 4 files changed, 115 insertions(+), 73 deletions(-) diff --git a/tests/aws/services/events/conftest.py b/tests/aws/services/events/conftest.py index fbb6df5269434..ec0ea6bcba1db 100644 --- a/tests/aws/services/events/conftest.py +++ b/tests/aws/services/events/conftest.py @@ -194,23 +194,12 @@ def _delete_log_group(): @pytest.fixture -def put_events_with_filter_to_sqs(aws_client, sqs_get_queue_arn, clean_up): +def create_sqs_events_target(aws_client, sqs_get_queue_arn): queue_urls = [] - event_bus_names = [] - rule_names = [] - target_ids = [] - - def _put_events_with_filter_to_sqs( - pattern: dict, - entries_asserts: list[Tuple[list[dict], bool]], - input_path: str = None, - input_transformer: dict[dict, str] = None, - ): - queue_name = f"queue-{short_uid()}" - rule_name = f"rule-{short_uid()}" - target_id = f"target-{short_uid()}" - bus_name = f"bus-{short_uid()}" + def _create_sqs_events_target(queue_name: str | None = None) -> tuple[str, str]: + if not queue_name: + queue_name = f"tests-queue-{short_uid()}" sqs_client = aws_client.sqs queue_url = sqs_client.create_queue(QueueName=queue_name)["QueueUrl"] queue_urls.append(queue_url) @@ -231,6 +220,34 @@ def _put_events_with_filter_to_sqs( sqs_client.set_queue_attributes( QueueUrl=queue_url, Attributes={"Policy": json.dumps(policy)} ) + return queue_url, queue_arn + + yield _create_sqs_events_target + + for queue_url in queue_urls: + try: + aws_client.sqs.delete_queue(QueueUrl=queue_url) + except Exception as e: + LOG.debug("error cleaning up queue %s: %s", queue_url, e) + + +@pytest.fixture +def put_events_with_filter_to_sqs(aws_client, create_sqs_events_target, clean_up): + event_bus_names = [] + rule_names = [] + target_ids = [] + + def _put_events_with_filter_to_sqs( + pattern: dict, + entries_asserts: list[Tuple[list[dict], bool]], + input_path: str = None, + input_transformer: dict[dict, str] = None, + ): + rule_name = f"test-rule-{short_uid()}" + target_id = f"test-target-{short_uid()}" + bus_name = f"test-bus-{short_uid()}" + + queue_url, queue_arn = create_sqs_events_target() events_client = aws_client.events events_client.create_event_bus(Name=bus_name) @@ -262,7 +279,7 @@ def _put_events_with_filter_to_sqs( entry["EventBusName"] = bus_name message = _put_entries_assert_results_sqs( events_client, - sqs_client, + aws_client.sqs, queue_url, entries=entries, should_match=entry_asserts[1], @@ -274,14 +291,11 @@ def _put_events_with_filter_to_sqs( yield _put_events_with_filter_to_sqs - for queue_url, event_bus_name, rule_name, target_id in zip( - queue_urls, event_bus_names, rule_names, target_ids - ): + for event_bus_name, rule_name, target_id in zip(event_bus_names, rule_names, target_ids): clean_up( bus_name=event_bus_name, rule_name=rule_name, target_ids=target_id, - queue_url=queue_url, ) diff --git a/tests/aws/services/events/test_events_inputs.py b/tests/aws/services/events/test_events_inputs.py index 17e48e2c4eae4..518a13bfa8e4f 100644 --- a/tests/aws/services/events/test_events_inputs.py +++ b/tests/aws/services/events/test_events_inputs.py @@ -4,9 +4,7 @@ import pytest -from localstack.constants import TEST_AWS_ACCOUNT_ID, TEST_AWS_REGION_NAME from localstack.testing.pytest import markers -from localstack.utils.aws import arns from localstack.utils.strings import short_uid from tests.aws.services.events.conftest import sqs_collect_messages from tests.aws.services.events.helper_functions import is_v2_provider @@ -88,37 +86,39 @@ def test_put_events_with_input_path_max_level_depth( ) snapshot.match("message", messages) - @markers.aws.unknown - def test_put_events_with_input_path_multiple(self, aws_client, clean_up): - queue_name = "queue-{}".format(short_uid()) - queue_name_1 = "queue-{}".format(short_uid()) - rule_name = "rule-{}".format(short_uid()) - target_id = "target-{}".format(short_uid()) - target_id_1 = "target-{}".format(short_uid()) - bus_name = "bus-{}".format(short_uid()) - - queue_url = aws_client.sqs.create_queue(QueueName=queue_name)["QueueUrl"] - queue_arn = arns.sqs_queue_arn(queue_name, TEST_AWS_ACCOUNT_ID, TEST_AWS_REGION_NAME) - - queue_url_1 = aws_client.sqs.create_queue(QueueName=queue_name_1)["QueueUrl"] - queue_arn_1 = arns.sqs_queue_arn(queue_name_1, TEST_AWS_ACCOUNT_ID, TEST_AWS_REGION_NAME) + @markers.aws.validated + def test_put_events_with_input_path_multiple_targets( + self, + aws_client, + create_sqs_events_target, + events_create_event_bus, + events_put_rule, + snapshot, + ): + # prepare target queues + queue_url_1, queue_arn_1 = create_sqs_events_target() + queue_url_2, queue_arn_2 = create_sqs_events_target() - aws_client.events.create_event_bus(Name=bus_name) + bus_name = f"test-bus-{short_uid()}" + events_create_event_bus(Name=bus_name) - aws_client.events.put_rule( + rule_name = f"test-rule-{short_uid()}" + events_put_rule( Name=rule_name, EventBusName=bus_name, EventPattern=json.dumps(TEST_EVENT_PATTERN), ) + target_id_1 = f"target-{short_uid()}" + target_id_2 = f"target-{short_uid()}" aws_client.events.put_targets( Rule=rule_name, EventBusName=bus_name, Targets=[ - {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, + {"Id": target_id_1, "Arn": queue_arn_1, "InputPath": "$.detail"}, { - "Id": target_id_1, - "Arn": queue_arn_1, + "Id": target_id_2, + "Arn": queue_arn_2, }, ], ) @@ -134,35 +134,17 @@ def test_put_events_with_input_path_multiple(self, aws_client, clean_up): ] ) - messages = sqs_collect_messages(aws_client, queue_url, min_events=1, retries=3) - assert len(messages) == 1 - assert json.loads(messages[0].get("Body")) == EVENT_DETAIL - - messages = sqs_collect_messages(aws_client, queue_url_1, min_events=1, retries=3) - assert len(messages) == 1 - assert json.loads(messages[0].get("Body")).get("detail") == EVENT_DETAIL + messages_queue_1 = sqs_collect_messages(aws_client, queue_url_1, min_events=1, retries=3) + messages_queue_2 = sqs_collect_messages(aws_client, queue_url_2, min_events=1, retries=3) - aws_client.events.put_events( - Entries=[ - { - "EventBusName": bus_name, - "Source": "dummySource", - "DetailType": TEST_EVENT_PATTERN["detail-type"][0], - "Detail": json.dumps(EVENT_DETAIL), - } + snapshot.add_transformers_list( + [ + snapshot.transform.key_value("MD5OfBody"), + snapshot.transform.key_value("ReceiptHandle"), ] ) - - messages = sqs_collect_messages(aws_client, queue_url, min_events=0, retries=1, wait_time=3) - assert messages == [] - - # clean up - clean_up( - bus_name=bus_name, - rule_name=rule_name, - target_ids=[target_id, target_id_1], - queue_url=queue_url, - ) + snapshot.match("message-queue-1", messages_queue_1) + snapshot.match("message-queue-2", messages_queue_2) class TestEventsInputTransformers: diff --git a/tests/aws/services/events/test_events_inputs.snapshot.json b/tests/aws/services/events/test_events_inputs.snapshot.json index 0e5a1fc3de9c5..f1d57249ee2b3 100644 --- a/tests/aws/services/events/test_events_inputs.snapshot.json +++ b/tests/aws/services/events/test_events_inputs.snapshot.json @@ -21,7 +21,7 @@ } }, "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path": { - "recorded-date": "06-05-2024, 14:55:52", + "recorded-date": "06-05-2024, 15:11:50", "recorded-content": { "message": [ { @@ -40,7 +40,7 @@ } }, "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path_nested": { - "recorded-date": "06-05-2024, 14:40:27", + "recorded-date": "06-05-2024, 15:11:52", "recorded-content": { "message": [ { @@ -56,7 +56,7 @@ } }, "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path_max_level_depth": { - "recorded-date": "06-05-2024, 14:50:25", + "recorded-date": "06-05-2024, 15:11:54", "recorded-content": { "message": [ { @@ -67,5 +67,48 @@ } ] } + }, + "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path_multiple_targets": { + "recorded-date": "06-05-2024, 15:22:58", + "recorded-content": { + "message-queue-1": [ + { + "MessageId": "", + "ReceiptHandle": "", + "MD5OfBody": "", + "Body": { + "command": "update-account", + "payload": { + "acc_id": "0a787ecb-4015", + "sf_id": "baz" + } + } + } + ], + "message-queue-2": [ + { + "MessageId": "", + "ReceiptHandle": "", + "MD5OfBody": "", + "Body": { + "version": "0", + "id": "", + "detail-type": "core.update-account-command", + "source": "core.update-account-command", + "account": "111111111111", + "time": "date", + "region": "", + "resources": [], + "detail": { + "command": "update-account", + "payload": { + "acc_id": "0a787ecb-4015", + "sf_id": "baz" + } + } + } + } + ] + } } } diff --git a/tests/aws/services/events/test_events_inputs.validation.json b/tests/aws/services/events/test_events_inputs.validation.json index 59e5e02e6b298..9daac6c2436b4 100644 --- a/tests/aws/services/events/test_events_inputs.validation.json +++ b/tests/aws/services/events/test_events_inputs.validation.json @@ -1,12 +1,15 @@ { "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path": { - "last_validated_date": "2024-05-06T14:55:52+00:00" + "last_validated_date": "2024-05-06T15:11:50+00:00" }, "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path_max_level_depth": { - "last_validated_date": "2024-05-06T14:50:25+00:00" + "last_validated_date": "2024-05-06T15:11:54+00:00" + }, + "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path_multiple_targets": { + "last_validated_date": "2024-05-06T15:22:58+00:00" }, "tests/aws/services/events/test_events_inputs.py::TestEventsInputPath::test_put_events_with_input_path_nested": { - "last_validated_date": "2024-05-06T14:40:27+00:00" + "last_validated_date": "2024-05-06T15:11:52+00:00" }, "tests/aws/services/events/test_events_inputs.py::TestEventsInputTransformers::test_put_events_with_input_transformation_to_sqs": { "last_validated_date": "2024-03-26T15:48:35+00:00"