88os .environ ["AWS_SQS_QUEUE_URL" ] = "https://sqs.us-east-1.amazonaws.com/123456789012/MyQueue"
99os .environ ["DELTA_TABLE_NAME" ] = "my_delta_table"
1010os .environ ["SOURCE" ] = "my_source"
11+ os .environ ["SPLUNK_FIREHOSE_NAME" ] = "my_firehose"
1112
1213from src .delta import send_message , handler # Import after setting environment variables
1314import json
@@ -25,6 +26,19 @@ def setup_mock_sqs(mock_boto_client, return_value={"ResponseMetadata": {"HTTPSta
2526 mock_sqs .send_message .return_value = return_value
2627 return mock_sqs
2728
29+ @staticmethod
30+ def setup_mock_firehose (mock_boto_client , return_value = {"ResponseMetadata" : {"HTTPStatusCode" : 200 }}):
31+ mock_firehose = mock_boto_client .return_value
32+ mock_firehose .put_record .return_value = return_value
33+ return mock_firehose
34+
35+ @staticmethod
36+ def setup_mock_firehose (mock_boto_client , return_value = {"ResponseMetadata" : {"HTTPStatusCode" : 200 }}):
37+ mock_firehose = mock_boto_client .return_value
38+ mock_firehose .put_record .return_value = return_value
39+ return mock_firehose
40+
41+
2842 @staticmethod
2943 def setup_mock_dynamodb (mock_boto_resource , status_code = 200 ):
3044 """
@@ -128,9 +142,11 @@ def test_send_message_client_error(self, mock_logger_info, mock_boto_client):
128142 f"Error sending record to DLQ: An error occurred (500) when calling the SendMessage operation: Internal Server Error"
129143 )
130144
145+ @patch ("delta.FirehoseLogger.send_log" )
131146 @patch ("boto3.resource" )
132- def test_handler_success_insert (self , mock_boto_resource ):
147+ def test_handler_success_insert (self , mock_boto_resource , mock_send_log ):
133148 # Arrange
149+ mock_send_log .return_value = None
134150 self .setup_mock_dynamodb (mock_boto_resource )
135151 suppilers = ["DPS" , "EMIS" ]
136152 for supplier in suppilers :
@@ -144,9 +160,11 @@ def test_handler_success_insert(self, mock_boto_resource):
144160 # Assert
145161 self .assertEqual (result ["statusCode" ], 200 )
146162
163+ @patch ("delta.FirehoseLogger.send_log" )
147164 @patch ("boto3.resource" )
148- def test_handler_failure (self , mock_boto_resource ):
165+ def test_handler_failure (self , mock_boto_resource , mock_send_log ):
149166 # Arrange
167+ mock_send_log .return_value = None
150168 self .setup_mock_dynamodb (mock_boto_resource , status_code = 500 )
151169 event = self .get_event ()
152170
@@ -156,9 +174,11 @@ def test_handler_failure(self, mock_boto_resource):
156174 # Assert
157175 self .assertEqual (result ["statusCode" ], 500 )
158176
177+ @patch ("delta.FirehoseLogger.send_log" )
159178 @patch ("boto3.resource" )
160- def test_handler_success_update (self , mock_boto_resource ):
179+ def test_handler_success_update (self , mock_boto_resource , mock_send_log ):
161180 # Arrange
181+ mock_send_log .return_value = None
162182 self .setup_mock_dynamodb (mock_boto_resource )
163183 event = self .get_event (event_name = "UPDATE" , operation = "UPDATE" )
164184
@@ -168,9 +188,11 @@ def test_handler_success_update(self, mock_boto_resource):
168188 # Assert
169189 self .assertEqual (result ["statusCode" ], 200 )
170190
191+ @patch ("delta.FirehoseLogger.send_log" )
171192 @patch ("boto3.resource" )
172- def test_handler_success_remove (self , mock_boto_resource ):
193+ def test_handler_success_remove (self , mock_boto_resource , mock_send_log ):
173194 # Arrange
195+ mock_send_log .return_value = None
174196 self .setup_mock_dynamodb (mock_boto_resource )
175197 event = self .get_event (event_name = "REMOVE" , operation = "DELETE" )
176198
@@ -180,10 +202,12 @@ def test_handler_success_remove(self, mock_boto_resource):
180202 # Assert
181203 self .assertEqual (result ["statusCode" ], 200 )
182204
205+ @patch ("delta.FirehoseLogger.send_log" ) # Patch the method directly
183206 @patch ("boto3.resource" )
184207 @patch ("boto3.client" )
185- def test_handler_exception_intrusion_check (self , mock_boto_resource , mock_boto_client ):
208+ def test_handler_exception_intrusion_check (self , mock_boto_resource , mock_boto_client , mock_send_log ):
186209 # Arrange
210+ mock_send_log .return_value = None
187211 self .setup_mock_dynamodb (mock_boto_resource , status_code = 500 )
188212 mock_boto_client .return_value = MagicMock ()
189213 event = self .get_event ()
@@ -193,22 +217,26 @@ def test_handler_exception_intrusion_check(self, mock_boto_resource, mock_boto_c
193217 result = handler (event , self .context )
194218 self .assertEqual (result ["statusCode" ], 500 )
195219
220+ @patch ("delta.FirehoseLogger.send_log" ) # Patch the method directly
196221 @patch ("boto3.resource" )
197222 @patch ("boto3.client" )
198- def test_handler_exception_intrusion (self , mock_boto_resource , mock_boto_client ):
223+ def test_handler_exception_intrusion (self , mock_boto_resource , mock_boto_client , mock_send_log ):
199224 # Arrange
200225 self .setUp_mock_resources (mock_boto_resource , mock_boto_client )
226+ mock_send_log .return_value = None
201227 event = self .get_event ()
202228 context = {}
203229
204230 # Act & Assert
205231 with self .assertRaises (Exception ):
206232 handler (event , context )
207233
234+ @patch ("delta.FirehoseLogger.send_log" )
208235 @patch ("boto3.resource" )
209236 @patch ("delta.handler" )
210- def test_handler_exception_intrusion_check_false (self , mock_boto_resource , mock_boto_client ):
237+ def test_handler_exception_intrusion_check_false (self , mock_boto_resource , mock_boto_client , mock_send_log ):
211238 # Arrange
239+ mock_send_log .return_value = None
212240 self .setUp_mock_resources (mock_boto_resource , mock_boto_client )
213241 event = self .get_event ()
214242 context = {}
@@ -217,27 +245,45 @@ def test_handler_exception_intrusion_check_false(self, mock_boto_resource, mock_
217245 with self .assertRaises (Exception ):
218246 handler (event , context )
219247
220- @patch ("delta.firehose_logger.send_log" ) # Mock Firehose logger
221- @patch ("delta.logger.info" ) # Mock logging
222- def test_dps_record_skipped (self , mock_logger_info , mock_firehose_send_log ):
248+ @patch ("delta.FirehoseLogger.send_log" ) # Patch the method directly
249+ @patch ("boto3.client" )
250+ @patch ("delta.logger.info" )
251+ def test_dps_record_skipped (self , mock_logger_info , mock_boto_client , mock_send_log ):
252+ """
253+ Test that DPSFULL records are skipped and Firehose put_record is mocked.
254+ """
255+ # Arrange
256+ mock_firehose_client = self .setup_mock_firehose (mock_boto_client )
257+
258+ mock_send_log .return_value = None
259+
260+ # Create a test event with supplier "DPSFULL"
223261 event = self .get_event (supplier = "DPSFULL" )
224262 context = {}
225263
264+ # Act
226265 response = handler (event , context )
227- print (f"final response1: { response } " )
228266
267+ # Assert
268+ # check send_log was called
269+ mock_send_log .assert_called_once ()
229270 self .assertEqual (response ["statusCode" ], 200 )
230271 self .assertEqual (response ["body" ], "Record from DPS skipped for 12345" )
231272
232- # Check logging and Firehose were called
273+ # Check logging was called
233274 mock_logger_info .assert_called_with ("Record from DPS skipped for 12345" )
234275
235- # TODO - amend test once error handling implemented
236- @patch ("delta.firehose_logger.send_log" )
276+ # Ensure Firehose put_record was not called since DPSFULL records are skipped
277+ mock_firehose_client .put_record .assert_not_called ()
278+
279+ # # TODO - amend test once error handling implemented
280+ @patch ("delta.FirehoseLogger.send_log" ) # Patch the method directly
237281 @patch ("delta.logger.info" )
238282 @patch ("Converter.Converter" )
239283 @patch ("delta.boto3.resource" )
240- def test_partial_success_with_errors (self , mock_dynamodb , mock_converter , mock_logger_info , mock_firehose_send_log ):
284+ def test_partial_success_with_errors (self , mock_dynamodb , mock_converter , mock_logger_info , mock_send_log ):
285+
286+ mock_send_log .return_value = None
241287 mock_converter_instance = MagicMock ()
242288 mock_converter_instance .runConversion .return_value = [{}]
243289 mock_converter_instance .getErrorRecords .return_value = [{"error" : "Invalid field" }]
0 commit comments