@@ -51,11 +51,10 @@ def setUp_mock_resources(self, mock_boto_resource, mock_boto_client):
5151
5252 @staticmethod
5353 def get_event (event_name = "INSERT" , operation = "CREATE" , supplier = "EMIS" , n_records = 1 ):
54- """ create test event for the handler function"""
55- pk = "covid#"
54+ """Create test event for the handler function."""
5655 return {
5756 "Records" : [
58- DeltaTestCase .get_event_record (f"{ pk } #000 { i } " , event_name , operation , supplier )
57+ DeltaTestCase .get_event_record (f"covid# { i + 1 } 2345 " , event_name , operation , supplier )
5958 for i in range (n_records )
6059 ]
6160 }
@@ -69,12 +68,12 @@ def get_event_record(pk, event_name="INSERT", operation="CREATE", supplier="EMIS
6968 "ApproximateCreationDateTime" : 1690896000 ,
7069 "NewImage" : {
7170 "PK" : {"S" : pk },
72- "PatientSK" : {"S" : "covid#12345" },
71+ "PatientSK" : {"S" : pk },
7372 "IdentifierPK" : {"S" : "system#1" },
7473 "Operation" : {"S" : operation },
7574 "SupplierSystem" : {"S" : supplier },
7675 "Resource" : {
77- "S" : get_test_data_resource (),
76+ "S" : json . dumps ( get_test_data_resource () ),
7877 },
7978 },
8079 },
@@ -85,11 +84,11 @@ def get_event_record(pk, event_name="INSERT", operation="CREATE", supplier="EMIS
8584 "dynamodb" : {
8685 "ApproximateCreationDateTime" : 1690896000 ,
8786 "Keys" : {
88- "PK" : {"S" : "covid#12345" },
89- "PatientSK" : {"S" : "covid#12345" },
87+ "PK" : {"S" : pk },
88+ "PatientSK" : {"S" : pk },
9089 "SupplierSystem" : {"S" : "EMIS" },
9190 "Resource" : {
92- "S" : get_test_data_resource
91+ "S" : json . dumps ( get_test_data_resource ()),
9392 },
9493 },
9594 },
@@ -148,7 +147,7 @@ def test_handler_success_insert(self, mock_boto_resource):
148147 @patch ("boto3.resource" )
149148 def test_handler_failure (self , mock_boto_resource ):
150149 # Arrange
151- mock_boto_resource . side_effect = Exception ( "Simulated DynamoDB failure" )
150+ self . setup_mock_dynamodb ( mock_boto_resource , status_code = 500 )
152151 event = self .get_event ()
153152
154153 # Act
@@ -157,107 +156,107 @@ def test_handler_failure(self, mock_boto_resource):
157156 # Assert
158157 self .assertEqual (result ["statusCode" ], 500 )
159158
160- # @patch("boto3.resource")
161- # def test_handler_success_update(self, mock_boto_resource):
162- # # Arrange
163- # self.setup_mock_dynamodb(mock_boto_resource)
164- # event = self.get_event(event_name="UPDATE", operation="UPDATE")
165-
166- # # Act
167- # result = handler(event, self.context)
168-
169- # # Assert
170- # self.assertEqual(result["statusCode"], 200)
171-
172- # @patch("boto3.resource")
173- # def test_handler_success_remove(self, mock_boto_resource):
174- # # Arrange
175- # self.setup_mock_dynamodb(mock_boto_resource)
176- # event = self.get_event(event_name="REMOVE", operation="DELETE")
177-
178- # # Act
179- # result = handler(event, self.context)
180-
181- # # Assert
182- # self.assertEqual(result["statusCode"], 200)
183-
184- # @patch("boto3.resource")
185- # @patch("boto3.client")
186- # def test_handler_exception_intrusion_check(self, mock_boto_resource, mock_boto_client):
187- # # Arrange
188- # self.setup_mock_dynamodb(mock_boto_resource, status_code=500)
189- # mock_boto_client.return_value = MagicMock()
190- # event = self.get_event()
191-
192- # # Act & Assert
193-
194- # result = handler(event, self.context)
195- # self.assertEqual(result["statusCode"], 500)
196-
197- # @patch("boto3.resource")
198- # @patch("boto3.client")
199- # def test_handler_exception_intrusion(self, mock_boto_resource, mock_boto_client):
200- # # Arrange
201- # self.setUp_mock_resources(mock_boto_resource, mock_boto_client)
202- # event = self.get_event()
203- # context = {}
204-
205- # # Act & Assert
206- # with self.assertRaises(Exception):
207- # handler(event, context)
208-
209- # @patch("boto3.resource")
210- # @patch("delta.handler")
211- # def test_handler_exception_intrusion_check_false(self, mock_boto_resource, mock_boto_client):
212- # # Arrange
213- # self.setUp_mock_resources(mock_boto_resource, mock_boto_client)
214- # event = self.get_event()
215- # context = {}
216-
217- # # Act & Assert
218- # with self.assertRaises(Exception):
219- # handler(event, context)
220-
221- # @patch("delta.firehose_logger.send_log") # Mock Firehose logger
222- # @patch("delta.logger.info") # Mock logging
223- # def test_dps_record_skipped(self, mock_logger_info, mock_firehose_send_log):
224- # event = self.get_event(supplier="DPSFULL")
225- # context = {}
226-
227- # response = handler(event, context)
228- # print(f"final response1: {response}")
229-
230- # self.assertEqual(response["statusCode"], 200)
231- # self.assertEqual(response["body"], "Record from DPS skipped for 12345")
232-
233- # # Check logging and Firehose were called
234- # mock_logger_info.assert_called_with("Record from DPS skipped for 12345")
235-
236- # # TODO - amend test once error handling implemented
237- # @patch("delta.firehose_logger.send_log")
238- # @patch("delta.logger.info")
239- # @patch("Converter.Converter")
240- # @patch("delta.boto3.resource")
241- # def test_partial_success_with_errors(self, mock_dynamodb, mock_converter, mock_logger_info, mock_firehose_send_log):
242- # mock_converter_instance = MagicMock()
243- # mock_converter_instance.runConversion.return_value = [{}]
244- # mock_converter_instance.getErrorRecords.return_value = [{"error": "Invalid field"}]
245- # mock_converter.return_value = mock_converter_instance
246-
247- # # Mock DynamoDB put_item success
248- # mock_table = MagicMock()
249- # mock_dynamodb.return_value.Table.return_value = mock_table
250- # mock_table.put_item.return_value = {"ResponseMetadata": {"HTTPStatusCode": 200}}
251-
252- # event = self.get_event()
253- # context = {}
254-
255- # response = handler(event, context)
256- # print(f"final response: {response}")
257-
258- # # self.assertEqual(response["statusCode"], 207)
259- # # self.assertIn("Partial success", response["body"])
260-
261- # # Check logging and Firehose were called
262- # # mock_logger_info.assert_called()
263- # # mock_firehose_send_log.assert_called()
159+ @patch ("boto3.resource" )
160+ def test_handler_success_update (self , mock_boto_resource ):
161+ # Arrange
162+ self .setup_mock_dynamodb (mock_boto_resource )
163+ event = self .get_event (event_name = "UPDATE" , operation = "UPDATE" )
164+
165+ # Act
166+ result = handler (event , self .context )
167+
168+ # Assert
169+ self .assertEqual (result ["statusCode" ], 200 )
170+
171+ @patch ("boto3.resource" )
172+ def test_handler_success_remove (self , mock_boto_resource ):
173+ # Arrange
174+ self .setup_mock_dynamodb (mock_boto_resource )
175+ event = self .get_event (event_name = "REMOVE" , operation = "DELETE" )
176+
177+ # Act
178+ result = handler (event , self .context )
179+
180+ # Assert
181+ self .assertEqual (result ["statusCode" ], 200 )
182+
183+ @patch ("boto3.resource" )
184+ @patch ("boto3.client" )
185+ def test_handler_exception_intrusion_check (self , mock_boto_resource , mock_boto_client ):
186+ # Arrange
187+ self .setup_mock_dynamodb (mock_boto_resource , status_code = 500 )
188+ mock_boto_client .return_value = MagicMock ()
189+ event = self .get_event ()
190+
191+ # Act & Assert
192+
193+ result = handler (event , self .context )
194+ self .assertEqual (result ["statusCode" ], 500 )
195+
196+ @patch ("boto3.resource" )
197+ @patch ("boto3.client" )
198+ def test_handler_exception_intrusion (self , mock_boto_resource , mock_boto_client ):
199+ # Arrange
200+ self .setUp_mock_resources (mock_boto_resource , mock_boto_client )
201+ event = self .get_event ()
202+ context = {}
203+
204+ # Act & Assert
205+ with self .assertRaises (Exception ):
206+ handler (event , context )
207+
208+ @patch ("boto3.resource" )
209+ @patch ("delta.handler" )
210+ def test_handler_exception_intrusion_check_false (self , mock_boto_resource , mock_boto_client ):
211+ # Arrange
212+ self .setUp_mock_resources (mock_boto_resource , mock_boto_client )
213+ event = self .get_event ()
214+ context = {}
215+
216+ # Act & Assert
217+ with self .assertRaises (Exception ):
218+ handler (event , context )
219+
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 ):
223+ event = self .get_event (supplier = "DPSFULL" )
224+ context = {}
225+
226+ response = handler (event , context )
227+ print (f"final response1: { response } " )
228+
229+ self .assertEqual (response ["statusCode" ], 200 )
230+ self .assertEqual (response ["body" ], "Record from DPS skipped for 12345" )
231+
232+ # Check logging and Firehose were called
233+ mock_logger_info .assert_called_with ("Record from DPS skipped for 12345" )
234+
235+ # TODO - amend test once error handling implemented
236+ @patch ("delta.firehose_logger.send_log" )
237+ @patch ("delta.logger.info" )
238+ @patch ("Converter.Converter" )
239+ @patch ("delta.boto3.resource" )
240+ def test_partial_success_with_errors (self , mock_dynamodb , mock_converter , mock_logger_info , mock_firehose_send_log ):
241+ mock_converter_instance = MagicMock ()
242+ mock_converter_instance .runConversion .return_value = [{}]
243+ mock_converter_instance .getErrorRecords .return_value = [{"error" : "Invalid field" }]
244+ mock_converter .return_value = mock_converter_instance
245+
246+ # Mock DynamoDB put_item success
247+ mock_table = MagicMock ()
248+ mock_dynamodb .return_value .Table .return_value = mock_table
249+ mock_table .put_item .return_value = {"ResponseMetadata" : {"HTTPStatusCode" : 200 }}
250+
251+ event = self .get_event ()
252+ context = {}
253+
254+ response = handler (event , context )
255+ print (f"final response: { response } " )
256+
257+ # self.assertEqual(response["statusCode"], 207)
258+ # self.assertIn("Partial success", response["body"])
259+
260+ # Check logging and Firehose were called
261+ # mock_logger_info.assert_called()
262+ # mock_firehose_send_log.assert_called()
0 commit comments