diff --git a/localstack/services/events/event_ruler.py b/localstack/services/events/event_ruler.py index a9210689566cd..0a7ef73eaf78c 100644 --- a/localstack/services/events/event_ruler.py +++ b/localstack/services/events/event_ruler.py @@ -3,7 +3,6 @@ from functools import cache from pathlib import Path -from localstack import config from localstack.services.events.packages import event_ruler_package from localstack.services.events.utils import InvalidEventPatternException from localstack.utils.objects import singleton_factory @@ -43,8 +42,6 @@ def matches_rule(event: str, rule: str) -> bool: There is a single static boolean method Ruler.matchesRule(event, rule) - both arguments are provided as JSON strings. """ - if config.EVENT_RULE_ENGINE != "java": - raise NotImplementedError("Set EVENT_RULE_ENGINE=java to enable the Java Event Ruler.") start_jvm() import jpype.imports # noqa F401: required for importing Java modules diff --git a/localstack/services/events/provider_v2.py b/localstack/services/events/provider_v2.py index c82497e2d5323..2c8544b09ee0e 100644 --- a/localstack/services/events/provider_v2.py +++ b/localstack/services/events/provider_v2.py @@ -1,5 +1,7 @@ import base64 +import json import logging +from datetime import datetime, timezone from typing import Optional from localstack.aws.api import RequestContext, handler @@ -16,14 +18,18 @@ EventPattern, EventsApi, EventSourceName, + InvalidEventPatternException, LimitMax100, ListEventBusesResponse, ListRuleNamesByTargetResponse, ListRulesResponse, ListTargetsByRuleResponse, NextToken, + PutEventsRequestEntry, PutEventsRequestEntryList, PutEventsResponse, + PutEventsResultEntry, + PutEventsResultEntryList, PutPartnerEventsRequestEntryList, PutPartnerEventsResponse, PutRuleResponse, @@ -43,10 +49,12 @@ TargetId, TargetIdList, TargetList, + TestEventPatternResponse, ) from localstack.aws.api.events import EventBus as ApiTypeEventBus from localstack.aws.api.events import Rule as ApiTypeRule from localstack.services.events.event_bus import EventBusService, EventBusServiceDict +from localstack.services.events.event_ruler import matches_rule from localstack.services.events.models_v2 import ( EventBus, EventBusDict, @@ -59,7 +67,11 @@ ) from localstack.services.events.rule import RuleService, RuleServiceDict from localstack.services.events.target import TargetSender, TargetSenderDict, TargetSenderFactory +from localstack.services.events.utils import ( + InvalidEventPatternException as InternalInvalidEventPatternException, +) from localstack.services.plugins import ServiceLifecycleHook +from localstack.utils.strings import long_uid LOG = logging.getLogger(__name__) @@ -79,6 +91,57 @@ def get_filtered_dict(name_prefix: str, input_dict: dict) -> dict: return {name: value for name, value in input_dict.items() if name.startswith(name_prefix)} +def get_event_time(event: PutEventsRequestEntry) -> str: + event_time = datetime.now(timezone.utc) + if event_timestamp := event.get("Time"): + try: + # use time from event if provided + event_time = event_timestamp.replace(tzinfo=timezone.utc) + except ValueError: + # use current time if event time is invalid + LOG.debug( + "Could not parse the `Time` parameter, falling back to current time for the following Event: '%s'", + event, + ) + formatted_time_string = event_time.strftime("%Y-%m-%dT%H:%M:%SZ") + return formatted_time_string + + +def validate_event(event: PutEventsRequestEntry) -> None | PutEventsResultEntry: + if not event.get("Source"): + return { + "ErrorCode": "InvalidArgument", + "ErrorMessage": "Parameter Source is not valid. Reason: Source is a required argument.", + } + elif not event.get("DetailType"): + return { + "ErrorCode": "InvalidArgument", + "ErrorMessage": "Parameter DetailType is not valid. Reason: DetailType is a required argument.", + } + elif not event.get("Detail"): + return { + "ErrorCode": "InvalidArgument", + "ErrorMessage": "Parameter Detail is not valid. Reason: Detail is a required argument.", + } + + +def format_event(event: PutEventsRequestEntry, region: str, account_id: str) -> dict: + # See https://docs.aws.amazon.com/AmazonS3/latest/userguide/ev-events.html + formatted_event = { + "version": "0", + "id": str(long_uid()), + "detail-type": event.get("DetailType"), + "source": event.get("Source"), + "account": account_id, + "time": get_event_time(event), + "region": region, + "resources": event.get("Resources", []), + "detail": json.loads(event.get("Detail", "{}")), + } + + return formatted_event + + class EventsProvider(EventsApi, ServiceLifecycleHook): # api methods are grouped by resource type and sorted in hierarchical order # each group is sorted alphabetically @@ -303,6 +366,20 @@ def put_rule( response = PutRuleResponse(RuleArn=rule_service.arn) return response + @handler("TestEventPattern") + def test_event_pattern( + self, context: RequestContext, event_pattern: EventPattern, event: str, **kwargs + ) -> TestEventPatternResponse: + """Test event pattern uses EventBridge event pattern matching: + https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns.html + """ + try: + result = matches_rule(event, event_pattern) + except InternalInvalidEventPatternException as e: + raise InvalidEventPatternException(e.message) from e + + return TestEventPatternResponse(Result=result) + ######### # Targets ######### @@ -345,7 +422,7 @@ def put_targets( rule_service = self.get_rule_service(context, rule, event_bus_name) failed_entries = rule_service.add_targets(targets) rule_arn = rule_service.arn - for target in targets: + for target in targets: # TODO only add successful targets self.create_target_sender(target, region, account_id, rule_arn) response = PutTargetsResponse( @@ -384,9 +461,12 @@ def put_events( endpoint_id: EndpointId = None, **kwargs, ) -> PutEventsResponse: - failed_entries = self._put_entries(context, entries) + entries, failed_entry_count = self._process_entries(context, entries) - response = PutEventsResponse(FailedEntryCount=len(failed_entries), Entries=failed_entries) + response = PutEventsResponse( + Entries=entries, + FailedEntryCount=failed_entry_count, + ) return response @handler("PutPartnerEvents") @@ -578,25 +658,41 @@ def _delete_target_sender(self, ids: TargetIdList, rule) -> None: except KeyError: LOG.error(f"Error deleting target service {target_arn}.") - def _put_entries(self, context: RequestContext, entries: PutEventsRequestEntryList) -> list: - failed_entries = [] + def _process_entries( + self, context: RequestContext, entries: PutEventsRequestEntryList + ) -> tuple[PutEventsResultEntryList, int]: + processed_entries = [] + failed_entry_count = 0 for event in entries: event_bus_name = event.get("EventBusName", "default") + if event_failed_validation := validate_event(event): + processed_entries.append(event_failed_validation) + failed_entry_count += 1 + continue + event = format_event(event, context.region, context.account_id) store = self.get_store(context) - event_bus = self.get_event_bus(event_bus_name, store) - # TODO add pattern matching + try: + event_bus = self.get_event_bus(event_bus_name, store) + except ResourceNotFoundException: + # ignore events for non-existing event buses but add processed event + processed_entries.append({"EventId": event["id"]}) + continue matching_rules = [rule for rule in event_bus.rules.values()] for rule in matching_rules: - for target in rule.targets.values(): - target_sender = self._target_sender_store[target["Arn"]] - try: - target_sender.send_event(event) - except Exception as error: - failed_entries.append( - { - "Entry": event, - "ErrorCode": "InternalException", - "ErrorMessage": str(error), - } - ) - return failed_entries + event_pattern = rule.event_pattern + event_str = json.dumps(event) + if matches_rule(event_str, event_pattern): + for target in rule.targets.values(): + target_sender = self._target_sender_store[target["Arn"]] + try: + target_sender.send_event(event) + processed_entries.append({"EventId": event["id"]}) + except Exception as error: + processed_entries.append( + { + "ErrorCode": "InternalException", + "ErrorMessage": str(error), + } + ) + failed_entry_count += 1 + return processed_entries, failed_entry_count diff --git a/localstack/services/events/rule.py b/localstack/services/events/rule.py index aad9d985b09a5..61011ccec6286 100644 --- a/localstack/services/events/rule.py +++ b/localstack/services/events/rule.py @@ -19,7 +19,11 @@ TargetIdList, TargetList, ) -from localstack.services.events.models_v2 import Rule, TargetDict, ValidationException +from localstack.services.events.models_v2 import ( + Rule, + TargetDict, + ValidationException, +) TARGET_ID_REGEX = re.compile(r"^[\.\-_A-Za-z0-9]+$") TARGET_ARN_REGEX = re.compile(r"arn:[\d\w:\-/]*") diff --git a/localstack/services/events/target.py b/localstack/services/events/target.py index bb2d423bacaf8..6a22f4e08d059 100644 --- a/localstack/services/events/target.py +++ b/localstack/services/events/target.py @@ -7,6 +7,7 @@ from localstack.aws.api.events import ( Arn, + PutEventsRequestEntry, Target, ) from localstack.aws.connect import connect_to @@ -53,7 +54,7 @@ def client(self): return self._client @abstractmethod - def send_event(self): + def send_event(self, event: PutEventsRequestEntry): pass def _validate_input(self, target: Target): @@ -83,6 +84,8 @@ def _initialize_client(self) -> BaseClient: TargetSenderDict = dict[Arn, TargetSender] +# Target Senders are ordered alphabetically by service name + class ApiGatewayTargetSender(TargetSender): def send_event(self, event): @@ -174,6 +177,7 @@ def send_event(self, event): def _validate_input(self, target: Target): super()._validate_input(target) + # TODO add validated test to check if RoleArn is mandatory if not collections.get_safe(target, "$.RoleArn"): raise ValueError("RoleArn is required for Kinesis target") if not collections.get_safe(target, "$.KinesisParameters.PartitionKeyPath"): diff --git a/tests/aws/services/events/test_event_patterns.py b/tests/aws/services/events/test_event_patterns.py index 7c31c3731bee2..a739af6e9c5f4 100644 --- a/tests/aws/services/events/test_event_patterns.py +++ b/tests/aws/services/events/test_event_patterns.py @@ -1,5 +1,6 @@ import json import os +from datetime import datetime from pathlib import Path from typing import List, Tuple @@ -8,7 +9,6 @@ from localstack.testing.aws.util import is_aws_cloud from localstack.testing.pytest import markers -from tests.aws.services.events.helper_functions import is_v2_provider THIS_FOLDER: str = os.path.dirname(os.path.realpath(__file__)) REQUEST_TEMPLATE_DIR = os.path.join(THIS_FOLDER, "event_pattern_templates") @@ -80,7 +80,6 @@ def list_files_with_suffix(directory_path: str, suffix: str) -> List[str]: # TODO: extend these test cases based on the open source docs + tests: https://github.com/aws/event-ruler # For example, "JSON Array Matching", "And and Or Relationship among fields with Ruler", rule validation, # and exception handling. -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") @pytest.mark.parametrize( "request_template,label", request_template_tuples, ids=[t[1] for t in request_template_tuples] ) @@ -118,7 +117,6 @@ def test_test_event_pattern(aws_client, snapshot, request_template, label): assert response["Result"] -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") @markers.aws.validated def test_test_event_pattern_with_multi_key(aws_client): """Test the special case of a duplicate JSON key separately because it requires working around the @@ -140,7 +138,6 @@ def test_test_event_pattern_with_multi_key(aws_client): assert response["Result"] -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") @markers.aws.validated def test_test_event_pattern_with_escape_characters(aws_client): r"""Test the special case of using escape characters separately because it requires working around JSON escaping. @@ -159,3 +156,47 @@ def test_test_event_pattern_with_escape_characters(aws_client): EventPattern=event_pattern, ) assert response["Result"] + + +@markers.aws.validated +def test_event_pattern_source(aws_client, snapshot, account_id, region_name): + response = aws_client.events.test_event_pattern( + Event=json.dumps( + { + "id": "1", + "source": "order", + "detail-type": "Test", + "account": account_id, + "region": region_name, + "time": datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"), + } + ), + EventPattern=json.dumps( + { + "source": ["order"], + "detail-type": ["Test"], + } + ), + ) + snapshot.match("eventbridge-test-event-pattern-response", response) + + # negative test, source is not matched + response = aws_client.events.test_event_pattern( + Event=json.dumps( + { + "id": "1", + "source": "order", + "detail-type": "Test", + "account": account_id, + "region": region_name, + "time": datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"), + } + ), + EventPattern=json.dumps( + { + "source": ["shipment"], + "detail-type": ["Test"], + } + ), + ) + snapshot.match("eventbridge-test-event-pattern-response-no-match", response) diff --git a/tests/aws/services/events/test_event_patterns.snapshot.json b/tests/aws/services/events/test_event_patterns.snapshot.json index 1f50547e900b6..39ed013c1b17e 100644 --- a/tests/aws/services/events/test_event_patterns.snapshot.json +++ b/tests/aws/services/events/test_event_patterns.snapshot.json @@ -430,5 +430,24 @@ "tests/aws/services/events/test_event_patterns.py::test_test_event_pattern[exists_dynamodb_NEG]": { "recorded-date": "09-04-2024, 16:51:59", "recorded-content": {} + }, + "tests/aws/services/events/test_event_patterns.py::test_event_pattern_source": { + "recorded-date": "29-04-2024, 14:12:14", + "recorded-content": { + "eventbridge-test-event-pattern-response": { + "Result": true, + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "eventbridge-test-event-pattern-response-no-match": { + "Result": false, + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } } } diff --git a/tests/aws/services/events/test_event_patterns.validation.json b/tests/aws/services/events/test_event_patterns.validation.json index ef63c055e6d26..d4bc0e6bd2f69 100644 --- a/tests/aws/services/events/test_event_patterns.validation.json +++ b/tests/aws/services/events/test_event_patterns.validation.json @@ -1,4 +1,7 @@ { + "tests/aws/services/events/test_event_patterns.py::test_event_pattern_source": { + "last_validated_date": "2024-04-29T14:12:14+00:00" + }, "tests/aws/services/events/test_event_patterns.py::test_test_event_pattern[arrays]": { "last_validated_date": "2024-04-08T19:33:55+00:00" }, diff --git a/tests/aws/services/events/test_events.py b/tests/aws/services/events/test_events.py index 0dc10211621a9..6b3c8ee9ec244 100644 --- a/tests/aws/services/events/test_events.py +++ b/tests/aws/services/events/test_events.py @@ -7,7 +7,6 @@ import os import time import uuid -from datetime import datetime import pytest from botocore.exceptions import ClientError @@ -26,10 +25,6 @@ from tests.aws.services.events.conftest import assert_valid_event, sqs_collect_messages from tests.aws.services.events.helper_functions import is_v2_provider -THIS_FOLDER = os.path.dirname(os.path.realpath(__file__)) - -TEST_EVENT_BUS_NAME = "command-bus-dev" - EVENT_DETAIL = {"command": "update-account", "payload": {"acc_id": "0a787ecb-4015", "sf_id": "baz"}} TEST_EVENT_PATTERN = { @@ -38,6 +33,16 @@ "detail": {"command": ["update-account"]}, } +TEST_EVENT_PATTERN_NO_DETAIL = { + "source": ["core.update-account-command"], + "detail-type": ["core.update-account-command"], +} + +TEST_EVENT_PATTERN_NO_SOURCE = { + "detail-type": ["core.update-account-command"], + "detail": {"command": ["update-account"]}, +} + API_DESTINATION_AUTHS = [ { "type": "BASIC", @@ -76,6 +81,81 @@ class TestEvents: + @markers.aws.validated + @pytest.mark.skipif( + not is_v2_provider(), + reason="V1 provider does not support this feature", + ) + def test_put_events_without_source(self, snapshot, aws_client): + entries = [ + { + "DetailType": TEST_EVENT_PATTERN_NO_SOURCE["detail-type"][0], + "Detail": json.dumps(EVENT_DETAIL), + }, + ] + response = aws_client.events.put_events(Entries=entries) + snapshot.match("put-events", response) + + @markers.aws.unknown + @pytest.mark.skipif( + not is_v2_provider(), + reason="V1 provider does not support this feature", + ) + def test_put_event_without_detail(self, snapshot, aws_client): + entries = [ + { + "Source": TEST_EVENT_PATTERN_NO_DETAIL["source"][0], + "DetailType": TEST_EVENT_PATTERN_NO_DETAIL["detail-type"][0], + }, + ] + response = aws_client.events.put_events(Entries=entries) + snapshot.match("put-events", response) + + @markers.aws.validated + def test_put_events_time(self, put_events_with_filter_to_sqs, snapshot): + entries1 = [ + { + "Source": TEST_EVENT_PATTERN_NO_DETAIL["source"][0], + "DetailType": TEST_EVENT_PATTERN_NO_DETAIL["detail-type"][0], + "Detail": json.dumps({"message": "short time"}), + "Time": "2022-01-01", + }, + ] + entries2 = [ + { + "Source": TEST_EVENT_PATTERN_NO_DETAIL["source"][0], + "DetailType": TEST_EVENT_PATTERN_NO_DETAIL["detail-type"][0], + "Detail": json.dumps({"message": "new time"}), + "Time": "01-01-2022T00:00:00Z", + }, + ] + entries3 = [ + { + "Source": TEST_EVENT_PATTERN_NO_DETAIL["source"][0], + "DetailType": TEST_EVENT_PATTERN_NO_DETAIL["detail-type"][0], + "Detail": json.dumps({"message": "long time"}), + "Time": "2022-01-01 00:00:00Z", + }, + ] + entries_asserts = [(entries1, True), (entries2, True), (entries3, True)] + messages = put_events_with_filter_to_sqs( + pattern=TEST_EVENT_PATTERN_NO_DETAIL, + entries_asserts=entries_asserts, + ) + + snapshot.add_transformer( + [ + snapshot.transform.key_value("MD5OfBody"), + snapshot.transform.key_value("ReceiptHandle"), + ] + ) + snapshot.match("messages", messages) + + # check for correct time strings in the messages + for message in messages: + message_body = json.loads(message["Body"]) + assert message_body["time"] == "2022-01-01T00:00:00Z" + @markers.aws.unknown @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_events_written_to_disk_are_timestamp_prefixed_for_chronological_ordering( @@ -138,70 +218,6 @@ def test_list_tags_for_resource(self, aws_client, clean_up): # clean up clean_up(rule_name=rule_name) - @markers.aws.unknown - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_put_events_with_values_in_array(self, put_events_with_filter_to_sqs): - pattern = {"detail": {"event": {"data": {"type": ["1", "2"]}}}} - entries1 = [ - { - "Source": "test", - "DetailType": "test", - "Detail": json.dumps({"event": {"data": {"type": ["3", "1"]}}}), - } - ] - entries2 = [ - { - "Source": "test", - "DetailType": "test", - "Detail": json.dumps({"event": {"data": {"type": ["2"]}}}), - } - ] - entries3 = [ - { - "Source": "test", - "DetailType": "test", - "Detail": json.dumps({"event": {"data": {"type": ["3"]}}}), - } - ] - entries_asserts = [(entries1, True), (entries2, True), (entries3, False)] - put_events_with_filter_to_sqs( - pattern=pattern, - entries_asserts=entries_asserts, - input_path="$.detail", - ) - - @markers.aws.validated - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_put_events_with_nested_event_pattern(self, put_events_with_filter_to_sqs): - pattern = {"detail": {"event": {"data": {"type": ["1"]}}}} - entries1 = [ - { - "Source": "test", - "DetailType": "test", - "Detail": json.dumps({"event": {"data": {"type": "1"}}}), - } - ] - entries2 = [ - { - "Source": "test", - "DetailType": "test", - "Detail": json.dumps({"event": {"data": {"type": "2"}}}), - } - ] - entries3 = [ - { - "Source": "test", - "DetailType": "test", - "Detail": json.dumps({"hello": "world"}), - } - ] - entries_asserts = [(entries1, True), (entries2, False), (entries3, False)] - put_events_with_filter_to_sqs( - pattern=pattern, - entries_asserts=entries_asserts, - input_path="$.detail", - ) - @markers.aws.unknown @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_scheduled_expression_events( @@ -526,185 +542,6 @@ def test_create_connection_validations(self, aws_client): assert "must have length less than or equal to 64" in message assert "must satisfy enum value set: [BASIC, OAUTH_CLIENT_CREDENTIALS, API_KEY]" in message - @markers.aws.unknown - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_put_event_without_source(self, aws_client_factory): - events_client = aws_client_factory(region_name="eu-west-1").events - - response = events_client.put_events(Entries=[{"DetailType": "Test", "Detail": "{}"}]) - assert response.get("Entries") - - @markers.aws.unknown - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_put_event_without_detail(self, aws_client_factory): - events_client = aws_client_factory(region_name="eu-west-1").events - - response = events_client.put_events( - Entries=[ - { - "DetailType": "Test", - } - ] - ) - assert response.get("Entries") - - @markers.aws.validated - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_put_target_id_validation( - self, sqs_create_queue, sqs_get_queue_arn, events_put_rule, snapshot, aws_client - ): - rule_name = f"rule-{short_uid()}" - queue_url = sqs_create_queue() - queue_arn = sqs_get_queue_arn(queue_url) - - events_put_rule( - Name=rule_name, EventPattern=json.dumps(TEST_EVENT_PATTERN), State="ENABLED" - ) - - target_id = "!@#$@!#$" - with pytest.raises(ClientError) as e: - aws_client.events.put_targets( - Rule=rule_name, - Targets=[ - {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, - ], - ) - snapshot.add_transformer(snapshot.transform.regex(target_id, "invalid-target-id")) - snapshot.match("put-targets-invalid-id-error", e.value.response) - - target_id = f"{long_uid()}-{long_uid()}-extra" - with pytest.raises(ClientError) as e: - aws_client.events.put_targets( - Rule=rule_name, - Targets=[ - {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, - ], - ) - snapshot.add_transformer(snapshot.transform.regex(target_id, "second-invalid-target-id")) - snapshot.match("put-targets-length-error", e.value.response) - - target_id = f"test-With_valid.Characters-{short_uid()}" - aws_client.events.put_targets( - Rule=rule_name, - Targets=[ - {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, - ], - ) - - @markers.aws.validated - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_event_pattern(self, aws_client, snapshot, account_id, region_name): - response = aws_client.events.test_event_pattern( - Event=json.dumps( - { - "id": "1", - "source": "order", - "detail-type": "Test", - "account": account_id, - "region": region_name, - "time": datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"), - } - ), - EventPattern=json.dumps( - { - "source": ["order"], - "detail-type": ["Test"], - } - ), - ) - snapshot.match("eventbridge-test-event-pattern-response", response) - - # negative test, source is not matched - response = aws_client.events.test_event_pattern( - Event=json.dumps( - { - "id": "1", - "source": "order", - "detail-type": "Test", - "account": account_id, - "region": region_name, - "time": datetime.utcnow().strftime("%Y-%m-%dT%H:%M:%SZ"), - } - ), - EventPattern=json.dumps( - { - "source": ["shipment"], - "detail-type": ["Test"], - } - ), - ) - snapshot.match("eventbridge-test-event-pattern-response-no-match", response) - - @markers.aws.validated - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") - def test_put_events_time( - self, - aws_client, - sqs_create_queue, - sqs_get_queue_arn, - events_put_rule, - snapshot, - ): - default_bus_rule_name = f"rule-{short_uid()}" - default_bus_target_id = f"test-target-default-b-{short_uid()}" - - snapshot.add_transformer( - [ - snapshot.transform.key_value("MD5OfBody"), # the event contains a timestamp - snapshot.transform.key_value("ReceiptHandle"), - ] - ) - - queue_url = sqs_create_queue() - queue_arn = sqs_get_queue_arn(queue_url) - - rule_on_default_bus = events_put_rule( - Name=default_bus_rule_name, - EventPattern=json.dumps({"detail-type": ["CustomType"], "source": ["MySource"]}), - State="ENABLED", - ) - - allow_event_rule_to_sqs_queue( - aws_client=aws_client, - event_rule_arn=rule_on_default_bus["RuleArn"], - sqs_queue_arn=queue_arn, - sqs_queue_url=queue_url, - ) - - aws_client.events.put_targets( - Rule=default_bus_rule_name, - Targets=[{"Id": default_bus_target_id, "Arn": queue_arn}], - ) - - # create an entry with a defined time - entries = [ - { - "Source": "MySource", - "DetailType": "CustomType", - "Detail": json.dumps({"message": "for the default event bus"}), - "Time": datetime(year=2022, day=1, month=1), - } - ] - response = aws_client.events.put_events(Entries=entries) - snapshot.match("put-events", response) - - def _get_sqs_messages(): - resp = aws_client.sqs.receive_message( - QueueUrl=queue_url, VisibilityTimeout=0, WaitTimeSeconds=1 - ) - msgs = resp.get("Messages") - assert len(msgs) == 1 - aws_client.sqs.delete_message( - QueueUrl=queue_url, ReceiptHandle=msgs[0]["ReceiptHandle"] - ) - return msgs - - messages = retry(_get_sqs_messages, retries=5, sleep=0.1) - snapshot.match("get-events", messages) - - message_body = json.loads(messages[0]["Body"]) - assert message_body["time"] == "2022-01-01T00:00:00Z" - class TestEventBus: @markers.aws.validated @@ -814,10 +651,9 @@ def test_list_event_buses_with_limit(self, create_event_bus, aws_client, snapsho ) snapshot.match("list-event-buses-limit-next-token", response) - @markers.aws.unknown + @markers.aws.needs_fixing # TODO use fixture setup_sqs_queue_as_event_target to simplify @pytest.mark.skipif(is_aws_cloud(), reason="not validated") @pytest.mark.parametrize("strategy", ["standard", "domain", "path"]) - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_into_event_bus( self, monkeypatch, @@ -885,7 +721,6 @@ def test_put_events_into_event_bus( aws_client.sqs.delete_queue(QueueUrl=queue_url) @markers.aws.validated - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") # TODO simplify and use sqs as target def test_put_events_to_default_eventbus_for_custom_eventbus( self, @@ -1019,7 +854,6 @@ def test_put_events_to_default_eventbus_for_custom_eventbus( assert_valid_event(received_event) @markers.aws.validated # TODO fix condition for this test, only succeeds if run on its own - @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_nonexistent_event_bus( self, aws_client, @@ -1302,6 +1136,88 @@ def test_update_rule_with_targets( snapshot.match("list-targets-after-update", response) +class TestEventPattern: + @markers.aws.validated + @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") + def test_put_events_pattern_with_values_in_array(self, put_events_with_filter_to_sqs, snapshot): + pattern = {"detail": {"event": {"data": {"type": ["1", "2"]}}}} + entries1 = [ + { + "Source": "test", + "DetailType": "test", + "Detail": json.dumps({"event": {"data": {"type": ["3", "1"]}}}), + } + ] + entries2 = [ + { + "Source": "test", + "DetailType": "test", + "Detail": json.dumps({"event": {"data": {"type": ["2"]}}}), + } + ] + entries3 = [ + { + "Source": "test", + "DetailType": "test", + "Detail": json.dumps({"event": {"data": {"type": ["3"]}}}), + } + ] + entries_asserts = [(entries1, True), (entries2, True), (entries3, False)] + messages = put_events_with_filter_to_sqs( + pattern=pattern, + entries_asserts=entries_asserts, + input_path="$.detail", + ) + + snapshot.add_transformers_list( + [ + snapshot.transform.key_value("MD5OfBody"), + snapshot.transform.key_value("ReceiptHandle"), + ] + ) + snapshot.match("messages", messages) + + @markers.aws.validated + @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") + def test_put_events_pattern_nested(self, put_events_with_filter_to_sqs, snapshot): + pattern = {"detail": {"event": {"data": {"type": ["1"]}}}} + entries1 = [ + { + "Source": "test", + "DetailType": "test", + "Detail": json.dumps({"event": {"data": {"type": "1"}}}), + } + ] + entries2 = [ + { + "Source": "test", + "DetailType": "test", + "Detail": json.dumps({"event": {"data": {"type": "2"}}}), + } + ] + entries3 = [ + { + "Source": "test", + "DetailType": "test", + "Detail": json.dumps({"hello": "world"}), + } + ] + entries_asserts = [(entries1, True), (entries2, False), (entries3, False)] + messages = put_events_with_filter_to_sqs( + pattern=pattern, + entries_asserts=entries_asserts, + input_path="$.detail", + ) + + snapshot.add_transformers_list( + [ + snapshot.transform.key_value("MD5OfBody"), + snapshot.transform.key_value("ReceiptHandle"), + ] + ) + snapshot.match("messages", messages) + + class TestEventTarget: @markers.aws.validated @pytest.mark.parametrize("bus_name", ["custom", "default"]) @@ -1411,3 +1327,46 @@ def test_list_target_by_rule_limit( Rule=rule_name, NextToken=response["NextToken"] ) snapshot.match("list-targets-limit-next-token", response) + + @markers.aws.validated + @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") + def test_put_target_id_validation( + self, sqs_create_queue, sqs_get_queue_arn, events_put_rule, snapshot, aws_client + ): + rule_name = f"rule-{short_uid()}" + queue_url = sqs_create_queue() + queue_arn = sqs_get_queue_arn(queue_url) + + events_put_rule( + Name=rule_name, EventPattern=json.dumps(TEST_EVENT_PATTERN), State="ENABLED" + ) + + target_id = "!@#$@!#$" + with pytest.raises(ClientError) as e: + aws_client.events.put_targets( + Rule=rule_name, + Targets=[ + {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, + ], + ) + snapshot.add_transformer(snapshot.transform.regex(target_id, "invalid-target-id")) + snapshot.match("put-targets-invalid-id-error", e.value.response) + + target_id = f"{long_uid()}-{long_uid()}-extra" + with pytest.raises(ClientError) as e: + aws_client.events.put_targets( + Rule=rule_name, + Targets=[ + {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, + ], + ) + snapshot.add_transformer(snapshot.transform.regex(target_id, "second-invalid-target-id")) + snapshot.match("put-targets-length-error", e.value.response) + + target_id = f"test-With_valid.Characters-{short_uid()}" + aws_client.events.put_targets( + Rule=rule_name, + Targets=[ + {"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}, + ], + ) diff --git a/tests/aws/services/events/test_events.snapshot.json b/tests/aws/services/events/test_events.snapshot.json index 8c113ce47c615..424fa08196021 100644 --- a/tests/aws/services/events/test_events.snapshot.json +++ b/tests/aws/services/events/test_events.snapshot.json @@ -1,41 +1,15 @@ { - "tests/aws/services/events/test_events.py::TestEvents::test_put_target_id_validation": { - "recorded-date": "18-04-2024, 15:47:35", + "tests/aws/services/events/test_events.py::TestEvents::test_put_events_without_source": { + "recorded-date": "29-04-2024, 13:15:31", "recorded-content": { - "put-targets-invalid-id-error": { - "Error": { - "Code": "ValidationException", - "Message": "1 validation error detected: Value '!@#$@!#$' at 'targets.1.member.id' failed to satisfy constraint: Member must satisfy regular expression pattern: [\\.\\-_A-Za-z0-9]+" - }, - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 400 - } - }, - "put-targets-length-error": { - "Error": { - "Code": "ValidationException", - "Message": "1 validation error detected: Value 'second-invalid-target-id' at 'targets.1.member.id' failed to satisfy constraint: Member must have length less than or equal to 64" - }, - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 400 - } - } - } - }, - "tests/aws/services/events/test_events.py::TestEvents::test_event_pattern": { - "recorded-date": "26-03-2024, 14:07:19", - "recorded-content": { - "eventbridge-test-event-pattern-response": { - "Result": true, - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "eventbridge-test-event-pattern-response-no-match": { - "Result": false, + "put-events": { + "Entries": [ + { + "ErrorCode": "InvalidArgument", + "ErrorMessage": "Parameter Source is not valid. Reason: Source is a required argument." + } + ], + "FailedEntryCount": 1, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -43,60 +17,123 @@ } } }, - "tests/aws/services/events/test_events.py::TestEvents::test_put_events_time": { - "recorded-date": "26-03-2024, 14:09:45", + "tests/aws/services/events/test_events.py::TestEvents::test_put_event_without_detail": { + "recorded-date": "29-04-2024, 13:15:31", "recorded-content": { "put-events": { "Entries": [ { - "EventId": "" + "ErrorCode": "InvalidArgument", + "ErrorMessage": "Parameter Detail is not valid. Reason: Detail is a required argument." } ], - "FailedEntryCount": 0, + "FailedEntryCount": 1, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - }, - "get-events": [ + } + } + }, + "tests/aws/services/events/test_events.py::TestEvents::test_put_events_time": { + "recorded-date": "29-04-2024, 13:15:34", + "recorded-content": { + "messages": [ { - "MessageId": "", + "MessageId": "", "ReceiptHandle": "", "MD5OfBody": "", "Body": { "version": "0", - "id": "", - "detail-type": "CustomType", - "source": "MySource", + "id": "", + "detail-type": "core.update-account-command", + "source": "core.update-account-command", "account": "111111111111", "time": "date", "region": "", "resources": [], "detail": { - "message": "for the default event bus" + "message": "short time" + } + } + }, + { + "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": { + "message": "new time" + } + } + }, + { + "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": { + "message": "long time" } } } ] } }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_rule[custom]": { - "recorded-date": "04-04-2024, 10:47:20", + "tests/aws/services/events/test_events.py::TestEventBus::test_create_list_describe_delete_custom_event_buses[regions0]": { + "recorded-date": "29-04-2024, 13:15:44", "recorded-content": { - "put-rule": { - "RuleArn": "arn:aws:events::111111111111:rule//", + "create-custom-event-bus-us-east-1": { + "EventBusArn": "arn:aws:events::111111111111:event-bus/", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - } - } - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_rule[default]": { - "recorded-date": "04-04-2024, 10:47:21", - "recorded-content": { - "put-rule": { - "RuleArn": "arn:aws:events::111111111111:rule/", + }, + "list-event-buses-after-create-us-east-1": { + "EventBuses": [ + { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "describe-custom-event-bus-us-east-1": { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "delete-custom-event-bus-us-east-1": { + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "list-event-buses-after-delete-us-east-1": { + "EventBuses": [], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -104,36 +141,21 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_list_with_prefix_describe_delete_rule[custom]": { - "recorded-date": "22-04-2024, 13:07:35", + "tests/aws/services/events/test_events.py::TestEventBus::test_create_list_describe_delete_custom_event_buses[regions1]": { + "recorded-date": "29-04-2024, 13:15:47", "recorded-content": { - "put-rule": { - "RuleArn": "arn:aws:events::111111111111:rule//", + "create-custom-event-bus-us-east-1": { + "EventBusArn": "arn:aws:events::111111111111:event-bus/", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-rules": { - "Rules": [ + "list-event-buses-after-create-us-east-1": { + "EventBuses": [ { - "Arn": "arn:aws:events::111111111111:rule//", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "" } ], "ResponseMetadata": { @@ -141,75 +163,53 @@ "HTTPStatusCode": 200 } }, - "describe-rule": { - "Arn": "arn:aws:events::111111111111:rule//", - "CreatedBy": "111111111111", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "", - "State": "ENABLED", + "describe-custom-event-bus-us-east-1": { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "delete-rule": { + "create-custom-event-bus-us-west-1": { + "EventBusArn": "arn:aws:events::111111111111:event-bus/", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-rules-after-delete": { - "Rules": [], + "list-event-buses-after-create-us-west-1": { + "EventBuses": [ + { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - } - } - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_list_with_prefix_describe_delete_rule[default]": { - "recorded-date": "22-04-2024, 13:07:36", - "recorded-content": { - "put-rule": { - "RuleArn": "arn:aws:events::111111111111:rule/", + }, + "describe-custom-event-bus-us-west-1": { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-rules": { - "Rules": [ + "create-custom-event-bus-eu-central-1": { + "EventBusArn": "arn:aws:events::111111111111:event-bus/", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "list-event-buses-after-create-eu-central-1": { + "EventBuses": [ { - "Arn": "arn:aws:events::111111111111:rule/", - "EventBusName": "default", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "" } ], "ResponseMetadata": { @@ -217,82 +217,94 @@ "HTTPStatusCode": 200 } }, - "describe-rule": { - "Arn": "arn:aws:events::111111111111:rule/", - "CreatedBy": "111111111111", - "EventBusName": "default", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "", - "State": "ENABLED", + "describe-custom-event-bus-eu-central-1": { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "delete-rule": { + "delete-custom-event-bus-us-east-1": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-rules-after-delete": { - "Rules": [], + "list-event-buses-after-delete-us-east-1": { + "EventBuses": [], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - } - } - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_multiple_rules_with_same_name": { - "recorded-date": "22-04-2024, 13:07:38", - "recorded-content": { - "put-rule": { - "RuleArn": "arn:aws:events::111111111111:rule//", + }, + "delete-custom-event-bus-us-west-1": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "re-put-rule": { - "RuleArn": "arn:aws:events::111111111111:rule//", + "list-event-buses-after-delete-us-west-1": { + "EventBuses": [], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-rules": { - "Rules": [ + "delete-custom-event-bus-eu-central-1": { + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "list-event-buses-after-delete-eu-central-1": { + "EventBuses": [], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/events/test_events.py::TestEventBus::test_create_multiple_event_buses_same_name": { + "recorded-date": "29-04-2024, 13:15:47", + "recorded-content": { + "create-multiple-event-buses-same-name": " already exists.') tblen=4>" + } + }, + "tests/aws/services/events/test_events.py::TestEventBus::test_describe_delete_not_existing_event_bus": { + "recorded-date": "29-04-2024, 13:15:49", + "recorded-content": { + "describe-not-existing-event-bus-error": " does not exist.') tblen=3>", + "delete-not-existing-event-bus": " does not exist.') tblen=3>" + } + }, + "tests/aws/services/events/test_events.py::TestEventBus::test_delete_default_event_bus": { + "recorded-date": "29-04-2024, 13:15:49", + "recorded-content": { + "delete-default-event-bus-error": "" + } + }, + "tests/aws/services/events/test_events.py::TestEventBus::test_list_event_buses_with_prefix": { + "recorded-date": "29-04-2024, 13:15:50", + "recorded-content": { + "list-event-buses-prefix-complete-name": { + "EventBuses": [ { - "Arn": "arn:aws:events::111111111111:rule//", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "" + } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "list-event-buses-prefix": { + "EventBuses": [ + { + "Arn": "arn:aws:events::111111111111:event-bus/", + "Name": "" } ], "ResponseMetadata": { @@ -302,133 +314,43 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventRule::test_list_rule_with_limit": { - "recorded-date": "22-04-2024, 13:07:40", + "tests/aws/services/events/test_events.py::TestEventBus::test_list_event_buses_with_limit": { + "recorded-date": "29-04-2024, 13:15:52", "recorded-content": { - "list-rules-limit": { - "NextToken": "", - "Rules": [ + "list-event-buses-limit": { + "EventBuses": [ { - "Arn": "arn:aws:events::111111111111:rule//-0", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "-0", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/-0", + "Name": "-0" }, { - "Arn": "arn:aws:events::111111111111:rule//-1", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "-1", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/-1", + "Name": "-1" }, { - "Arn": "arn:aws:events::111111111111:rule//-2", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "-2", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/-2", + "Name": "-2" } ], + "NextToken": "", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-rules-limit-next-token": { - "Rules": [ + "list-event-buses-limit-next-token": { + "EventBuses": [ { - "Arn": "arn:aws:events::111111111111:rule//-3", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "-3", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/-3", + "Name": "-3" }, { - "Arn": "arn:aws:events::111111111111:rule//-4", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "-4", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/-4", + "Name": "-4" }, { - "Arn": "arn:aws:events::111111111111:rule//-5", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "-5", - "State": "ENABLED" + "Arn": "arn:aws:events::111111111111:event-bus/-5", + "Name": "-5" } ], "ResponseMetadata": { @@ -438,52 +360,173 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventRule::test_describe_nonexistent_rule": { - "recorded-date": "22-04-2024, 13:07:42", + "tests/aws/services/events/test_events.py::TestEventBus::test_put_events_to_default_eventbus_for_custom_eventbus": { + "recorded-date": "29-04-2024, 13:16:20", "recorded-content": { - "describe-not-existing-rule-error": " does not exist on EventBus default.') tblen=3>" + "create-custom-event-bus": { + "EventBusArn": "arn:aws:events::111111111111:event-bus/", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "create-rule-1": { + "RuleArn": "arn:aws:events::111111111111:rule/", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "create-rule-2": { + "RuleArn": "arn:aws:events::111111111111:rule//", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "put-target-1": { + "FailedEntries": [], + "FailedEntryCount": 0, + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "put-target-2": { + "FailedEntries": [], + "FailedEntryCount": 0, + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + }, + "get-events": { + "Messages": [ + { + "Body": { + "version": "0", + "id": "", + "detail-type": "Object Created", + "source": "aws.s3", + "account": "111111111111", + "time": "date", + "region": "", + "resources": [ + "arn:aws:s3:::" + ], + "detail": { + "version": "0", + "bucket": { + "name": "" + }, + "object": { + "key": "", + "size": 4, + "etag": "8d777f385d3dfec8815d20f7496026dc", + "sequencer": "object-sequencer" + }, + "request-id": "request-id", + "requester": "", + "source-ip-address": "", + "reason": "PutObject" + } + }, + "MD5OfBody": "", + "MessageId": "", + "ReceiptHandle": "" + } + ] + } } }, - "tests/aws/services/events/test_events.py::TestEventRule::test_disable_re_enable_rule[custom]": { - "recorded-date": "22-04-2024, 13:07:43", + "tests/aws/services/events/test_events.py::TestEventBus::test_put_events_nonexistent_event_bus": { + "recorded-date": "29-04-2024, 13:18:57", "recorded-content": { - "disable-rule": { + "put-events": { + "Entries": [ + { + "EventId": "" + }, + { + "EventId": "" + } + ], + "FailedEntryCount": 0, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "describe-rule-disabled": { - "Arn": "arn:aws:events::111111111111:rule//", - "CreatedBy": "111111111111", - "EventBusName": "", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] + "get-events": [ + { + "MessageId": "", + "ReceiptHandle": "", + "MD5OfBody": "", + "Body": { + "version": "0", + "id": "", + "detail-type": "CustomType", + "source": "MySource", + "account": "111111111111", + "time": "date", + "region": "", + "resources": [], + "detail": { + "message": "for the default event bus" + } } + } + ], + "non-existent-bus-error": { + "Error": { + "Code": "ResourceNotFoundException", + "Message": "Event bus does not exist." }, - "Name": "", - "State": "DISABLED", + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 400 + } + } + } + }, + "tests/aws/services/events/test_events.py::TestEventRule::test_put_list_with_prefix_describe_delete_rule[custom]": { + "recorded-date": "29-04-2024, 13:16:41", + "recorded-content": { + "put-rule": { + "RuleArn": "arn:aws:events::111111111111:rule//", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "enable-rule": { + "list-rules": { + "Rules": [ + { + "Arn": "arn:aws:events::111111111111:rule//", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "", + "State": "ENABLED" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "describe-rule-enabled": { + "describe-rule": { "Arn": "arn:aws:events::111111111111:rule//", "CreatedBy": "111111111111", "EventBusName": "", @@ -506,49 +549,60 @@ "HTTPHeaders": {}, "HTTPStatusCode": 200 } - } - } - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_disable_re_enable_rule[default]": { - "recorded-date": "22-04-2024, 13:07:45", - "recorded-content": { - "disable-rule": { + }, + "delete-rule": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "describe-rule-disabled": { - "Arn": "arn:aws:events::111111111111:rule/", - "CreatedBy": "111111111111", - "EventBusName": "default", - "EventPattern": { - "source": [ - "core.update-account-command" - ], - "detail-type": [ - "core.update-account-command" - ], - "detail": { - "command": [ - "update-account" - ] - } - }, - "Name": "", - "State": "DISABLED", + "list-rules-after-delete": { + "Rules": [], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 + } + } + } + }, + "tests/aws/services/events/test_events.py::TestEventRule::test_put_list_with_prefix_describe_delete_rule[default]": { + "recorded-date": "29-04-2024, 13:16:43", + "recorded-content": { + "put-rule": { + "RuleArn": "arn:aws:events::111111111111:rule/", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "enable-rule": { + "list-rules": { + "Rules": [ + { + "Arn": "arn:aws:events::111111111111:rule/", + "EventBusName": "default", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "", + "State": "ENABLED" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "describe-rule-enabled": { + "describe-rule": { "Arn": "arn:aws:events::111111111111:rule/", "CreatedBy": "111111111111", "EventBusName": "default", @@ -571,42 +625,15 @@ "HTTPHeaders": {}, "HTTPStatusCode": 200 } - } - } - }, - "tests/aws/services/events/test_events.py::TestEventTarget::test_put_list_remove_target[custom]": { - "recorded-date": "22-04-2024, 13:07:17", - "recorded-content": { - "put-target": { - "FailedEntries": [], - "FailedEntryCount": 0, - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } }, - "list-targets": { - "Targets": [ - { - "Arn": "", - "Id": "" - } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "remove-target": { - "FailedEntries": [], - "FailedEntryCount": 0, + "delete-rule": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-targets-after-delete": { - "Targets": [], + "list-rules-after-delete": { + "Rules": [], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -614,39 +641,45 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventTarget::test_put_list_remove_target[default]": { - "recorded-date": "22-04-2024, 13:07:18", + "tests/aws/services/events/test_events.py::TestEventRule::test_put_multiple_rules_with_same_name": { + "recorded-date": "29-04-2024, 13:16:44", "recorded-content": { - "put-target": { - "FailedEntries": [], - "FailedEntryCount": 0, - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "list-targets": { - "Targets": [ - { - "Arn": "", - "Id": "" - } - ], + "put-rule": { + "RuleArn": "arn:aws:events::111111111111:rule//", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "remove-target": { - "FailedEntries": [], - "FailedEntryCount": 0, + "re-put-rule": { + "RuleArn": "arn:aws:events::111111111111:rule//", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-targets-after-delete": { - "Targets": [], + "list-rules": { + "Rules": [ + { + "Arn": "arn:aws:events::111111111111:rule//", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "", + "State": "ENABLED" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -654,29 +687,68 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventTarget::test_add_exceed_fife_targets_per_rule": { - "recorded-date": "22-04-2024, 13:07:20", - "recorded-content": { - "put-targets-client-error": "" - } - }, - "tests/aws/services/events/test_events.py::TestEventTarget::test_list_target_by_rule_limit": { - "recorded-date": "22-04-2024, 13:07:22", + "tests/aws/services/events/test_events.py::TestEventRule::test_list_rule_with_limit": { + "recorded-date": "29-04-2024, 13:16:47", "recorded-content": { - "list-targets-limit": { + "list-rules-limit": { "NextToken": "", - "Targets": [ + "Rules": [ { - "Arn": "", - "Id": "0" + "Arn": "arn:aws:events::111111111111:rule//-0", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "-0", + "State": "ENABLED" }, { - "Arn": "", - "Id": "1" + "Arn": "arn:aws:events::111111111111:rule//-1", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "-1", + "State": "ENABLED" }, { - "Arn": "", - "Id": "2" + "Arn": "arn:aws:events::111111111111:rule//-2", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "-2", + "State": "ENABLED" } ], "ResponseMetadata": { @@ -684,15 +756,64 @@ "HTTPStatusCode": 200 } }, - "list-targets-limit-next-token": { - "Targets": [ + "list-rules-limit-next-token": { + "Rules": [ { - "Arn": "", - "Id": "3" + "Arn": "arn:aws:events::111111111111:rule//-3", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "-3", + "State": "ENABLED" + }, + { + "Arn": "arn:aws:events::111111111111:rule//-4", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "-4", + "State": "ENABLED" }, { - "Arn": "", - "Id": "4" + "Arn": "arn:aws:events::111111111111:rule//-5", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "-5", + "State": "ENABLED" } ], "ResponseMetadata": { @@ -702,92 +823,70 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventRule::test_delete_rule_with_targets": { - "recorded-date": "22-04-2024, 13:07:46", - "recorded-content": { - "delete-rule-with-targets-error": "" - } - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_delete_default_event_bus": { - "recorded-date": "16-04-2024, 15:10:07", - "recorded-content": { - "delete-default-event-bus-error": "" - } - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_update_rule_with_targets": { - "recorded-date": "22-04-2024, 13:07:48", + "tests/aws/services/events/test_events.py::TestEventRule::test_describe_nonexistent_rule": { + "recorded-date": "29-04-2024, 13:16:49", "recorded-content": { - "list-targets": { - "Targets": [ - { - "Arn": "", - "Id": "" - } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "update-rule": { - "RuleArn": "arn:aws:events::111111111111:rule/", - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "list-targets-after-update": { - "Targets": [ - { - "Arn": "", - "Id": "" - } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - } + "describe-not-existing-rule-error": " does not exist on EventBus default.') tblen=3>" } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_create_list_describe_delete_custom_event_buses[regions0]": { - "recorded-date": "23-04-2024, 06:11:32", + "tests/aws/services/events/test_events.py::TestEventRule::test_disable_re_enable_rule[custom]": { + "recorded-date": "29-04-2024, 13:16:50", "recorded-content": { - "create-custom-event-bus-us-east-1": { - "EventBusArn": "arn:aws:events::111111111111:event-bus/", + "disable-rule": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-after-create-us-east-1": { - "EventBuses": [ - { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "" + "describe-rule-disabled": { + "Arn": "arn:aws:events::111111111111:rule//", + "CreatedBy": "111111111111", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "describe-custom-event-bus-us-east-1": { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "", + }, + "Name": "", + "State": "DISABLED", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "delete-custom-event-bus-us-east-1": { + "enable-rule": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-after-delete-us-east-1": { - "EventBuses": [], + "describe-rule-enabled": { + "Arn": "arn:aws:events::111111111111:rule//", + "CreatedBy": "111111111111", + "EventBusName": "", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] + } + }, + "Name": "", + "State": "ENABLED", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -795,124 +894,106 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_create_list_describe_delete_custom_event_buses[regions1]": { - "recorded-date": "23-04-2024, 06:11:34", + "tests/aws/services/events/test_events.py::TestEventRule::test_disable_re_enable_rule[default]": { + "recorded-date": "29-04-2024, 13:16:52", "recorded-content": { - "create-custom-event-bus-us-east-1": { - "EventBusArn": "arn:aws:events::111111111111:event-bus/", + "disable-rule": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-after-create-us-east-1": { - "EventBuses": [ - { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "" + "describe-rule-disabled": { + "Arn": "arn:aws:events::111111111111:rule/", + "CreatedBy": "111111111111", + "EventBusName": "default", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "describe-custom-event-bus-us-east-1": { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "", + }, + "Name": "", + "State": "DISABLED", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "create-custom-event-bus-us-west-1": { - "EventBusArn": "arn:aws:events::111111111111:event-bus/", + "enable-rule": { "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-after-create-us-west-1": { - "EventBuses": [ - { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "" + "describe-rule-enabled": { + "Arn": "arn:aws:events::111111111111:rule/", + "CreatedBy": "111111111111", + "EventBusName": "default", + "EventPattern": { + "source": [ + "core.update-account-command" + ], + "detail-type": [ + "core.update-account-command" + ], + "detail": { + "command": [ + "update-account" + ] } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "describe-custom-event-bus-us-west-1": { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "", - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "create-custom-event-bus-eu-central-1": { - "EventBusArn": "arn:aws:events::111111111111:event-bus/", + }, + "Name": "", + "State": "ENABLED", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - }, - "list-event-buses-after-create-eu-central-1": { - "EventBuses": [ + } + } + }, + "tests/aws/services/events/test_events.py::TestEventRule::test_delete_rule_with_targets": { + "recorded-date": "29-04-2024, 13:16:53", + "recorded-content": { + "delete-rule-with-targets-error": "" + } + }, + "tests/aws/services/events/test_events.py::TestEventRule::test_update_rule_with_targets": { + "recorded-date": "29-04-2024, 13:16:55", + "recorded-content": { + "list-targets": { + "Targets": [ { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "" - } - ], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "describe-custom-event-bus-eu-central-1": { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "", - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "delete-custom-event-bus-us-east-1": { - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "list-event-buses-after-delete-us-east-1": { - "EventBuses": [], - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "delete-custom-event-bus-us-west-1": { - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "list-event-buses-after-delete-us-west-1": { - "EventBuses": [], + "Arn": "", + "Id": "" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "delete-custom-event-bus-eu-central-1": { + "update-rule": { + "RuleArn": "arn:aws:events::111111111111:rule/", "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-after-delete-eu-central-1": { - "EventBuses": [], + "list-targets-after-update": { + "Targets": [ + { + "Arn": "", + "Id": "" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -920,93 +1001,94 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_create_multiple_event_buses_same_name": { - "recorded-date": "22-04-2024, 13:11:10", - "recorded-content": { - "create-multiple-event-buses-same-name": " already exists.') tblen=4>" - } - }, - "tests/aws/services/events/test_events.py::TestEventBus::test_describe_delete_not_existing_event_bus": { - "recorded-date": "22-04-2024, 13:11:12", + "tests/aws/services/events/test_events.py::TestEventPattern::test_put_events_pattern_with_values_in_array": { + "recorded-date": "29-04-2024, 13:17:04", "recorded-content": { - "describe-not-existing-event-bus-error": " does not exist.') tblen=3>", - "delete-not-existing-event-bus": " does not exist.') tblen=3>" + "messages": [ + { + "MessageId": "", + "ReceiptHandle": "", + "MD5OfBody": "", + "Body": { + "event": { + "data": { + "type": [ + "3", + "1" + ] + } + } + } + }, + { + "MessageId": "", + "ReceiptHandle": "", + "MD5OfBody": "", + "Body": { + "event": { + "data": { + "type": [ + "2" + ] + } + } + } + } + ] } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_delete_default_event_bus": { - "recorded-date": "22-04-2024, 13:11:12", + "tests/aws/services/events/test_events.py::TestEventPattern::test_put_events_pattern_nested": { + "recorded-date": "29-04-2024, 13:17:16", "recorded-content": { - "delete-default-event-bus-error": "" + "messages": [ + { + "MessageId": "", + "ReceiptHandle": "", + "MD5OfBody": "", + "Body": { + "event": { + "data": { + "type": "1" + } + } + } + } + ] } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_list_event_buses_with_prefix": { - "recorded-date": "22-04-2024, 13:19:19", + "tests/aws/services/events/test_events.py::TestEventTarget::test_put_list_remove_target[custom]": { + "recorded-date": "29-04-2024, 13:17:18", "recorded-content": { - "list-event-buses-prefix-complete-name": { - "EventBuses": [ - { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "" - } - ], + "put-target": { + "FailedEntries": [], + "FailedEntryCount": 0, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-prefix": { - "EventBuses": [ + "list-targets": { + "Targets": [ { - "Arn": "arn:aws:events::111111111111:event-bus/", - "Name": "" + "Arn": "", + "Id": "" } ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - } - } - }, - "tests/aws/services/events/test_events.py::TestEventBus::test_list_event_buses_with_limit": { - "recorded-date": "22-04-2024, 13:11:15", - "recorded-content": { - "list-event-buses-limit": { - "EventBuses": [ - { - "Arn": "arn:aws:events::111111111111:event-bus/-0", - "Name": "-0" - }, - { - "Arn": "arn:aws:events::111111111111:event-bus/-1", - "Name": "-1" - }, - { - "Arn": "arn:aws:events::111111111111:event-bus/-2", - "Name": "-2" - } - ], - "NextToken": "", + }, + "remove-target": { + "FailedEntries": [], + "FailedEntryCount": 0, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "list-event-buses-limit-next-token": { - "EventBuses": [ - { - "Arn": "arn:aws:events::111111111111:event-bus/-3", - "Name": "-3" - }, - { - "Arn": "arn:aws:events::111111111111:event-bus/-4", - "Name": "-4" - }, - { - "Arn": "arn:aws:events::111111111111:event-bus/-5", - "Name": "-5" - } - ], + "list-targets-after-delete": { + "Targets": [], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 @@ -1014,31 +1096,30 @@ } } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_put_events_to_default_eventbus_for_custom_eventbus": { - "recorded-date": "22-04-2024, 13:11:43", + "tests/aws/services/events/test_events.py::TestEventTarget::test_put_list_remove_target[default]": { + "recorded-date": "29-04-2024, 13:17:20", "recorded-content": { - "create-custom-event-bus": { - "EventBusArn": "arn:aws:events::111111111111:event-bus/", - "ResponseMetadata": { - "HTTPHeaders": {}, - "HTTPStatusCode": 200 - } - }, - "create-rule-1": { - "RuleArn": "arn:aws:events::111111111111:rule/", + "put-target": { + "FailedEntries": [], + "FailedEntryCount": 0, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "create-rule-2": { - "RuleArn": "arn:aws:events::111111111111:rule//", + "list-targets": { + "Targets": [ + { + "Arn": "", + "Id": "" + } + ], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "put-target-1": { + "remove-target": { "FailedEntries": [], "FailedEntryCount": 0, "ResponseMetadata": { @@ -1046,95 +1127,80 @@ "HTTPStatusCode": 200 } }, - "put-target-2": { - "FailedEntries": [], - "FailedEntryCount": 0, + "list-targets-after-delete": { + "Targets": [], "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } - }, - "get-events": { - "Messages": [ - { - "Body": { - "version": "0", - "id": "", - "detail-type": "Object Created", - "source": "aws.s3", - "account": "111111111111", - "time": "date", - "region": "", - "resources": [ - "arn:aws:s3:::" - ], - "detail": { - "version": "0", - "bucket": { - "name": "" - }, - "object": { - "key": "", - "size": 4, - "etag": "8d777f385d3dfec8815d20f7496026dc", - "sequencer": "object-sequencer" - }, - "request-id": "request-id", - "requester": "", - "source-ip-address": "", - "reason": "PutObject" - } - }, - "MD5OfBody": "", - "MessageId": "", - "ReceiptHandle": "" - } - ] } } }, - "tests/aws/services/events/test_events.py::TestEventBus::test_put_events_nonexistent_event_bus": { - "recorded-date": "22-04-2024, 13:12:23", + "tests/aws/services/events/test_events.py::TestEventTarget::test_add_exceed_fife_targets_per_rule": { + "recorded-date": "29-04-2024, 13:17:21", "recorded-content": { - "put-events": { - "Entries": [ + "put-targets-client-error": "" + } + }, + "tests/aws/services/events/test_events.py::TestEventTarget::test_list_target_by_rule_limit": { + "recorded-date": "29-04-2024, 13:17:23", + "recorded-content": { + "list-targets-limit": { + "NextToken": "", + "Targets": [ { - "EventId": "" + "Arn": "", + "Id": "0" }, { - "EventId": "" + "Arn": "", + "Id": "1" + }, + { + "Arn": "", + "Id": "2" } ], - "FailedEntryCount": 0, "ResponseMetadata": { "HTTPHeaders": {}, "HTTPStatusCode": 200 } }, - "get-events": [ - { - "MessageId": "", - "ReceiptHandle": "", - "MD5OfBody": "", - "Body": { - "version": "0", - "id": "", - "detail-type": "CustomType", - "source": "MySource", - "account": "111111111111", - "time": "date", - "region": "", - "resources": [], - "detail": { - "message": "for the default event bus" - } + "list-targets-limit-next-token": { + "Targets": [ + { + "Arn": "", + "Id": "3" + }, + { + "Arn": "", + "Id": "4" } + ], + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 200 } - ], - "non-existent-bus-error": { + } + } + }, + "tests/aws/services/events/test_events.py::TestEventTarget::test_put_target_id_validation": { + "recorded-date": "29-04-2024, 13:17:26", + "recorded-content": { + "put-targets-invalid-id-error": { "Error": { - "Code": "ResourceNotFoundException", - "Message": "Event bus does not exist." + "Code": "ValidationException", + "Message": "1 validation error detected: Value '!@#$@!#$' at 'targets.1.member.id' failed to satisfy constraint: Member must satisfy regular expression pattern: [\\.\\-_A-Za-z0-9]+" + }, + "ResponseMetadata": { + "HTTPHeaders": {}, + "HTTPStatusCode": 400 + } + }, + "put-targets-length-error": { + "Error": { + "Code": "ValidationException", + "Message": "1 validation error detected: Value 'second-invalid-target-id' at 'targets.1.member.id' failed to satisfy constraint: Member must have length less than or equal to 64" }, "ResponseMetadata": { "HTTPHeaders": {}, diff --git a/tests/aws/services/events/test_events.validation.json b/tests/aws/services/events/test_events.validation.json index 9c1bb67593892..dd22b7d3333c7 100644 --- a/tests/aws/services/events/test_events.validation.json +++ b/tests/aws/services/events/test_events.validation.json @@ -1,128 +1,92 @@ { "tests/aws/services/events/test_events.py::TestEventBus::test_create_list_describe_delete_custom_event_buses[regions0]": { - "last_validated_date": "2024-04-23T06:11:32+00:00" + "last_validated_date": "2024-04-29T13:15:44+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_create_list_describe_delete_custom_event_buses[regions1]": { - "last_validated_date": "2024-04-23T06:11:34+00:00" + "last_validated_date": "2024-04-29T13:15:47+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_create_multiple_event_buses_same_name": { - "last_validated_date": "2024-04-22T13:11:10+00:00" + "last_validated_date": "2024-04-29T13:15:47+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_delete_default_event_bus": { - "last_validated_date": "2024-04-22T13:11:12+00:00" + "last_validated_date": "2024-04-29T13:15:49+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_describe_delete_not_existing_event_bus": { - "last_validated_date": "2024-04-22T13:11:12+00:00" + "last_validated_date": "2024-04-29T13:15:49+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_list_event_buses_with_limit": { - "last_validated_date": "2024-04-22T13:11:15+00:00" + "last_validated_date": "2024-04-29T13:15:52+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_list_event_buses_with_prefix": { - "last_validated_date": "2024-04-22T13:19:19+00:00" + "last_validated_date": "2024-04-29T13:15:50+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_put_events_nonexistent_event_bus": { - "last_validated_date": "2024-04-22T13:12:23+00:00" + "last_validated_date": "2024-04-29T13:18:57+00:00" }, "tests/aws/services/events/test_events.py::TestEventBus::test_put_events_to_default_eventbus_for_custom_eventbus": { - "last_validated_date": "2024-04-22T13:11:43+00:00" + "last_validated_date": "2024-04-29T13:16:20+00:00" + }, + "tests/aws/services/events/test_events.py::TestEventPattern::test_put_events_pattern_nested": { + "last_validated_date": "2024-04-29T13:17:16+00:00" + }, + "tests/aws/services/events/test_events.py::TestEventPattern::test_put_events_pattern_with_values_in_array": { + "last_validated_date": "2024-04-29T13:17:04+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_delete_rule_with_targets": { - "last_validated_date": "2024-04-22T13:07:46+00:00" + "last_validated_date": "2024-04-29T13:16:53+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_describe_nonexistent_rule": { - "last_validated_date": "2024-04-22T13:07:42+00:00" + "last_validated_date": "2024-04-29T13:16:49+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_disable_re_enable_rule[custom]": { - "last_validated_date": "2024-04-22T13:07:43+00:00" + "last_validated_date": "2024-04-29T13:16:50+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_disable_re_enable_rule[default]": { - "last_validated_date": "2024-04-22T13:07:45+00:00" + "last_validated_date": "2024-04-29T13:16:52+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_list_rule_with_limit": { - "last_validated_date": "2024-04-22T13:07:40+00:00" + "last_validated_date": "2024-04-29T13:16:47+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_put_list_with_prefix_describe_delete_rule[custom]": { - "last_validated_date": "2024-04-22T13:07:35+00:00" + "last_validated_date": "2024-04-29T13:16:41+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_put_list_with_prefix_describe_delete_rule[default]": { - "last_validated_date": "2024-04-22T13:07:36+00:00" + "last_validated_date": "2024-04-29T13:16:43+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_put_multiple_rules_with_same_name": { - "last_validated_date": "2024-04-22T13:07:38+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_rule[custom]": { - "last_validated_date": "2024-04-04T10:47:20+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventRule::test_put_rule[default]": { - "last_validated_date": "2024-04-04T10:47:21+00:00" + "last_validated_date": "2024-04-29T13:16:44+00:00" }, "tests/aws/services/events/test_events.py::TestEventRule::test_update_rule_with_targets": { - "last_validated_date": "2024-04-22T13:07:48+00:00" + "last_validated_date": "2024-04-29T13:16:55+00:00" }, "tests/aws/services/events/test_events.py::TestEventTarget::test_add_exceed_fife_targets_per_rule": { - "last_validated_date": "2024-04-22T13:07:20+00:00" + "last_validated_date": "2024-04-29T13:17:21+00:00" }, "tests/aws/services/events/test_events.py::TestEventTarget::test_list_target_by_rule_limit": { - "last_validated_date": "2024-04-22T13:07:22+00:00" + "last_validated_date": "2024-04-29T13:17:23+00:00" }, "tests/aws/services/events/test_events.py::TestEventTarget::test_put_list_remove_target[custom]": { - "last_validated_date": "2024-04-22T13:07:17+00:00" + "last_validated_date": "2024-04-29T13:17:18+00:00" }, "tests/aws/services/events/test_events.py::TestEventTarget::test_put_list_remove_target[default]": { - "last_validated_date": "2024-04-22T13:07:18+00:00" + "last_validated_date": "2024-04-29T13:17:20+00:00" }, - "tests/aws/services/events/test_events.py::TestEvents::test_create_connection_validations": { - "last_validated_date": "2024-03-26T14:07:16+00:00" + "tests/aws/services/events/test_events.py::TestEventTarget::test_put_target_id_validation": { + "last_validated_date": "2024-04-29T13:17:26+00:00" }, - "tests/aws/services/events/test_events.py::TestEvents::test_event_pattern": { - "last_validated_date": "2024-03-26T14:07:19+00:00" + "tests/aws/services/events/test_events.py::TestEvents::test_create_connection_validations": { + "last_validated_date": "2024-04-29T13:15:43+00:00" }, "tests/aws/services/events/test_events.py::TestEvents::test_list_tags_for_resource": { - "last_validated_date": "2024-03-26T14:06:51+00:00" + "last_validated_date": "2024-04-29T13:15:38+00:00" }, "tests/aws/services/events/test_events.py::TestEvents::test_put_event_without_detail": { - "last_validated_date": "2024-03-26T14:07:16+00:00" - }, - "tests/aws/services/events/test_events.py::TestEvents::test_put_event_without_source": { - "last_validated_date": "2024-03-26T14:07:16+00:00" + "last_validated_date": "2024-04-29T13:15:31+00:00" }, "tests/aws/services/events/test_events.py::TestEvents::test_put_events_time": { - "last_validated_date": "2024-03-26T14:09:45+00:00" - }, - "tests/aws/services/events/test_events.py::TestEvents::test_put_events_with_nested_event_pattern": { - "last_validated_date": "2024-03-26T14:07:10+00:00" - }, - "tests/aws/services/events/test_events.py::TestEvents::test_put_events_with_values_in_array": { - "last_validated_date": "2024-03-26T14:06:58+00:00" - }, - "tests/aws/services/events/test_events.py::TestEvents::test_put_target_id_validation": { - "last_validated_date": "2024-04-18T15:47:35+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_create_custom_event_bus": { - "last_validated_date": "2024-03-27T09:15:34+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_create_list_describe_delete_custom_event_buses[regions0]": { - "last_validated_date": "2024-04-03T13:49:07+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_create_list_describe_delete_custom_event_buses[regions1]": { - "last_validated_date": "2024-04-03T13:49:10+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_create_multiple_event_buses_same_name": { - "last_validated_date": "2024-04-16T15:09:51+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_delete_default_event_bus": { - "last_validated_date": "2024-04-16T15:10:07+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_describe_delete_not_existing_event_bus": { - "last_validated_date": "2024-04-17T07:32:19+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_list_event_buses_with_limit": { - "last_validated_date": "2024-04-03T14:53:31+00:00" - }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_put_events_nonexistent_event_bus": { - "last_validated_date": "2024-04-16T15:10:30+00:00" + "last_validated_date": "2024-04-29T13:15:34+00:00" }, - "tests/aws/services/events/test_events.py::TestEventsEventBus::test_put_events_to_default_eventbus_for_custom_eventbus": { - "last_validated_date": "2024-03-26T14:07:59+00:00" + "tests/aws/services/events/test_events.py::TestEvents::test_put_events_without_source": { + "last_validated_date": "2024-04-29T13:15:31+00:00" } } diff --git a/tests/aws/services/events/test_events_integrations.py b/tests/aws/services/events/test_events_integrations.py index 2124fdca6204c..9c8659322d498 100644 --- a/tests/aws/services/events/test_events_integrations.py +++ b/tests/aws/services/events/test_events_integrations.py @@ -20,7 +20,7 @@ @markers.aws.validated -def test_put_events_with_target_sqs(put_events_with_filter_to_sqs): +def test_put_events_with_target_sqs(put_events_with_filter_to_sqs, snapshot): entries = [ { "Source": TEST_EVENT_PATTERN["source"][0], @@ -28,10 +28,17 @@ def test_put_events_with_target_sqs(put_events_with_filter_to_sqs): "Detail": json.dumps(EVENT_DETAIL), } ] - put_events_with_filter_to_sqs( + message = put_events_with_filter_to_sqs( pattern=TEST_EVENT_PATTERN, entries_asserts=[(entries, True)], ) + snapshot.add_transformers_list( + [ + snapshot.transform.key_value("ReceiptHandle", reference_replacement=False), + snapshot.transform.key_value("MD5OfBody", reference_replacement=False), + ], + ) + snapshot.match("message", message) @markers.aws.unknown @@ -76,9 +83,9 @@ def test_put_events_with_target_sqs_new_region(aws_client_factory): assert "EventId" in response.get("Entries")[0] -@markers.aws.unknown +@markers.aws.validated @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") -def test_put_events_with_target_sqs_event_detail_match(put_events_with_filter_to_sqs): +def test_put_events_with_target_sqs_event_detail_match(put_events_with_filter_to_sqs, snapshot): entries1 = [ { "Source": TEST_EVENT_PATTERN["source"][0], @@ -94,19 +101,26 @@ def test_put_events_with_target_sqs_event_detail_match(put_events_with_filter_to } ] entries_asserts = [(entries1, True), (entries2, False)] - put_events_with_filter_to_sqs( + messages = put_events_with_filter_to_sqs( pattern={"detail": {"EventType": ["0", "1"]}}, entries_asserts=entries_asserts, input_path="$.detail", ) + snapshot.add_transformers_list( + [ + snapshot.transform.key_value("ReceiptHandle", reference_replacement=False), + snapshot.transform.key_value("MD5OfBody", reference_replacement=False), + ], + ) + snapshot.match("messages", messages) + # TODO: further unify/parameterize the tests for the different target types below -@markers.aws.unknown +@markers.aws.needs_fixing @pytest.mark.parametrize("strategy", ["standard", "domain", "path"]) -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_with_target_sns( monkeypatch, sns_subscription, @@ -174,8 +188,7 @@ def test_put_events_with_target_sns( ) -@markers.aws.unknown -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") +@markers.aws.needs_fixing def test_put_events_with_target_lambda(create_lambda_function, cleanups, aws_client, clean_up): rule_name = f"rule-{short_uid()}" function_name = f"lambda-func-{short_uid()}" @@ -237,7 +250,6 @@ def test_put_events_with_target_lambda(create_lambda_function, cleanups, aws_cli @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_with_target_lambda_list_entry( create_lambda_function, cleanups, aws_client, clean_up, snapshot ): @@ -334,7 +346,6 @@ def test_put_events_with_target_lambda_list_entry( @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_with_target_lambda_list_entries_partial_match( create_lambda_function, cleanups, aws_client, clean_up, snapshot ): @@ -482,8 +493,7 @@ def check_invocation(): retry(check_invocation, sleep=5, retries=15) -@markers.aws.unknown -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") +@markers.aws.needs_fixing def test_put_events_with_target_firehose(aws_client, clean_up): s3_bucket = "s3-{}".format(short_uid()) s3_prefix = "testeventdata" diff --git a/tests/aws/services/events/test_events_integrations.snapshot.json b/tests/aws/services/events/test_events_integrations.snapshot.json index a52a6f84d34b3..e27cdb2a10e9e 100644 --- a/tests/aws/services/events/test_events_integrations.snapshot.json +++ b/tests/aws/services/events/test_events_integrations.snapshot.json @@ -100,5 +100,49 @@ } ] } + }, + "tests/aws/services/events/test_events_integrations.py::test_put_events_with_target_sqs": { + "recorded-date": "26-04-2024, 08:43:27", + "recorded-content": { + "message": [ + { + "MessageId": "", + "ReceiptHandle": "receipt-handle", + "MD5OfBody": "m-d5-of-body", + "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" + } + } + } + } + ] + } + }, + "tests/aws/services/events/test_events_integrations.py::test_put_events_with_target_sqs_event_detail_match": { + "recorded-date": "07-05-2024, 10:40:38", + "recorded-content": { + "messages": [ + { + "MessageId": "", + "ReceiptHandle": "receipt-handle", + "MD5OfBody": "m-d5-of-body", + "Body": { + "EventType": "1" + } + } + ] + } } } diff --git a/tests/aws/services/events/test_events_integrations.validation.json b/tests/aws/services/events/test_events_integrations.validation.json index 6d701cbe30a64..bf2860707799f 100644 --- a/tests/aws/services/events/test_events_integrations.validation.json +++ b/tests/aws/services/events/test_events_integrations.validation.json @@ -6,10 +6,10 @@ "last_validated_date": "2024-04-08T17:33:44+00:00" }, "tests/aws/services/events/test_events_integrations.py::test_put_events_with_target_sqs": { - "last_validated_date": "2024-03-26T15:49:59+00:00" + "last_validated_date": "2024-04-26T08:43:27+00:00" }, "tests/aws/services/events/test_events_integrations.py::test_put_events_with_target_sqs_event_detail_match": { - "last_validated_date": "2024-03-26T15:50:07+00:00" + "last_validated_date": "2024-05-07T10:40:38+00:00" }, "tests/aws/services/events/test_events_integrations.py::test_should_ignore_schedules_for_put_event": { "last_validated_date": "2024-03-26T15:51:47+00:00" diff --git a/tests/aws/services/events/test_events_rules.py b/tests/aws/services/events/test_events_rules.py index 63758ca8db630..1926910cc8261 100644 --- a/tests/aws/services/events/test_events_rules.py +++ b/tests/aws/services/events/test_events_rules.py @@ -14,11 +14,10 @@ from localstack.utils.sync import poll_condition from tests.aws.services.events.conftest import assert_valid_event, sqs_collect_messages from tests.aws.services.events.helper_functions import is_v2_provider -from tests.aws.services.events.test_events import TEST_EVENT_BUS_NAME, TEST_EVENT_PATTERN +from tests.aws.services.events.test_events import TEST_EVENT_PATTERN @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_rule(aws_client, snapshot, clean_up): rule_name = f"rule-{short_uid()}" snapshot.add_transformer(snapshot.transform.regex(rule_name, "")) @@ -38,7 +37,6 @@ def test_put_rule(aws_client, snapshot, clean_up): @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_rule_disable(aws_client, clean_up): rule_name = f"rule-{short_uid()}" aws_client.events.put_rule(Name=rule_name, ScheduleExpression="rate(1 minute)") @@ -54,6 +52,8 @@ def test_rule_disable(aws_client, clean_up): @markers.aws.validated +# TODO move to test_events_schedules.py +@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") @pytest.mark.parametrize( "expression", [ @@ -76,7 +76,6 @@ def test_rule_disable(aws_client, clean_up): " rate(10 minutes)", ], ) -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_rule_invalid_rate_schedule_expression(expression, aws_client): with pytest.raises(ClientError) as e: aws_client.events.put_rule(Name=f"rule-{short_uid()}", ScheduleExpression=expression) @@ -88,7 +87,6 @@ def test_put_rule_invalid_rate_schedule_expression(expression, aws_client): @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_with_rule_anything_but_to_sqs(put_events_with_filter_to_sqs, snapshot): snapshot.add_transformer( [ @@ -142,7 +140,6 @@ def test_put_events_with_rule_anything_but_to_sqs(put_events_with_filter_to_sqs, @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_with_rule_exists_true_to_sqs(put_events_with_filter_to_sqs, snapshot): """ Exists matching True condition: https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html#eb-filtering-exists-matching @@ -190,7 +187,6 @@ def test_put_events_with_rule_exists_true_to_sqs(put_events_with_filter_to_sqs, @markers.aws.validated -@pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") def test_put_events_with_rule_exists_false_to_sqs(put_events_with_filter_to_sqs, snapshot): """ Exists matching False condition: https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-event-patterns-content-based-filtering.html#eb-filtering-exists-matching @@ -243,6 +239,7 @@ def test_put_event_with_content_base_rule_in_pattern(aws_client, clean_up): queue_name = f"queue-{short_uid()}" rule_name = f"rule-{short_uid()}" target_id = f"target-{short_uid()}" + event_bus_name = f"event-bus-{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) @@ -276,7 +273,7 @@ def test_put_event_with_content_base_rule_in_pattern(aws_client, clean_up): } event = { - "EventBusName": TEST_EVENT_BUS_NAME, + "EventBusName": event_bus_name, "Source": "core.update-account-command", "DetailType": "core.app.backend", "Detail": json.dumps( @@ -303,16 +300,16 @@ def test_put_event_with_content_base_rule_in_pattern(aws_client, clean_up): ), } - aws_client.events.create_event_bus(Name=TEST_EVENT_BUS_NAME) + aws_client.events.create_event_bus(Name=event_bus_name) aws_client.events.put_rule( Name=rule_name, - EventBusName=TEST_EVENT_BUS_NAME, + EventBusName=event_bus_name, EventPattern=json.dumps(pattern), ) aws_client.events.put_targets( Rule=rule_name, - EventBusName=TEST_EVENT_BUS_NAME, + EventBusName=event_bus_name, Targets=[{"Id": target_id, "Arn": queue_arn, "InputPath": "$.detail"}], ) aws_client.events.put_events(Entries=[event]) @@ -331,7 +328,7 @@ def test_put_event_with_content_base_rule_in_pattern(aws_client, clean_up): # clean up clean_up( - bus_name=TEST_EVENT_BUS_NAME, + bus_name=event_bus_name, rule_name=rule_name, target_ids=target_id, queue_url=queue_url, @@ -339,8 +336,9 @@ def test_put_event_with_content_base_rule_in_pattern(aws_client, clean_up): @markers.aws.validated -@pytest.mark.parametrize("schedule_expression", ["rate(1 minute)", "rate(1 day)", "rate(1 hour)"]) +# TODO move to test_events_schedules.py @pytest.mark.skipif(is_v2_provider(), reason="V2 provider does not support this feature yet") +@pytest.mark.parametrize("schedule_expression", ["rate(1 minute)", "rate(1 day)", "rate(1 hour)"]) def test_create_rule_with_one_unit_in_singular_should_succeed( schedule_expression, aws_client, clean_up ):