Skip to content

Commit c4c1649

Browse files
authored
VED-842: Exception Handlers (#1094)
1 parent fb3703e commit c4c1649

3 files changed

Lines changed: 62 additions & 16 deletions

File tree

lambdas/delta_backend/src/delta.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -232,7 +232,6 @@ def handler(event, _context):
232232
"diagnostics": "Delta Lambda failure: Incorrect invocation of Lambda",
233233
}
234234
logger.exception(operation_outcome["diagnostics"])
235-
send_message(event) # Send failed records to DLQ
236235
log_data = {"function_name": "delta_sync", "operation_outcome": operation_outcome}
237236
send_log_to_firehose(STREAM_NAME, log_data)
238237

lambdas/delta_backend/tests/test_delta.py

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
import json
33
import os
44
import unittest
5-
from unittest.mock import MagicMock, patch
5+
from unittest.mock import MagicMock, call, patch
66

77
from botocore.exceptions import ClientError
88

@@ -114,6 +114,25 @@ def test_handler_success_insert(self):
114114
self.assertEqual(put_item_data["SupplierSystem"], supplier)
115115
self.mock_sqs_client.send_message.assert_not_called()
116116

117+
def test_handler_exception(self):
118+
"""Ensure that sqs_client exceptions do not cause the lambda handler itself to raise an exception"""
119+
120+
# Arrange
121+
self.mock_sqs_client.send_message.side_effect = Exception("SQS error")
122+
event = {"invalid_format": True}
123+
124+
# Act
125+
result = handler(event, None)
126+
127+
# Assert
128+
self.assertFalse(result)
129+
self.mock_logger_exception.assert_has_calls(
130+
[
131+
call("Delta Lambda failure: Incorrect invocation of Lambda"),
132+
call("Error sending record to DLQ"),
133+
]
134+
)
135+
117136
def test_handler_overall_failure(self):
118137
# Arrange
119138
event = {"invalid_format": True}

lambdas/recordforwarder/tests/test_forwarding_batch_lambda.py

Lines changed: 42 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -863,20 +863,48 @@ def test_forward_request_to_dynamo(
863863
expected_values = test_case[0]["expected_values"]
864864
assert expected_values.items() <= call_data.items()
865865

866-
def clear_test_tables(self):
867-
"""Clear DynamoDB table after each test."""
868-
scan = self.table.scan()
869-
items = scan.get("Items", [])
870-
while items:
871-
for item in items:
872-
self.table.delete_item(Key={"PK": item["PK"]})
873-
scan = self.table.scan()
874-
items = scan.get("Items", [])
875-
876-
def teardown(self):
877-
"""Deletes mock dynamodb resource"""
878-
self.table.delete()
879-
self.dynamodb_resource = None
866+
@patch("forwarding_batch_lambda.sqs_client.send_message")
867+
def test_forward_lambda_handler_exception_handler(self, mock_send_message):
868+
"""Test exception handling when sqs_client fails"""
869+
# Arrange
870+
# Ensure there is at least one failure, so that sqs_client is called
871+
test_cases = [
872+
{
873+
"name": "Row 1: Duplication Error: Create failure ",
874+
"input": self.generate_input(row_id=1, operation_requested="CREATE", include_fhir_json=True),
875+
"expected_keys": ForwarderValues.EXPECTED_KEYS_DIAGNOSTICS,
876+
"expected_values": {
877+
"row_id": "row-1",
878+
"diagnostics": create_diagnostics_dictionary(
879+
IdentifierDuplicationError("https://www.ravs.england.nhs.uk/#RSV_002")
880+
),
881+
},
882+
"is_failure": True,
883+
},
884+
]
885+
886+
self.table.put_item(
887+
Item={
888+
"PK": "Immunization#4d2ac1eb-080f-4e54-9598-f2d53334681c",
889+
"PatientPK": "Patient#9732928395",
890+
"PatientSK": "RSV#4d2ac1eb-080f-4e54-9598-f2d53334681c",
891+
"IdentifierPK": "https://www.ravs.england.nhs.uk/#RSV_002",
892+
"Version": 1,
893+
}
894+
)
895+
896+
mock_send_message.side_effect = Exception("Unknown Exception in SQS client")
897+
898+
event = self.generate_event(test_cases)
899+
900+
self.mock_redis.hget.return_value = "RSV"
901+
self.mock_redis_getter.return_value = self.mock_redis
902+
903+
# Act & Assert
904+
with self.assertRaises(Exception) as context:
905+
forward_lambda_handler(event, {})
906+
907+
self.assertEqual("Unknown Exception in SQS client", str(context.exception))
880908

881909

882910
if __name__ == "__main__":

0 commit comments

Comments
 (0)