Skip to content

Commit de1c5fa

Browse files
committed
log partial detail where available
1 parent 1e2ba23 commit de1c5fa

File tree

2 files changed

+94
-25
lines changed

2 files changed

+94
-25
lines changed

backend/src/log_structure.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,19 @@ def _log_data_from_body(event) -> dict:
2020
if event.get("body"):
2121
try:
2222
imms = json.loads(event["body"])
23+
except json.decoder.JSONDecodeError:
24+
# it can't be parsed
25+
return log_data
26+
try:
2327
vaccine_type = get_vaccine_type(imms)
2428
log_data["vaccine_type"] = vaccine_type
29+
except Exception:
30+
pass
31+
try:
2532
local_id = imms["identifier"][0]["value"] + "^" + imms["identifier"][0]["system"]
2633
log_data["local_id"] = local_id
2734
except Exception:
28-
# if there's no body, or it can't be parsed
29-
return {}
35+
pass
3036
return log_data
3137

3238

backend/tests/test_log_structure_wrapper.py

Lines changed: 86 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ def test_exception_handling(self, mock_logger, mock_firehose_logger):
9999
self.assertEqual(logged_info['local_id'], '12345^http://test')
100100
self.assertEqual(logged_info['vaccine_type'], 'FLU')
101101

102-
def test_invalid_body(self, mock_logger, mock_firehose_logger):
102+
def test_body_missing(self, mock_logger, mock_firehose_logger):
103103
# Arrange
104104
wrapped_function = function_info(self.mock_success_function)
105105
event = {
@@ -109,8 +109,7 @@ def test_invalid_body(self, mock_logger, mock_firehose_logger):
109109
'SupplierSystem': 'test_supplier'
110110
},
111111
'path': '/test',
112-
'requestContext': {'resourcePath': '/test'},
113-
'body': "{\"identifier\": [{\"system\": \"http://test\", \"value\": \"12345\"}], \"protocolApplied\": []}"
112+
'requestContext': {'resourcePath': '/test'}
114113
}
115114

116115
# Act
@@ -128,31 +127,95 @@ def test_invalid_body(self, mock_logger, mock_firehose_logger):
128127
self.assertNotIn('local_id', logged_info)
129128
self.assertNotIn('vaccine_type', logged_info)
130129

131-
def test_nonexistent_body(self, mock_logger, mock_firehose_logger):
132-
# Arrange
133-
wrapped_function = function_info(self.mock_success_function)
134-
event = {
135-
'headers': {
136-
'X-Correlation-ID': 'test_correlation',
137-
'X-Request-ID': 'test_request',
138-
'SupplierSystem': 'test_supplier'
130+
def test_body_not_json(self, mock_logger, mock_firehose_logger):
131+
# Act
132+
decorated_function_raises = function_info(self.mock_function_raises)
133+
134+
with self.assertRaises(ValueError):
135+
#Assert
136+
event = {'headers': {
137+
'X-Correlation-ID': 'failed_test_correlation',
138+
'X-Request-ID': 'failed_test_request',
139+
'SupplierSystem': 'failed_test_supplier'
139140
},
140-
'path': '/test',
141-
'requestContext': {'resourcePath': '/test'}
142-
}
141+
'path': '/failed_test', 'requestContext': {'resourcePath': '/failed_test'},
142+
'body': "invalid"}
143143

144-
# Act
145-
result = wrapped_function(event, {})
144+
context = {}
145+
decorated_function_raises(event, context)
146146

147-
# Assert
148-
args, kwargs = mock_logger.info.call_args
147+
#Assert
148+
args, kwargs = mock_logger.exception.call_args
149149
logged_info = json.loads(args[0])
150150

151-
self.assertEqual(logged_info['X-Correlation-ID'], 'test_correlation')
152-
self.assertEqual(logged_info['X-Request-ID'], 'test_request')
153-
self.assertEqual(logged_info['supplier'], 'test_supplier')
154-
self.assertEqual(logged_info['actual_path'], '/test')
155-
self.assertEqual(logged_info['resource_path'], '/test')
151+
self.assertEqual(logged_info['X-Correlation-ID'], 'failed_test_correlation')
152+
self.assertEqual(logged_info['X-Request-ID'], 'failed_test_request')
153+
self.assertEqual(logged_info['supplier'], 'failed_test_supplier')
154+
self.assertEqual(logged_info['actual_path'], '/failed_test')
155+
self.assertEqual(logged_info['resource_path'], '/failed_test')
156156
self.assertNotIn('local_id', logged_info)
157157
self.assertNotIn('vaccine_type', logged_info)
158158

159+
def test_body_invalid_identifier(self, mock_logger, mock_firehose_logger):
160+
# Arrange
161+
self.mock_redis_client.hget.return_value = "FLU"
162+
163+
# Act
164+
decorated_function_raises = function_info(self.mock_function_raises)
165+
166+
with self.assertRaises(ValueError):
167+
#Assert
168+
event = {'headers': {
169+
'X-Correlation-ID': 'failed_test_correlation',
170+
'X-Request-ID': 'failed_test_request',
171+
'SupplierSystem': 'failed_test_supplier'
172+
},
173+
'path': '/failed_test', 'requestContext': {'resourcePath': '/failed_test'},
174+
'body': "{\"identifier\": [], \"protocolApplied\": [{\"targetDisease\": [{\"coding\": [{\"system\": \"http://snomed.info/sct\", \"code\": \"840539006\", \"display\": \"Disease caused by severe acute respiratory syndrome coronavirus 2\"}]}]}]}"}
175+
176+
context = {}
177+
decorated_function_raises(event, context)
178+
179+
#Assert
180+
args, kwargs = mock_logger.exception.call_args
181+
logged_info = json.loads(args[0])
182+
183+
self.assertEqual(logged_info['X-Correlation-ID'], 'failed_test_correlation')
184+
self.assertEqual(logged_info['X-Request-ID'], 'failed_test_request')
185+
self.assertEqual(logged_info['supplier'], 'failed_test_supplier')
186+
self.assertEqual(logged_info['actual_path'], '/failed_test')
187+
self.assertEqual(logged_info['resource_path'], '/failed_test')
188+
self.assertNotIn('local_id', logged_info)
189+
self.assertEqual(logged_info['vaccine_type'], 'FLU')
190+
191+
def test_body_invalid_protocol_applied(self, mock_logger, mock_firehose_logger):
192+
# Arrange
193+
self.mock_redis_client.hget.return_value = "FLU"
194+
195+
# Act
196+
decorated_function_raises = function_info(self.mock_function_raises)
197+
198+
with self.assertRaises(ValueError):
199+
#Assert
200+
event = {'headers': {
201+
'X-Correlation-ID': 'failed_test_correlation',
202+
'X-Request-ID': 'failed_test_request',
203+
'SupplierSystem': 'failed_test_supplier'
204+
},
205+
'path': '/failed_test', 'requestContext': {'resourcePath': '/failed_test'},
206+
'body': "{\"identifier\": [{\"system\": \"http://test\", \"value\": \"12345\"}], \"protocolApplied\": []}"}
207+
208+
context = {}
209+
decorated_function_raises(event, context)
210+
211+
#Assert
212+
args, kwargs = mock_logger.exception.call_args
213+
logged_info = json.loads(args[0])
214+
215+
self.assertEqual(logged_info['X-Correlation-ID'], 'failed_test_correlation')
216+
self.assertEqual(logged_info['X-Request-ID'], 'failed_test_request')
217+
self.assertEqual(logged_info['supplier'], 'failed_test_supplier')
218+
self.assertEqual(logged_info['actual_path'], '/failed_test')
219+
self.assertEqual(logged_info['resource_path'], '/failed_test')
220+
self.assertEqual(logged_info['local_id'], '12345^http://test')
221+
self.assertNotIn('vaccine_type', logged_info)

0 commit comments

Comments
 (0)