|
1 | 1 | import gzip |
2 | 2 | import unittest |
| 3 | +from unittest.mock import MagicMock, patch |
3 | 4 | from approvaltests.combination_approvals import verify_all_combinations |
4 | 5 | from steps.handlers.s3_handler import ( |
| 6 | + s3_handler, |
5 | 7 | parse_service_arn, |
6 | 8 | get_partition_from_region, |
7 | 9 | get_structured_lines_for_s3_handler, |
8 | 10 | ) |
9 | 11 |
|
10 | 12 |
|
11 | 13 | class TestS3EventsHandler(unittest.TestCase): |
| 14 | + class Context: |
| 15 | + function_version = 0 |
| 16 | + invoked_function_arn = "invoked_function_arn" |
| 17 | + function_name = "function_name" |
| 18 | + memory_limit_in_mb = "10" |
| 19 | + |
12 | 20 | def parse_lines(self, data, key, source): |
13 | 21 | bucket = "my-bucket" |
14 | 22 | gzip_data = gzip.compress(bytes(data, "utf-8")) |
@@ -59,6 +67,65 @@ def test_get_partition_from_region(self): |
59 | 67 | self.assertEqual(get_partition_from_region("cn-north-1"), "aws-cn") |
60 | 68 | self.assertEqual(get_partition_from_region(None), "aws") |
61 | 69 |
|
| 70 | + @patch("steps.handlers.s3_handler.extract_data") |
| 71 | + @patch("steps.handlers.s3_handler.get_s3_client") |
| 72 | + def test_s3_handler(self, mock_s3_client, extract_data): |
| 73 | + event = { |
| 74 | + "Records": [ |
| 75 | + { |
| 76 | + "s3": { |
| 77 | + "bucket": {"name": "my-bucket"}, |
| 78 | + "object": {"key": "my-key"}, |
| 79 | + } |
| 80 | + } |
| 81 | + ] |
| 82 | + } |
| 83 | + context = self.Context() |
| 84 | + metadata = {"ddtags": ""} |
| 85 | + extract_data.side_effect = [("data".encode("utf-8"))] |
| 86 | + cache_layer = MagicMock() |
| 87 | + structured_lines = list(s3_handler(event, context, metadata, cache_layer)) |
| 88 | + self.assertEqual( |
| 89 | + structured_lines, |
| 90 | + [ |
| 91 | + { |
| 92 | + "aws": {"s3": {"bucket": "my-bucket", "key": "my-key"}}, |
| 93 | + "message": "data", |
| 94 | + } |
| 95 | + ], |
| 96 | + ) |
| 97 | + self.assertEqual(metadata["ddsource"], "s3") |
| 98 | + self.assertEqual(metadata["host"], "arn:aws:s3:::my-bucket") |
| 99 | + |
| 100 | + @patch("steps.handlers.s3_handler.extract_data") |
| 101 | + @patch("steps.handlers.s3_handler.get_s3_client") |
| 102 | + def test_s3_handler_with_sns(self, mock_s3_client, extract_data): |
| 103 | + event = { |
| 104 | + "Records": [ |
| 105 | + { |
| 106 | + "Sns": { |
| 107 | + "Message": '{"Records": [{"s3": {"bucket": {"name": "my-bucket"}, "object": {"key": "sns-my-key"}}}]}' |
| 108 | + } |
| 109 | + } |
| 110 | + ] |
| 111 | + } |
| 112 | + context = self.Context() |
| 113 | + metadata = {"ddtags": ""} |
| 114 | + extract_data.side_effect = [("data".encode("utf-8"))] |
| 115 | + cache_layer = MagicMock() |
| 116 | + structured_lines = list(s3_handler(event, context, metadata, cache_layer)) |
| 117 | + self.assertEqual( |
| 118 | + structured_lines, |
| 119 | + [ |
| 120 | + { |
| 121 | + "aws": {"s3": {"bucket": "my-bucket", "key": "sns-my-key"}}, |
| 122 | + "message": "data", |
| 123 | + } |
| 124 | + ], |
| 125 | + ) |
| 126 | + self.assertEqual(metadata["ddsource"], "s3") |
| 127 | + self.assertEqual(metadata["host"], "arn:aws:s3:::my-bucket") |
| 128 | + |
62 | 129 |
|
63 | 130 | class TestParseServiceArn(unittest.TestCase): |
64 | 131 | def test_elb_s3_key_invalid(self): |
|
0 commit comments