Skip to content

Commit 13262ce

Browse files
authored
VED-753 Remove PII from CloudWatch (#807)
* removed PII in CW; nhs_number (only) to Splunk * no need for nhsNumber * unit test * unit test - standalone * improved unit test
1 parent 4fe0836 commit 13262ce

File tree

2 files changed

+39
-2
lines changed

2 files changed

+39
-2
lines changed

backend/src/log_structure.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ def function_info(func):
4242
@wraps(func)
4343
def wrapper(*args, **kwargs):
4444
event = args[0] if args else {}
45-
logger.info(f"Event: {event}")
4645
headers = event.get("headers", {})
4746
correlation_id = headers.get("X-Correlation-ID", "X-Correlation-ID not passed")
4847
request_id = headers.get("X-Request-ID", "X-Request-ID not passed")
@@ -64,7 +63,6 @@ def wrapper(*args, **kwargs):
6463
start = time.time()
6564
try:
6665
result = func(*args, **kwargs)
67-
logger.info(f"Result:{result}")
6866
end = time.time()
6967
log_data["time_taken"] = f"{round(end - start, 5)}s"
7068
log_data.update(_log_data_from_body(event))

backend/tests/test_log_structure_wrapper.py

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,14 @@ def mock_success_function(_event, _context):
2323
def mock_function_raises(_event, _context):
2424
raise ValueError("Test error")
2525

26+
def extract_all_call_args_for_logger(self, mock_logger) -> list:
27+
"""Extracts all arguments for logger.*."""
28+
return (
29+
[ args[0] for args, _ in mock_logger.info.call_args_list ]
30+
+ [ args[0] for args, _ in mock_logger.warning.call_args_list ]
31+
+ [ args[0] for args, _ in mock_logger.error.call_args_list ]
32+
)
33+
2634
def test_successful_execution(self, mock_logger, mock_firehose_logger):
2735
# Arrange
2836
test_correlation = "test_correlation"
@@ -65,6 +73,37 @@ def test_successful_execution(self, mock_logger, mock_firehose_logger):
6573
self.assertEqual(logged_info['local_id'], '12345^http://test')
6674
self.assertEqual(logged_info['vaccine_type'], 'FLU')
6775

76+
def test_successful_execution_pii(self, mock_logger, mock_firehose_logger):
77+
"""Pass personally identifiable information in an event, and ensure that it is not logged anywhere."""
78+
# Arrange
79+
test_correlation = "test_correlation"
80+
test_request = "test_request"
81+
test_supplier = "test_supplier"
82+
test_actual_path = "/test"
83+
test_resource_path = "/test"
84+
85+
self.mock_redis_client.hget.return_value = "FLU"
86+
wrapped_function = function_info(self.mock_success_function)
87+
event = {
88+
'headers': {
89+
'X-Correlation-ID': test_correlation,
90+
'X-Request-ID': test_request,
91+
'SupplierSystem': test_supplier
92+
},
93+
'path': test_actual_path,
94+
'requestContext': {'resourcePath': test_resource_path},
95+
'body': "{\"identifier\": [{\"system\": \"http://test\", \"value\": \"12345\"}], \"contained\": [{\"resourceType\": \"Patient\", \"id\": \"Pat1\", \"identifier\": [{\"system\": \"https://fhir.nhs.uk/Id/nhs-number\", \"value\": \"9693632109\"}]}], \"protocolApplied\": [{\"targetDisease\": [{\"coding\": [{\"system\": \"http://snomed.info/sct\", \"code\": \"840539006\", \"display\": \"Disease caused by severe acute respiratory syndrome coronavirus 2\"}]}]}]}"
96+
}
97+
98+
# Act
99+
result = wrapped_function(event, {})
100+
101+
# Assert
102+
self.assertEqual(result, "Success")
103+
104+
for logger_info in self.extract_all_call_args_for_logger(mock_logger):
105+
self.assertNotIn("9693632109", str(logger_info))
106+
68107
def test_exception_handling(self, mock_logger, mock_firehose_logger):
69108
# Arrange
70109
test_correlation = "failed_test_correlation"

0 commit comments

Comments
 (0)