def test_set_date_specific_lsir_fields_date_in_future(self) -> None: # Should use the current classification assessment_future = StateAssessment( assessment_score="33", assessment_date=date.strftime( date.today() + relativedelta(days=100), "%m%d%Y"), ) updated_assessment_future = ( us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment_future)) assessment_today = StateAssessment(assessment_score="33", assessment_date=date.strftime( date.today(), "%m%d%Y")) updated_assessment_today = ( us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment_today)) self.assertEqual( updated_assessment_future.assessment_level, updated_assessment_today.assessment_level, ) self.assertEqual( updated_assessment_future.assessment_score, updated_assessment_today.assessment_score, )
def set_date_specific_lsir_fields( assessment: StateAssessment) -> StateAssessment: """Over time, US_PA has updated the mapping between an LSIR score and the associated assessment level. This function sets the appropriate assessment_level and assessment_score according to the score and the date of the |assessment|, as defined by _DATE_SPECIFIC_ORDERED_LSIR_LEVELS. Returns the updated StateAssessment object. """ if not assessment.assessment_score: return assessment assessment_score = parse_int(assessment.assessment_score) if assessment_score == 60: # This value indicates the scoring was not completed assessment.assessment_score = None assessment.assessment_level = "UNKNOWN (60-ATTEMPTED_INCOMPLETE)" elif assessment_score == 70: # This person either refused to be assessed or did not need to be assessed because they chose not to be released # onto parole assessment.assessment_score = None assessment.assessment_level = "UNKNOWN (70-REFUSED)" elif assessment_score > 55: # Assessment score number is over the max value of 54, and isn't one of the expected special-case # codes (60, 70, 55) assessment.assessment_level = f"UNKNOWN ({assessment_score}-SCORE_OUT_OF_RANGE)" assessment.assessment_score = None else: if assessment_score == 55: # This should be treated as a 54 assessment_score = 54 assessment.assessment_score = "54" assessment_date_raw = assessment.assessment_date assessment_date = (str_field_utils.parse_date(assessment_date_raw) if assessment_date_raw else None) if not assessment_date: # At this point we need a valid assessment_date to determine the date-specific LSIR level assessment.assessment_level = "UNKNOWN (NO_DATE)" return assessment for cutoff_date, score_level_map in _DATE_SPECIFIC_ORDERED_LSIR_LEVELS.items( ): if assessment_date <= cutoff_date: for cutoff_score, level in score_level_map.items(): if assessment_score <= cutoff_score: assessment.assessment_level = level.value return assessment raise ValueError( f"Unhandled assessment_score {assessment_score} with assessment_date {assessment_date}" ) return assessment
def test_set_date_specific_lsir_fields_non_int_score(self): assessment = StateAssessment( assessment_score='X9K', # This should throw assessment_date='12042014') with pytest.raises(ValueError): _ = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment)
def test_set_date_specific_lsir_fields_no_score(self) -> None: assessment = StateAssessment(assessment_score=None, assessment_date="12042014") updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertIsNone(updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields(self) -> None: assessment = StateAssessment(assessment_score="33", assessment_date="03012018") updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual("33", updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_no_date(self): assessment = StateAssessment(assessment_score='31', assessment_date=None) updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual('UNKNOWN (NO_DATE)', updated_assessment.assessment_level) self.assertEqual('31', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields(self): assessment = StateAssessment(assessment_score='33', assessment_date='03012018') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual('33', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_timestamp(self): assessment = StateAssessment(assessment_score='33', assessment_date='12/19/2016 15:21:56') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual('33', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_no_date(self) -> None: assessment = StateAssessment(assessment_score="31", assessment_date=None) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual("UNKNOWN (NO_DATE)", updated_assessment.assessment_level) self.assertEqual("31", updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_pre_2014_12_3(self): assessment = StateAssessment( assessment_score='18', # This was considered MEDIUM until 2014-12-3 assessment_date='03012010') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.MEDIUM.value, updated_assessment.assessment_level) self.assertEqual('18', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_54(self): assessment = StateAssessment( assessment_score='54', # This is the maximum score assessment_date='12032014') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual('54', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_55_as_54(self): assessment = StateAssessment( assessment_score='55', # This should be treated (and cast) as a 54 assessment_date='12032014') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual('54', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_55_as_54(self) -> None: assessment = StateAssessment( assessment_score="55", # This should be treated (and cast) as a 54 assessment_date="12032014", ) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual("54", updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_54(self) -> None: assessment = StateAssessment( assessment_score="54", # This is the maximum score assessment_date="12032014", ) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual("54", updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_undetermined_60(self): assessment = StateAssessment( assessment_score= '60', # This score should be cleared, with the level set as ATTEMPTED_INCOMPLETE assessment_date='12032014') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual('UNKNOWN (60-ATTEMPTED_INCOMPLETE)', updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_date_in_future(self): # Should use the current classification assessment_future = StateAssessment( assessment_score='33', assessment_date=date.strftime( date.today() + relativedelta(days=100), '%m%d%Y')) updated_assessment_future = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment_future) assessment_today = StateAssessment(assessment_score='33', assessment_date=date.strftime( date.today(), '%m%d%Y')) updated_assessment_today = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment_today) self.assertEqual(updated_assessment_future.assessment_level, updated_assessment_today.assessment_level) self.assertEqual(updated_assessment_future.assessment_score, updated_assessment_today.assessment_score)
def test_set_date_specific_lsir_fields_undetermined_general(self): assessment = StateAssessment( assessment_score= '351', # Scores above 54 indicate typos in the data entry assessment_date='03012010') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual('UNKNOWN (351-SCORE_OUT_OF_RANGE)', updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_non_applicable(self): assessment = StateAssessment( assessment_score= '70', # This score should be cleared, with the level set as REFUSED assessment_date='12032014') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual('UNKNOWN (70-REFUSED)', updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_pre_2009(self): assessment = StateAssessment( assessment_score= '19', # This was considered LOW before 2009, but since then has been MEDIUM or HIGH assessment_date='03012000') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.LOW.value, updated_assessment.assessment_level) self.assertEqual('19', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_post_2014_12_3(self): assessment = StateAssessment( assessment_score= '27', # This was considered HIGH until 2014-12-3, but since then has been MEDIUM assessment_date='12042014') updated_assessment = us_pa_assessment_level_reference.set_date_specific_lsir_fields( assessment) self.assertEqual(StateAssessmentLevel.MEDIUM.value, updated_assessment.assessment_level) self.assertEqual('27', updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_on_2014_12_3(self) -> None: assessment = StateAssessment( assessment_score= "27", # This was considered HIGH until 2014-12-3, but since then has been MEDIUM assessment_date="12032014", ) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual(StateAssessmentLevel.HIGH.value, updated_assessment.assessment_level) self.assertEqual("27", updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_undetermined_60_no_date( self) -> None: assessment = StateAssessment( assessment_score= "60", # This score should be cleared,with the level set as ATTEMPTED_INCOMPLETE assessment_date=None, # Date does not matter for this score ) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual("UNKNOWN (60-ATTEMPTED_INCOMPLETE)", updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_undetermined_general_no_date( self) -> None: assessment = StateAssessment( assessment_score= "351", # Scores above 54 indicate typos in the data entry assessment_date=None, # Date does not matter for this score ) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual("UNKNOWN (351-SCORE_OUT_OF_RANGE)", updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_set_date_specific_lsir_fields_non_applicable_no_date( self) -> None: assessment = StateAssessment( assessment_score= "70", # This score should be cleared, with the level set as REFUSED assessment_date=None, # Date does not matter for this score ) updated_assessment = (us_pa_assessment_level_reference. set_date_specific_lsir_fields(assessment)) self.assertEqual("UNKNOWN (70-REFUSED)", updated_assessment.assessment_level) self.assertIsNone(updated_assessment.assessment_score)
def test_populate_data_dbo_LSIR(self): expected = IngestInfo( state_people=[ StatePerson(state_person_id='789C', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='789C', id_type=US_PA_PBPP), ], state_assessments=[ StateAssessment(state_assessment_id='789C-0-1', assessment_type='LSIR', assessment_class='RISK', assessment_date='01312001', assessment_score='14'), ]), StatePerson(state_person_id='456B', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='456B', id_type=US_PA_PBPP), ], state_assessments=[ StateAssessment(state_assessment_id='456B-1-1', assessment_type='LSIR', assessment_class='RISK', assessment_date='12222005', assessment_score='23'), ]), StatePerson(state_person_id='345E', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='345E', id_type=US_PA_PBPP), ], state_assessments=[ StateAssessment(state_assessment_id='345E-3-1', assessment_type='LSIR', assessment_class='RISK', assessment_date='01192006', assessment_score='30'), StateAssessment(state_assessment_id='345E-3-2', assessment_type='LSIR', assessment_class='RISK', assessment_date='08032006', assessment_score='30'), StateAssessment(state_assessment_id='345E-3-3', assessment_type='LSIR', assessment_class='RISK', assessment_date='01152007', assessment_score='31'), StateAssessment(state_assessment_id='345E-4-1', assessment_type='LSIR', assessment_class='RISK', assessment_date='07142007', assessment_score='33'), ]), ]) self.run_parse_file_test(expected, 'dbo_LSIR')
def test_populate_data_dbo_tblInmTestScore(self): expected = IngestInfo( state_people=[ StatePerson(state_person_id='123456', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='123456', id_type=US_PA_CONTROL), ], state_assessments=[ StateAssessment(state_assessment_id='123456-1-1', assessment_type='CSS-M ', assessment_class='SOCIAL', assessment_date='6/22/2008 13:20:54', assessment_score='19'), StateAssessment(state_assessment_id='123456-2-1', assessment_type='HIQ ', assessment_class='SOCIAL', assessment_date='7/12/2004 8:23:28', assessment_score='62'), StateAssessment(state_assessment_id='123456-3-3', assessment_type='LSI-R ', assessment_class='RISK', assessment_date='10/3/2010 12:11:41', assessment_score='25'), ]), StatePerson(state_person_id='654321', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='654321', id_type=US_PA_CONTROL), ], state_assessments=[ StateAssessment(state_assessment_id='654321-1-1', assessment_type='CSS-M ', assessment_class='SOCIAL', assessment_date='4/1/2003 11:42:17', assessment_score='22'), StateAssessment(state_assessment_id='654321-3-1', assessment_type='LSI-R ', assessment_class='RISK', assessment_date='6/8/2004 11:07:48', assessment_score='19'), StateAssessment(state_assessment_id='654321-4-1', assessment_type='TCU ', assessment_class='SUBSTANCE_ABUSE', assessment_date='1/4/2004 11:09:52', assessment_score='6'), StateAssessment(state_assessment_id='654321-5-1', assessment_type='ST99 ', assessment_class='SEX_OFFENSE', assessment_date='7/5/2004 15:30:59', assessment_score='4'), ]), StatePerson(state_person_id='445566', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='445566', id_type=US_PA_CONTROL), ], state_assessments=[ StateAssessment(state_assessment_id='445566-2-1', assessment_type='HIQ ', assessment_class='SOCIAL', assessment_date='7/28/2005 10:33:31', assessment_score='61'), StateAssessment(state_assessment_id='445566-3-2', assessment_type='LSI-R ', assessment_class='RISK', assessment_date='12/19/2016 15:21:56', assessment_score='13'), ]), StatePerson(state_person_id='778899', state_person_external_ids=[ StatePersonExternalId(state_person_external_id_id='778899', id_type=US_PA_CONTROL), ], state_assessments=[ StateAssessment(state_assessment_id='778899-3-3', assessment_type='LSI-R ', assessment_class='RISK', assessment_date='1/6/2017 18:16:56', assessment_score='14'), StateAssessment(state_assessment_id='778899-6-1', assessment_type='RST ', assessment_class='RISK', assessment_date='12/8/2012 15:09:08', assessment_score='9', assessment_metadata=json.dumps({"latest_version": False})), StateAssessment(state_assessment_id='778899-6-2', assessment_type='RST ', assessment_class='RISK', assessment_date='5/11/2018 15:54:06', assessment_score='7', assessment_metadata=json.dumps({"latest_version": True})), ]), ]) self.run_parse_file_test(expected, 'dbo_tblInmTestScore')