@@ -325,105 +325,6 @@ def test_non_vpc_flowlog_includes_first_line(self):
325325 self .assertEqual (len (structured_lines ), 3 )
326326 self .assertEqual (structured_lines [0 ]["message" ], "first line of data" )
327327
328- @patch ("steps.handlers.s3_handler.boto3" )
329- def test_eventbridge_s3_object_created_event (self , mock_boto3 ):
330- """Test EventBridge S3 Object Created event is transformed and processed correctly"""
331- mock_s3_client = MagicMock ()
332- mock_s3_client .get_object .return_value = {
333- "Body" : MagicMock (read = MagicMock (return_value = b"test log line" ))
334- }
335- mock_boto3 .client .return_value = mock_s3_client
336-
337- eventbridge_event = {
338- "version" : "0" ,
339- "id" : "test-event-id" ,
340- "detail-type" : "Object Created" ,
341- "source" : "aws.s3" ,
342- "account" : "123456789012" ,
343- "time" : "2024-01-15T12:00:00Z" ,
344- "region" : "us-east-1" ,
345- "resources" : ["arn:aws:s3:::my-bucket" ],
346- "detail" : {
347- "version" : "0" ,
348- "bucket" : {"name" : "my-bucket" },
349- "object" : {
350- "key" : "my-key.log" ,
351- "size" : 1234 ,
352- "etag" : "abc123" ,
353- "sequencer" : "xyz789" ,
354- },
355- "request-id" : "request-id" ,
356- "requester" : "123456789012" ,
357- "source-ip-address" : "1.2.3.4" ,
358- "reason" : "PutObject" ,
359- },
360- }
361-
362- logs = list (self .s3_handler .handle (eventbridge_event ))
363-
364- self .assertEqual (len (logs ), 1 )
365- self .assertEqual (logs [0 ]["message" ], "test log line" )
366- self .assertEqual (logs [0 ]["aws" ]["s3" ]["bucket" ], "my-bucket" )
367- self .assertEqual (logs [0 ]["aws" ]["s3" ]["key" ], "my-key.log" )
368- mock_s3_client .get_object .assert_called_once_with (
369- Bucket = "my-bucket" , Key = "my-key.log"
370- )
371-
372- @patch ("steps.handlers.s3_handler.boto3" )
373- def test_eventbridge_s3_with_gzip_file (self , mock_boto3 ):
374- """Test EventBridge S3 event with gzipped file"""
375- mock_s3_client = MagicMock ()
376- gzip_data = gzip .compress (b"gzipped log line" )
377- mock_s3_client .get_object .return_value = {
378- "Body" : MagicMock (read = MagicMock (return_value = gzip_data ))
379- }
380- mock_boto3 .client .return_value = mock_s3_client
381-
382- eventbridge_event = {
383- "version" : "0" ,
384- "detail-type" : "Object Created" ,
385- "source" : "aws.s3" ,
386- "detail" : {
387- "bucket" : {"name" : "my-bucket" },
388- "object" : {"key" : "my-key.log.gz" },
389- },
390- }
391-
392- logs = list (self .s3_handler .handle (eventbridge_event ))
393-
394- self .assertEqual (len (logs ), 1 )
395- self .assertEqual (logs [0 ]["message" ], "gzipped log line" )
396-
397- @patch ("steps.handlers.s3_handler.boto3" )
398- def test_eventbridge_s3_cloudtrail (self , mock_boto3 ):
399- """Test EventBridge S3 event with CloudTrail logs"""
400- mock_s3_client = MagicMock ()
401- cloudtrail_data = {
402- "Records" : [
403- {"eventVersion" : "1.05" , "eventName" : "AssumeRole" , "eventSource" : "sts.amazonaws.com" }
404- ]
405- }
406- mock_s3_client .get_object .return_value = {
407- "Body" : MagicMock (read = MagicMock (return_value = gzip .compress (bytes (str (cloudtrail_data ).replace ("'" , '"' ), "utf-8" ))))
408- }
409- mock_boto3 .client .return_value = mock_s3_client
410-
411- eventbridge_event = {
412- "version" : "0" ,
413- "detail-type" : "Object Created" ,
414- "source" : "aws.s3" ,
415- "detail" : {
416- "bucket" : {"name" : "my-bucket" },
417- "object" : {"key" : "123456779121_CloudTrail_eu-west-3_20180707T1735Z_abcdefghi0MCRL2O.json.gz" },
418- },
419- }
420-
421- logs = list (self .s3_handler .handle (eventbridge_event ))
422-
423- self .assertEqual (len (logs ), 1 )
424- self .assertEqual (logs [0 ]["eventName" ], "AssumeRole" )
425- self .assertEqual (logs [0 ]["aws" ]["s3" ]["bucket" ], "my-bucket" )
426-
427328 @patch ("steps.handlers.s3_handler.boto3" )
428329 def test_backward_compatibility_direct_s3 (self , mock_boto3 ):
429330 """Test that direct S3 events still work after EventBridge changes"""
0 commit comments