diff --git a/tests/events/s3EventDecodedKey.json b/tests/events/s3EventDecodedKey.json new file mode 100644 index 00000000000..05f5ab5c4bd --- /dev/null +++ b/tests/events/s3EventDecodedKey.json @@ -0,0 +1,40 @@ +{ + "Records": [ + { + "eventVersion": "2.0", + "eventSource": "aws:s3", + "awsRegion": "us-east-1", + "eventTime": "1970-01-01T00:00:00.123Z", + "eventName": "ObjectCreated:Put", + "userIdentity": { + "principalId": "EXAMPLE" + }, + "requestParameters": { + "sourceIPAddress": "127.0.0.1" + }, + "responseElements": { + "x-amz-request-id": "C3D13FE58DE4C810", + "x-amz-id-2": "FMyUVURIY8/IgAtTv8xRjskZQpcIZ9KG4V5Wp6S7S/JRWeUWerMUE5JgHvANOjpD" + }, + "s3": { + "s3SchemaVersion": "1.0", + "configurationId": "testConfigRule", + "bucket": { + "name": "sourcebucket", + "ownerIdentity": { + "principalId": "EXAMPLE" + }, + "arn": "arn:aws:s3:::mybucket" + }, + "object": { + "key": "Happy%20Face.jpg", + "urlDecodedKey": "Happy Face.jpg", + "size": 1024, + "versionId": "version", + "eTag": "d41d8cd98f00b204e9800998ecf8427e", + "sequencer": "Happy Sequencer" + } + } + } + ] +} diff --git a/tests/functional/parser/test_cloudwatch.py b/tests/functional/parser/test_cloudwatch.py index dd7fd503f39..9a61f339140 100644 --- a/tests/functional/parser/test_cloudwatch.py +++ b/tests/functional/parser/test_cloudwatch.py @@ -1,7 +1,7 @@ import base64 import json import zlib -from typing import List +from typing import Any, List import pytest @@ -69,6 +69,14 @@ def test_handle_cloudwatch_trigger_event_no_envelope(): handle_cloudwatch_logs_no_envelope(event_dict, LambdaContext()) +def test_handle_invalid_cloudwatch_trigger_event_no_envelope(): + event_dict: Any = {"awslogs": {"data": "invalid_data"}} + with pytest.raises(ValidationError) as context: + handle_cloudwatch_logs_no_envelope(event_dict, LambdaContext()) + + assert context.value.errors()[0]["msg"] == "unable to decompress data" + + def test_handle_invalid_event_with_envelope(): with pytest.raises(ValidationError): handle_cloudwatch_logs(event={}, context=LambdaContext()) diff --git a/tests/functional/test_lambda_trigger_events.py b/tests/functional/test_lambda_trigger_events.py index 5ca0ec76f16..cf061793d8a 100644 --- a/tests/functional/test_lambda_trigger_events.py +++ b/tests/functional/test_lambda_trigger_events.py @@ -413,6 +413,11 @@ def test_s3_key_unquote_plus(): assert event.object_key == tricky_name +def test_s3_key_url_decoded_key(): + event = S3Event(load_event("s3EventDecodedKey.json")) + assert event.object_key == event.record["s3"]["object"]["urlDecodedKey"] + + def test_s3_glacier_event(): example_event = { "Records": [ @@ -434,6 +439,14 @@ def test_s3_glacier_event(): assert glacier_event_data.restore_event_data.lifecycle_restore_storage_class == "standard" +def test_s3_glacier_event_json(): + event = S3Event(load_event("s3EventGlacier.json")) + glacier_event_data = event.record.glacier_event_data + assert glacier_event_data is not None + assert glacier_event_data.restore_event_data.lifecycle_restoration_expiry_time == "1970-01-01T00:01:00.000Z" + assert glacier_event_data.restore_event_data.lifecycle_restore_storage_class == "standard" + + def test_ses_trigger_event(): event = SESEvent(load_event("sesEvent.json")) diff --git a/tests/unit/test_tracing.py b/tests/unit/test_tracing.py index 3e2492b9e15..c8df34a76a6 100644 --- a/tests/unit/test_tracing.py +++ b/tests/unit/test_tracing.py @@ -57,19 +57,19 @@ def reset_tracing_config(mocker): @pytest.fixture def in_subsegment_mock(): - class Async_context_manager(mock.MagicMock): + class AsyncContextManager(mock.MagicMock): async def __aenter__(self, *args, **kwargs): return self.__enter__() async def __aexit__(self, *args, **kwargs): return self.__exit__(*args, **kwargs) - class In_subsegment(NamedTuple): - in_subsegment: mock.MagicMock = Async_context_manager() + class InSubsegment(NamedTuple): + in_subsegment: mock.MagicMock = AsyncContextManager() put_annotation: mock.MagicMock = mock.MagicMock() put_metadata: mock.MagicMock = mock.MagicMock() - in_subsegment = In_subsegment() + in_subsegment = InSubsegment() in_subsegment.in_subsegment.return_value.__enter__.return_value.put_annotation = in_subsegment.put_annotation in_subsegment.in_subsegment.return_value.__enter__.return_value.put_metadata = in_subsegment.put_metadata