Skip to content

Commit 604f787

Browse files
committed
feat(parser): adds support for S3 event notifications through EventBridge
1 parent 32b6638 commit 604f787

File tree

1 file changed

+159
-1
lines changed

1 file changed

+159
-1
lines changed

tests/functional/parser/test_s3.py

Lines changed: 159 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
11
import pytest
22

33
from aws_lambda_powertools.utilities.parser import ValidationError, event_parser, parse
4-
from aws_lambda_powertools.utilities.parser.models import S3Model, S3RecordModel
4+
from aws_lambda_powertools.utilities.parser.envelopes import EventBridgeEnvelope
5+
from aws_lambda_powertools.utilities.parser.models import (
6+
S3EventNotificationEventBridgeDetailModel,
7+
S3EventNotificationObjectModel,
8+
S3Model,
9+
S3RecordModel,
10+
)
511
from aws_lambda_powertools.utilities.typing import LambdaContext
612
from tests.functional.utils import load_event
713

@@ -111,6 +117,26 @@ def test_s3_none_etag_value_failed_validation():
111117
parse(event=event_dict, model=S3Model)
112118

113119

120+
def test_s3_eventbridge_notification_object_created_event():
121+
event_dict = load_event("s3EventBridgeNotificationObjectCreatedEvent.json")
122+
handle_s3_eventbridge_object_created(event_dict, LambdaContext())
123+
124+
125+
def test_s3_eventbridge_notification_object_deleted_event():
126+
event_dict = load_event("s3EventBridgeNotificationObjectDeletedEvent.json")
127+
handle_s3_eventbridge_object_deleted(event_dict, LambdaContext())
128+
129+
130+
def test_s3_eventbridge_notification_object_expired_event():
131+
event_dict = load_event("s3EventBridgeNotificationObjectExpiredEvent.json")
132+
handle_s3_eventbridge_object_expired(event_dict, LambdaContext())
133+
134+
135+
def test_s3_eventbridge_notification_object_restore_completed_event():
136+
event_dict = load_event("s3EventBridgeNotificationObjectRestoreCompletedEvent.json")
137+
handle_s3_eventbridge_object_restore_completed(event_dict, LambdaContext())
138+
139+
114140
@event_parser(model=S3Model)
115141
def handle_s3_delete_object(event: S3Model, _: LambdaContext):
116142
records = list(event.Records)
@@ -149,3 +175,135 @@ def handle_s3_delete_object(event: S3Model, _: LambdaContext):
149175
def test_s3_trigger_event_delete_object():
150176
event_dict = load_event("s3EventDeleteObject.json")
151177
handle_s3_delete_object(event_dict, LambdaContext())
178+
179+
180+
@event_parser(model=S3EventNotificationEventBridgeDetailModel, envelope=EventBridgeEnvelope)
181+
def handle_s3_eventbridge_object_created(event: S3EventNotificationEventBridgeDetailModel, _: LambdaContext):
182+
"""
183+
Tests that the `S3EventNotificationEventBridgeDetailModel` parses events from
184+
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ev-events.html
185+
"""
186+
bucket_name = "example-bucket"
187+
deletion_type = None
188+
destination_access_tier = None
189+
destination_storage_class = None
190+
_object: S3EventNotificationObjectModel = event.object
191+
reason = "PutObject"
192+
request_id = "57H08PA84AB1JZW0"
193+
requester = "123456789012"
194+
restore_expiry_time = None
195+
source_ip_address = "34.252.34.74"
196+
source_storage_class = None
197+
version = "0"
198+
199+
assert bucket_name == event.bucket.name
200+
assert deletion_type == event.deletion_type
201+
assert destination_access_tier == event.destination_access_tier
202+
assert destination_storage_class == event.destination_storage_class
203+
assert _object == event.object
204+
assert reason == event.reason
205+
assert request_id == event.request_id
206+
assert requester == event.requester
207+
assert restore_expiry_time == event.restore_expiry_time
208+
assert source_ip_address == event.source_ip_address
209+
assert source_storage_class == event.source_storage_class
210+
assert version == event.version
211+
212+
213+
@event_parser(model=S3EventNotificationEventBridgeDetailModel, envelope=EventBridgeEnvelope)
214+
def handle_s3_eventbridge_object_deleted(event: S3EventNotificationEventBridgeDetailModel, _: LambdaContext):
215+
"""
216+
Tests that the `S3EventNotificationEventBridgeDetailModel` parses events from
217+
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ev-events.html
218+
"""
219+
bucket_name = "example-bucket"
220+
deletion_type = "Delete Marker Created"
221+
destination_access_tier = None
222+
destination_storage_class = None
223+
_object: S3EventNotificationObjectModel = event.object
224+
reason = "DeleteObject"
225+
request_id = "0BH729840619AG5K"
226+
requester = "123456789012"
227+
restore_expiry_time = None
228+
source_ip_address = "34.252.34.74"
229+
source_storage_class = None
230+
version = "0"
231+
232+
assert bucket_name == event.bucket.name
233+
assert deletion_type == event.deletion_type
234+
assert destination_access_tier == event.destination_access_tier
235+
assert destination_storage_class == event.destination_storage_class
236+
assert _object == event.object
237+
assert reason == event.reason
238+
assert request_id == event.request_id
239+
assert requester == event.requester
240+
assert restore_expiry_time == event.restore_expiry_time
241+
assert source_ip_address == event.source_ip_address
242+
assert source_storage_class == event.source_storage_class
243+
assert version == event.version
244+
245+
246+
@event_parser(model=S3EventNotificationEventBridgeDetailModel, envelope=EventBridgeEnvelope)
247+
def handle_s3_eventbridge_object_expired(event: S3EventNotificationEventBridgeDetailModel, _: LambdaContext):
248+
"""
249+
Tests that the `S3EventNotificationEventBridgeDetailModel` parses events from
250+
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ev-events.html
251+
"""
252+
bucket_name = "example-bucket"
253+
deletion_type = "Delete Marker Created"
254+
destination_access_tier = None
255+
destination_storage_class = None
256+
_object: S3EventNotificationObjectModel = event.object
257+
reason = "Lifecycle Expiration"
258+
request_id = "20EB74C14654DC47"
259+
requester = "s3.amazonaws.com"
260+
restore_expiry_time = None
261+
source_ip_address = None
262+
source_storage_class = None
263+
version = "0"
264+
265+
assert bucket_name == event.bucket.name
266+
assert deletion_type == event.deletion_type
267+
assert destination_access_tier == event.destination_access_tier
268+
assert destination_storage_class == event.destination_storage_class
269+
assert _object == event.object
270+
assert reason == event.reason
271+
assert request_id == event.request_id
272+
assert requester == event.requester
273+
assert restore_expiry_time == event.restore_expiry_time
274+
assert source_ip_address == event.source_ip_address
275+
assert source_storage_class == event.source_storage_class
276+
assert version == event.version
277+
278+
279+
@event_parser(model=S3EventNotificationEventBridgeDetailModel, envelope=EventBridgeEnvelope)
280+
def handle_s3_eventbridge_object_restore_completed(event: S3EventNotificationEventBridgeDetailModel, _: LambdaContext):
281+
"""
282+
Tests that the `S3EventNotificationEventBridgeDetailModel` parses events from
283+
https://docs.aws.amazon.com/AmazonS3/latest/userguide/ev-events.html
284+
"""
285+
bucket_name = "example-bucket"
286+
deletion_type = None
287+
destination_access_tier = None
288+
destination_storage_class = None
289+
_object: S3EventNotificationObjectModel = event.object
290+
reason = None
291+
request_id = "189F19CB7FB1B6A4"
292+
requester = "s3.amazonaws.com"
293+
restore_expiry_time = "2021-11-13T00:00:00Z"
294+
source_ip_address = None
295+
source_storage_class = "GLACIER"
296+
version = "0"
297+
298+
assert bucket_name == event.bucket.name
299+
assert deletion_type == event.deletion_type
300+
assert destination_access_tier == event.destination_access_tier
301+
assert destination_storage_class == event.destination_storage_class
302+
assert _object == event.object
303+
assert reason == event.reason
304+
assert request_id == event.request_id
305+
assert requester == event.requester
306+
assert restore_expiry_time == event.restore_expiry_time
307+
assert source_ip_address == event.source_ip_address
308+
assert source_storage_class == event.source_storage_class
309+
assert version == event.version

0 commit comments

Comments
 (0)