@@ -315,7 +315,7 @@ def test_conversion_exceptions(self, mock_get_key_value, mock_get_conversions):
315315 def test_log_error (self , MockLookUpData ):
316316 # Instantiate ConversionChecker
317317 checker = ConversionChecker (dataParser = None , summarise = False , report_unexpected_exception = True )
318-
318+
319319 # Simulate an exception
320320 exception = ValueError ("Invalid value" )
321321
@@ -349,6 +349,38 @@ def test_convert_to_not_empty(self, MockLookUpData):
349349 result = checker ._convertToNotEmpty (None , "fieldName" , "" , False , True )
350350 self .assertEqual (result , "" )
351351
352+ # Test for value that is not a string
353+ checker ._log_error = Mock ()
354+ result = checker ._convertToNotEmpty (None , "fieldName" , 12345 , False , True )
355+ self .assertEqual (result , "" )
356+
357+ checker ._log_error .assert_called_once ()
358+
359+ field , value , err = checker ._log_error .call_args [0 ]
360+ self .assertEqual ((field , value ), ("fieldName" ,12345 ))
361+ self .assertIsInstance (err , str )
362+ self .assertIn ("Value not a String" , err )
363+
364+ checker ._log_error .reset_mock ()
365+
366+ # Simulate a fieldValue whose .strip() crashes to test exception handling
367+ checker ._log_error = Mock ()
368+
369+ class BadString (str ):
370+ def strip (self ):
371+ raise RuntimeError ("Simulated crash during strip" )
372+
373+ bad_value = BadString ("some bad string" )
374+
375+ # Make the .strip() method crash
376+ result = checker ._convertToNotEmpty (None , "fieldName" , bad_value , False , True )
377+ self .assertEqual (result , "" ) # Should return empty string on exception
378+ checker ._log_error .assert_called_once ()
379+ field , value , message = checker ._log_error .call_args [0 ]
380+ self .assertEqual ((field , value ), ("fieldName" , bad_value ))
381+ self .assertIsInstance (message , str )
382+ self .assertIn ("RuntimeError" , message )
383+
352384 @patch ("ConversionChecker.LookUpData" )
353385 def test_convert_to_nhs_number (self , MockLookUpData ):
354386
@@ -381,9 +413,9 @@ def test_convert_to_date(self, MockLookUpData):
381413 result = checker ._convertToDate ("%Y%m%d" , "fieldName" , "2022-01-01" , False , True )
382414 self .assertEqual (result , "20220101" )
383415
384- # 2. Partial ISO date ( should trigger "Partial date not accepted")
385- result = checker ._convertToDate ("%Y%m%d" , "fieldName" , "2022-01" , False , True )
386- self .assertEqual (result , "" )
416+ # 2.Full ISO date should be transformed to YYYYMMDD
417+ result = checker ._convertToDate ("%Y%m%d" , "fieldName" , "2022-01-01T12:00:00+00:00 " , False , True )
418+ self .assertEqual (result , "20220101 " )
387419
388420 # 3. Invalid string date format (should trigger "Date must be in YYYYMMDD format")
389421 result = checker ._convertToDate ("%Y%m%d" , "fieldName" , "invalid_date" , False , True )
@@ -397,60 +429,18 @@ def test_convert_to_date(self, MockLookUpData):
397429 result = checker ._convertToDate ("%Y%m%d" , "fieldName" , 12345678 , False , True )
398430 self .assertEqual (result , "" )
399431
400- # 6. Future date for birthDate (should trigger "Date cannot be in the future")
401- future_date = "20991231"
402- result = checker ._convertToDate ("%Y%m%d" , "contained|#:Patient|birthDate" , future_date , False , True )
403- self .assertEqual (result , "" )
404-
405- # 8. Empty string
432+ # 6 Empty string
406433 result = checker ._convertToDate ("%Y%m%d" , "fieldName" , "" , False , True )
407434 self .assertEqual (result , "" )
408435
409- # 9. Valid recorded date with timezone
410- valid_recorded = "2021-02-07T13:28:17+00:00"
411- result = checker ._convertToDate ("format:%Y-%m-%d" , "recorded" , valid_recorded , False , True )
412- self .assertEqual (result , "20210207T13281700" )
413-
414- # 10. Recorded field: unsupported timezone offset (+02:00)
415- result = checker ._convertToDate ("%Y%m%d" , "recorded" , "2022-01-01T12:00:00+02:00" , False , True )
416- self .assertEqual (result , "" )
417-
418- # 11. Recorded date with invalid format
419- result = checker ._convertToDate ("format:%Y-%m-%d" , "recorded" , "invalid_date" , False , True )
420- self .assertEqual (result , "" )
421-
422- # 12. Recorded date with invalid format
423- result = checker ._convertToDate ("format:%Y-%m-%d" , "recorded" , "invalid_date" , False , True )
424- self .assertEqual (result , "" )
425-
426- # recorded datetime (no tz) treated as UTC and formatted “YYYYMMDDTHHMMSS00”
427- past_date = "2023-04-15T10:30:00"
428- format = "format:%Y-%m-%dT%H:%M:%S"
429- result = checker ._convertToDate (format ,"recorded" ,past_date ,False ,True )
430-
431- # 13 expect to parse as UTC, then emit YYYYMMDDTHHMMSS and “00” for +0000
432- expected = "20230415T103000"
433- self .assertTrue (result .endswith ("00" ),f"Expected prefix { expected } , got { result !r} " )
434-
435- # 14. Recorded timestamp without tzinfo in the future → rejected
436- future_naive = "2099-12-31T23:59:59"
437- result = checker ._convertToDate (format ,"recorded" ,future_naive ,False ,True )
438- self .assertEqual (result , "" )
439-
440- # 15 Validate all error logs of various responses
436+ # 7 Validate all error logs of various responses
441437 messages = [err ["message" ] for err in checker .errorRecords ]
442438 print (f"Error Test Case, { messages } " )
443439
444- self .assertIn ("Date must be in YYYYMMDD format" , messages )
445440 self .assertIn ("Value is not a string" , messages )
446- self .assertIn ("Partial date not accepted" , messages )
447- self .assertIn ("Date cannot be in the future" , messages )
448- self .assertIn ("Birthdate cannot be in the future" , messages )
449- self .assertTrue (any (m .startswith ("Unsupported offset" ) for m in messages ))
450- self .assertIn ("Invalid date format" , messages )
451441
452442 # Confirm Total Errors Per conversion
453- self .assertEqual (len (checker .errorRecords ), 8 )
443+ self .assertEqual (len (checker .errorRecords ), 2 )
454444
455445 # Test for value Error
456446 checker ._log_error = Mock ()
0 commit comments