Skip to content

Commit

Permalink
feat: test selective input path multiple targets
Browse files Browse the repository at this point in the history
  • Loading branch information
maxhoheiser committed May 8, 2024
1 parent f388f40 commit 76e25d8
Show file tree
Hide file tree
Showing 4 changed files with 115 additions and 73 deletions.
54 changes: 34 additions & 20 deletions tests/aws/services/events/conftest.py
Expand Up @@ -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)
Expand All @@ -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)
Expand Down Expand Up @@ -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],
Expand All @@ -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,
)


Expand Down
76 changes: 29 additions & 47 deletions tests/aws/services/events/test_events_inputs.py
Expand Up @@ -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
Expand Down Expand Up @@ -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,
},
],
)
Expand All @@ -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:
Expand Down
49 changes: 46 additions & 3 deletions tests/aws/services/events/test_events_inputs.snapshot.json
Expand Up @@ -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": [
{
Expand All @@ -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": [
{
Expand All @@ -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": [
{
Expand All @@ -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": "<uuid:1>",
"ReceiptHandle": "<receipt-handle:1>",
"MD5OfBody": "<m-d5-of-body:1>",
"Body": {
"command": "update-account",
"payload": {
"acc_id": "0a787ecb-4015",
"sf_id": "baz"
}
}
}
],
"message-queue-2": [
{
"MessageId": "<uuid:2>",
"ReceiptHandle": "<receipt-handle:2>",
"MD5OfBody": "<m-d5-of-body:2>",
"Body": {
"version": "0",
"id": "<uuid:3>",
"detail-type": "core.update-account-command",
"source": "core.update-account-command",
"account": "111111111111",
"time": "date",
"region": "<region>",
"resources": [],
"detail": {
"command": "update-account",
"payload": {
"acc_id": "0a787ecb-4015",
"sf_id": "baz"
}
}
}
}
]
}
}
}
9 changes: 6 additions & 3 deletions 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"
Expand Down

0 comments on commit 76e25d8

Please sign in to comment.