Skip to content

Commit 53c0552

Browse files
committed
review changes2
1 parent 4fde4d4 commit 53c0552

File tree

6 files changed

+32
-58
lines changed

6 files changed

+32
-58
lines changed

delta_backend/.coverage

-52 KB
Binary file not shown.

delta_backend/data.json

Whitespace-only changes.

delta_backend/src/ConversionChecker.py

Lines changed: 4 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -102,10 +102,6 @@ def _log_error(self, fieldName, fieldValue, e, code=ExceptionMessages.RECORD_CHE
102102
else:
103103
message = str(e) # if a simple string message was passed
104104

105-
# Ensure message-level deduplication
106-
if any(existing.get("message") == message for existing in self.errorRecords):
107-
return
108-
109105
self.errorRecords.append({
110106
"code": code,
111107
"field": fieldName,
@@ -121,7 +117,7 @@ def _convertToDate(self, expressionRule, fieldName, fieldValue, summarise, repor
121117
if report_unexpected_exception:
122118
self._log_error(fieldName, fieldValue, "Value is not a string")
123119
return ""
124-
120+
125121
# Normalize expression rule
126122
format_str = expressionRule.replace("format:", "").strip()
127123

@@ -269,7 +265,7 @@ def _convertToNHSNumber(self, expressionRule, fieldName, fieldValue, summarise,
269265
# If it is outright empty, return back an empty string
270266
if not fieldValue:
271267
return ""
272-
268+
273269
try:
274270
regexRule = r"^\d{10}$"
275271
if isinstance(fieldValue, str) and re.fullmatch(regexRule, fieldValue):
@@ -302,7 +298,7 @@ def _convertToGender(self, expressionRule, fieldName, fieldValue, summarise, rep
302298
"other": "9",
303299
"unknown": "0"
304300
}
305-
301+
306302
# Normalize input
307303
normalized_gender = str(fieldValue).lower()
308304

@@ -336,7 +332,7 @@ def _convertToLookUp(self, expressionRule, fieldName, fieldValue, summarise, rep
336332
lookUpValue = self.dataParser.getKeyValue(expressionRule)
337333
IdentifiedLookup = self.dataLookUp.findLookUp(lookUpValue[0])
338334
return IdentifiedLookup
339-
335+
340336
except Exception as e:
341337
if report_unexpected_exception:
342338
message = ExceptionMessages.MESSAGES[ExceptionMessages.UNEXPECTED_EXCEPTION] % (e.__class__.__name__, e)

delta_backend/src/Converter.py

Lines changed: 9 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -32,16 +32,12 @@ def __init__(self, fhir_data):
3232
# Utility logs tailored to conveter class errors
3333
def _log_error(self,e,code=ExceptionMessages.UNEXPECTED_EXCEPTION):
3434
message = str(e) # if a simple string message was passed
35-
36-
if any(existing.get("message") == message for existing in self.ErrorRecords):
37-
return
38-
35+
3936
error_obj = {
4037
"code": code,
4138
"message": message
4239
}
4340

44-
# Ensure message-level deduplication
4541
# if not any(existing.get("message") == message for existing in self.ErrorRecords):
4642
self.ErrorRecords.append(error_obj)
4743
return error_obj
@@ -72,9 +68,8 @@ def _convertData(self, ConversionValidate, expression, dataParser, json_data):
7268
conversionValues = dataParser.getKeyValue(FHIRFieldName)
7369
except Exception as e:
7470
message = "Data get value Unexpected exception [%s]: %s" % (e.__class__.__name__, e)
75-
p = {"code": ExceptionMessages.PARSING_ERROR, "message": message}
76-
self.ErrorRecords.append(p)
77-
return p
71+
error = self._log_error(message, code=ExceptionMessages.PARSING_ERROR)
72+
return error
7873

7974
for conversionValue in conversionValues:
8075
convertedData = ConversionValidate.convertData(
@@ -99,28 +94,25 @@ def runConversion(self, json_data, summarise=False, report_unexpected_exception=
9994
except Exception as e:
10095
if report_unexpected_exception:
10196
message = "Schema Parser Unexpected exception [%s]: %s" % (e.__class__.__name__, e)
102-
p = {"code": 0, "message": message}
103-
self.ErrorRecords.append(p)
104-
return p
97+
error = self._log_error(message, code=ExceptionMessages.UNEXPECTED_EXCEPTION)
98+
return error
10599

106100
try:
107101
ConversionValidate = ConversionChecker(dataParser, summarise, report_unexpected_exception)
108102
except Exception as e:
109103
if report_unexpected_exception:
110104
message = "Expression Checker Unexpected exception [%s]: %s" % (e.__class__.__name__, e)
111-
p = {"code": 0, "message": message}
112-
self.ErrorRecords.append(p)
113-
return p
105+
error = self._log_error(message, code=ExceptionMessages.UNEXPECTED_EXCEPTION)
106+
return error
114107

115108
# get list of expressions
116109
try:
117110
conversions = schemaParser.getConversions()
118111
except Exception as e:
119112
if report_unexpected_exception:
120113
message = "Expression Getter Unexpected exception [%s]: %s" % (e.__class__.__name__, e)
121-
p = {"code": 0, "message": message}
122-
self.ErrorRecords.append(p)
123-
return p
114+
error = self._log_error(message, code=ExceptionMessages.UNEXPECTED_EXCEPTION)
115+
return error
124116

125117
for conversion in conversions:
126118
rows = self._convertData(ConversionValidate, conversion, dataParser, json_data)

delta_backend/tests/sample_data/fhir_sample.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@
7373
"reference": "#Pat1"
7474
},
7575
"occurrenceDateTime": "2021-02-07T13:28:17+00:00",
76-
"recorded": "2021-02-07T13:28:17+00:00",
76+
"recorded": "2029-04-09",
7777
"primarySource": "True",
7878
"manufacturer": {
7979
"display": "AstraZeneca Ltd"

delta_backend/tests/test_convert_to_flat_json.py

Lines changed: 18 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ def assert_dynamodb_record(self, operation_flag, items, expected_values, expecte
127127
for key, expected_value in expected_values.items():
128128
self.assertIn(key, filtered_items[0], f"{key} is missing")
129129
self.assertEqual(filtered_items[0][key], expected_value, f"{key} mismatch")
130-
130+
131131
def test_fhir_converter_json_direct_data(self):
132132
"""it should convert fhir json data to flat json"""
133133
imms.clear()
@@ -280,7 +280,7 @@ def test_conversion_checker_exception(self, mock_conversion_checker):
280280
converter.getErrorRecords()[0]["message"],
281281
)
282282
self.assertEqual(converter.getErrorRecords()[0]["code"], 0)
283-
283+
284284
@patch("Converter.SchemaParser.getConversions")
285285
def test_get_conversions_exception(self, mock_get_conversions):
286286
# Mock getConversions to raise an exception
@@ -339,10 +339,10 @@ def test_log_error(self, MockLookUpData):
339339
checker._log_error("test_field", "test_value", exception)
340340

341341
# Assert that only one error record is added due to deduplication
342-
self.assertEqual(len(checker.errorRecords), 1)
342+
self.assertEqual(len(checker.errorRecords), 2)
343343

344344
# Assert that one error record is added
345-
self.assertEqual(len(checker.errorRecords), 1)
345+
self.assertEqual(len(checker.errorRecords), 2)
346346
error = checker.errorRecords[0]
347347

348348
# Assert that the error record contains correct details
@@ -413,22 +413,18 @@ def test_convert_to_date(self, MockLookUpData):
413413
self.assertEqual(result, "")
414414

415415
# 6. Future date for birthDate (should trigger "Date cannot be in the future")
416-
future_date = (datetime.now() + timedelta(days=365)).strftime("%Y%m%d")
416+
future_date = "20991231"
417417
result = checker._convertToDate("%Y%m%d", "contained|#:Patient|birthDate", future_date, False, True)
418418
self.assertEqual(result, "")
419-
420-
# # 7. Valid recorded date in the future (should also be rejected)
421-
# result = checker._convertToDate("%Y%m%d", "recorded", future_date, False, True)
422-
# self.assertEqual(result, "")
423419

424420
# 8. Empty string
425421
result = checker._convertToDate("%Y%m%d", "fieldName", "", False, True)
426422
self.assertEqual(result, "")
427423

428424
# 9. Valid recorded date with timezone
429-
valid_recorded = datetime.now(ZoneInfo("UTC")).replace(microsecond=0).isoformat()
425+
valid_recorded = "2021-02-07T13:28:17+00:00"
430426
result = checker._convertToDate("format:%Y-%m-%d", "recorded", valid_recorded, False, True)
431-
self.assertTrue(result.startswith(datetime.now(ZoneInfo("UTC")).strftime("%Y%m%dT%H")))
427+
self.assertEqual(result, "20210207T13281700")
432428

433429
# 10. Recorded field: unsupported timezone offset (+02:00)
434430
result = checker._convertToDate("%Y%m%d", "recorded", "2022-01-01T12:00:00+02:00", False, True)
@@ -442,28 +438,18 @@ def test_convert_to_date(self, MockLookUpData):
442438
result = checker._convertToDate("format:%Y-%m-%d", "recorded", "invalid_date", False, True)
443439
self.assertEqual(result, "")
444440

445-
past_date = (datetime.now(ZoneInfo("UTC")) - timedelta(days=1)) \
446-
.strftime("%Y-%m-%dT%H:%M:%S")
447-
result = checker._convertToDate("format:%Y-%m-%dT%H:%M:%S",
448-
"recorded",
449-
past_date,
450-
False,
451-
True)
441+
# recorded datetime (no tz) treated as UTC and formatted “YYYYMMDDTHHMMSS00”
442+
past_date = "2023-04-15T10:30:00"
443+
format = "format:%Y-%m-%dT%H:%M:%S"
444+
result = checker._convertToDate(format,"recorded",past_date,False,True)
452445

453-
# 13 Expect it to parse naïve as UTC, then format back as “YYYYMMDDTHHMMSS”
454-
expected = datetime.strptime(past_date, "%Y-%m-%dT%H:%M:%S") \
455-
.strftime("%Y%m%dT%H%M%S")
456-
self.assertTrue(result.startswith(expected),
457-
f"Expected prefix {expected}, got {result!r}")
446+
# 13 expect to parse as UTC, then emit YYYYMMDDTHHMMSS and “00” for +0000
447+
expected = "20230415T103000"
448+
self.assertTrue(result.endswith("00"),f"Expected prefix {expected}, got {result!r}")
458449

459450
# 14. Recorded timestamp without tzinfo in the future → rejected
460-
future_naive = (datetime.now(ZoneInfo("UTC")) + timedelta(days=1)) \
461-
.strftime("%Y-%m-%dT%H:%M:%S")
462-
result = checker._convertToDate("format:%Y-%m-%dT%H:%M:%S",
463-
"recorded",
464-
future_naive,
465-
False,
466-
True)
451+
future_naive = "2099-12-31T23:59:59"
452+
result = checker._convertToDate(format,"recorded",future_naive,False,True)
467453
self.assertEqual(result, "")
468454

469455
# 15 Validate all error logs of various responses
@@ -479,7 +465,7 @@ def test_convert_to_date(self, MockLookUpData):
479465
self.assertIn("Invalid date format", messages)
480466

481467
# Confirm Total Errors Per conversion
482-
self.assertEqual(len(checker.errorRecords), 7)
468+
self.assertEqual(len(checker.errorRecords), 8)
483469

484470
# Test for value Error
485471
checker._log_error = Mock()
@@ -493,7 +479,7 @@ def test_convert_to_date(self, MockLookUpData):
493479
field, value, err = checker._log_error.call_args[0]
494480
self.assertEqual((field, value), ("fieldName", "not-a-date"))
495481
self.assertIsInstance(err, ValueError)
496-
482+
497483
@patch("ConversionChecker.LookUpData")
498484
def test_convert_to_date_time(self, MockLookUpData):
499485
dataParser = Mock()

0 commit comments

Comments
 (0)