def test_identifyViolationSubtype_technical_law_citation(self): # Arrange violations = [ StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( condition=_SUBSTANCE_ABUSE_CONDITION_STR), StateSupervisionViolatedConditionEntry.new_with_defaults( condition=_LAW_CITATION_SUBTYPE_STR) ]), StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ]) ] # Act subtype = identify_violation_subtype( StateSupervisionViolationType.TECHNICAL, violations) # Assert self.assertEqual(_LAW_CITATION_SUBTYPE_STR, subtype)
def test_get_violation_type_frequency_counter_us_pa(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code='US_PA', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.ABSCONDED ), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text='L05'), ]), StateSupervisionViolation.new_with_defaults( state_code='US_PA', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType. MISDEMEANOR), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text='H12') ]) ] violation_type_frequency_counter = violation_utils.get_violation_type_frequency_counter( violations) self.assertEqual([['ABSCONDED', 'FELONY', 'LOW_TECH'], ['MISDEMEANOR', 'SUBSTANCE_ABUSE']], violation_type_frequency_counter)
def test_identifyViolationSubtype_technical_drg(self): # Arrange violations = [ StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( condition='DRG') ]), StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ]) ] # Act subtype = identify_violation_subtype( StateSupervisionViolationType.TECHNICAL, violations) # Assert self.assertEqual('SUBSTANCE_ABUSE', subtype)
def test_identify_most_severe_violation_type(self) -> None: violation = StateSupervisionViolation.new_with_defaults( state_code="US_XX", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ), ], ) ( most_severe_violation_type, most_severe_violation_type_subtype, ) = violation_utils.identify_most_severe_violation_type_and_subtype( [violation]) self.assertEqual(most_severe_violation_type, StateSupervisionViolationType.FELONY) self.assertEqual( most_severe_violation_type_subtype, StateSupervisionViolationType.FELONY.value, )
def test_identifyViolationSubtype_nonTechnical(self): # Arrange violations = [ StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( condition='DRG') ]), StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ]) ] # Act subtype = identify_violation_subtype( StateSupervisionViolationType.FELONY, violations) self.assertIsNone(subtype)
def test_get_violation_type_frequency_counter_us_mo(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code="US_MO", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.ABSCONDED, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ), ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_XX", condition="DRG") ], ) ] violation_type_frequency_counter = ( violation_utils.get_violation_type_frequency_counter(violations)) self.assertEqual( [["ABSCONDED", "FELONY", "SUBSTANCE_ABUSE"]], violation_type_frequency_counter, )
def test_get_violation_and_response_history(self): supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_XX", violation_date=datetime.date(2009, 1, 3), supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.ABSCONDED, ), ], ) supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=_DEFAULT_SSVR_ID, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, state_code="US_XX", response_date=datetime.date(2009, 1, 7), supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_XX", decision=StateSupervisionViolationResponseDecision.REVOCATION, revocation_type=StateSupervisionViolationResponseRevocationType.REINCARCERATION, ), StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_XX", decision=StateSupervisionViolationResponseDecision.CONTINUANCE, ), ], supervision_violation=supervision_violation, ) revocation_date = datetime.date(2009, 2, 13) violation_history = violation_utils.get_violation_and_response_history( revocation_date, [supervision_violation_response], UsXxViolationDelegate() ) expected_output = violation_utils.ViolationHistory( most_severe_violation_type=StateSupervisionViolationType.FELONY, most_severe_violation_type_subtype=StateSupervisionViolationType.FELONY.value, most_severe_response_decision=StateSupervisionViolationResponseDecision.REVOCATION, response_count=1, violation_history_description="1felony", violation_type_frequency_counter=[["TECHNICAL", "FELONY", "ABSCONDED"]], ) self.assertEqual(expected_output, violation_history)
def test_get_violation_and_response_history_with_us_pa_subtype_high_technical(self): supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_PA", violation_date=datetime.date(2009, 1, 3), supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_PA", violation_type=StateSupervisionViolationType.ABSCONDED, violation_type_raw_text="H09", ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_PA", violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text="H08", # High Technical ), ], ) supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=_DEFAULT_SSVR_ID, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, state_code="US_PA", response_date=datetime.date(2009, 1, 7), supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_PA", decision=StateSupervisionViolationResponseDecision.REVOCATION, revocation_type=StateSupervisionViolationResponseRevocationType.REINCARCERATION, ), StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_PA", decision=StateSupervisionViolationResponseDecision.CONTINUANCE, revocation_type=StateSupervisionViolationResponseRevocationType.SHOCK_INCARCERATION, ), ], supervision_violation=supervision_violation, ) revocation_date = datetime.date(2009, 2, 13) violation_history = violation_utils.get_violation_and_response_history( revocation_date, [supervision_violation_response], UsPaViolationDelegate() ) expected_output = violation_utils.ViolationHistory( most_severe_violation_type=StateSupervisionViolationType.TECHNICAL, most_severe_violation_type_subtype="HIGH_TECH", most_severe_response_decision=StateSupervisionViolationResponseDecision.REVOCATION, response_count=1, violation_history_description="1high_tech", violation_type_frequency_counter=[["ABSCONDED", "HIGH_TECH"]], ) self.assertEqual(expected_output, violation_history)
def test_get_violation_type_frequency_counter_us_mo_multiple_violations( self, ) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code="US_MO", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.ABSCONDED, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ), ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_XX", condition="WEA" ) ], ), StateSupervisionViolation.new_with_defaults( state_code="US_MO", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.MISDEMEANOR, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, ), ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_XX", condition="DRG" ), StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_XX", condition="EMP" ), ], ), ] violation_type_frequency_counter = ( violation_utils.get_violation_type_frequency_counter( violations, UsMoViolationDelegate() ) ) self.assertEqual( [["ABSCONDED", "FELONY", "WEA"], ["MISDEMEANOR", "SUBSTANCE_ABUSE", "EMP"]], violation_type_frequency_counter, )
def test_get_violation_and_response_history_citation_date(self): supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_XX", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.ABSCONDED, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.MISDEMEANOR, ), ], ) supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( state_code="US_XX", supervision_violation_response_id=_DEFAULT_SSVR_ID, response_type=StateSupervisionViolationResponseType.CITATION, response_date=datetime.date(2009, 1, 7), supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_XX", decision=StateSupervisionViolationResponseDecision.REVOCATION, revocation_type=StateSupervisionViolationResponseRevocationType.REINCARCERATION, ), StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_XX", decision=StateSupervisionViolationResponseDecision.CONTINUANCE, revocation_type=StateSupervisionViolationResponseRevocationType.SHOCK_INCARCERATION, ), ], supervision_violation=supervision_violation, ) revocation_date = datetime.date(2009, 2, 13) violation_history = violation_utils.get_violation_and_response_history( revocation_date, [supervision_violation_response], UsXxViolationDelegate() ) expected_output = violation_utils.ViolationHistory( most_severe_violation_type=StateSupervisionViolationType.MISDEMEANOR, most_severe_violation_type_subtype=StateSupervisionViolationType.MISDEMEANOR.value, most_severe_response_decision=StateSupervisionViolationResponseDecision.REVOCATION, response_count=1, violation_history_description="1misdemeanor", violation_type_frequency_counter=[["ABSCONDED", "MISDEMEANOR"]], ) self.assertEqual(expected_output, violation_history)
def test_us_nd_prepare_violation_responses_for_calculations_different_days( self, ) -> None: supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123, state_code=STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code=STATE_CODE, violation_type=StateSupervisionViolationType.ABSCONDED, ), ], ) ssvr = StateSupervisionViolationResponse.new_with_defaults( state_code=STATE_CODE, supervision_violation_response_id=123, supervision_violation=supervision_violation, response_date=datetime.date(2008, 12, 1), response_type=StateSupervisionViolationResponseType.PERMANENT_DECISION, ) other_supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123, state_code=STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code=STATE_CODE, violation_type=StateSupervisionViolationType.FELONY, ), ], ) other_ssvr = StateSupervisionViolationResponse.new_with_defaults( state_code=STATE_CODE, supervision_violation_response_id=123, supervision_violation=other_supervision_violation, response_date=datetime.date(2008, 12, 25), response_type=StateSupervisionViolationResponseType.PERMANENT_DECISION, ) prepared_responses = ( us_nd_violation_utils.us_nd_prepare_violation_responses_for_calculations( violation_responses=[ssvr, other_ssvr] ) ) self.assertCountEqual( [ssvr, other_ssvr], prepared_responses, )
def test_get_violation_type_frequency_counter_us_mo_technical_only_no_conditions( self, ) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code="US_MO", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, ) ], ) ] violation_type_frequency_counter = ( violation_utils.get_violation_type_frequency_counter( violations, UsMoViolationDelegate() ) ) self.assertEqual( [[StateSupervisionViolationType.TECHNICAL.value]], violation_type_frequency_counter, )
def test_get_violation_type_frequency_counter_us_mo_technical_only(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code="US_MO", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, ) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_XX", condition="DRG" ) ], ) ] violation_type_frequency_counter = ( violation_utils.get_violation_type_frequency_counter( violations, UsMoViolationDelegate() ) ) self.assertEqual([["SUBSTANCE_ABUSE"]], violation_type_frequency_counter)
def test_identify_most_severe_violation_type(self): violation = StateSupervisionViolation.new_with_defaults( state_code='US_MO', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ]) most_severe_violation_type, most_severe_violation_type_subtype = \ calculator_utils.identify_most_severe_violation_type_and_subtype([violation]) self.assertEqual(most_severe_violation_type, StateSupervisionViolationType.FELONY) self.assertEqual('UNSET', most_severe_violation_type_subtype)
def test_handle_citation_violations_us_mo(self): # Arrange supervision_violation = \ StateSupervisionViolation.new_with_defaults( state_code='US_MO', supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults(condition='LAW'), ] ) supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( state_code='US_MO', response_type=StateSupervisionViolationResponseType.CITATION, supervision_violation=supervision_violation ) # Act _ = normalize_violations_on_responses(supervision_violation_response) # Assert self.assertEqual(supervision_violation.supervision_violation_types, [ StateSupervisionViolationTypeEntry( state_code='US_MO', violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text=None) ]) self.assertEqual( supervision_violation.supervision_violated_conditions, [ StateSupervisionViolatedConditionEntry.new_with_defaults( condition=_LAW_CITATION_SUBTYPE_STR), ])
def _normalize_violations_on_responses_us_mo(response: StateSupervisionViolationResponse) -> \ StateSupervisionViolationResponse: """For responses that are not of type CITATION or don't have an associated violation, does nothing. Responses of type CITATION do not have violation types on their violations, so the violation types and conditions violated on these violations are updated.""" if not response.state_code or response.state_code.upper() != 'US_MO': raise ValueError(f"Calling state-specific US_MO helper function for a response from {response.state_code}") # Citations in US_MO don't have violation types on them. However, we want to classify them as TECHNICAL. # If this is a CITATION and there's a violation on it, add TECHNICAL to the list of violation types. if response.response_type == StateSupervisionViolationResponseType.CITATION and response.supervision_violation: supervision_violation = response.supervision_violation if not supervision_violation.supervision_violation_types: supervision_violation.supervision_violation_types.append( StateSupervisionViolationTypeEntry( state_code=response.state_code, violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text=None ) ) # Update citations that list the _LAW_CONDITION_STR as a condition to instead list _LAW_CITATION_SUBTYPE_STR # so we can track law citations independently from other violations with LAW conditions on them for condition_entry in supervision_violation.supervision_violated_conditions: if condition_entry.condition == _LAW_CONDITION_STR: condition_entry.condition = _LAW_CITATION_SUBTYPE_STR return response
def test_us_pa_get_violation_type_subtype_strings_for_violation_high_technical( self, ) -> None: # Arrange violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_PA", violation_date=date(2009, 1, 3), supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code=_STATE_CODE, violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text="H05", ), ], ) # Act type_subtype_strings = ( self.delegate.get_violation_type_subtype_strings_for_violation(violation) ) # Assert expected_type_subtype_strings = ["HIGH_TECH"] self.assertEqual(expected_type_subtype_strings, type_subtype_strings)
def test_normalize_violations_on_responses_us_mo_no_conditions( self) -> None: # Arrange supervision_violation = StateSupervisionViolation.new_with_defaults( state_code="US_MO") supervision_violation_response = ( StateSupervisionViolationResponse.new_with_defaults( state_code="US_MO", response_type=StateSupervisionViolationResponseType.CITATION, supervision_violation=supervision_violation, )) # Act _ = _normalize_violations_on_responses(supervision_violation_response) # Assert self.assertEqual( [ StateSupervisionViolationTypeEntry( state_code="US_MO", violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text=None, ) ], supervision_violation.supervision_violation_types, ) self.assertEqual([], supervision_violation.supervision_violated_conditions)
def test_us_mo_get_violation_type_subtype_strings_for_violation_technical( self, ) -> None: # Arrange violation = StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code=_STATE_CODE, violation_type=StateSupervisionViolationType.TECHNICAL, ) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code=_STATE_CODE, condition="EMP") ], ) # Act type_subtype_strings = ( self.delegate.get_violation_type_subtype_strings_for_violation( violation)) # Assert expected_type_subtype_strings = ["EMP", "TECHNICAL"] self.assertEqual(expected_type_subtype_strings, type_subtype_strings)
def test_handle_citation_violations_us_mo_no_conditions(self): # Arrange supervision_violation = \ StateSupervisionViolation.new_with_defaults( state_code='US_MO' ) supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( state_code='US_MO', response_type=StateSupervisionViolationResponseType.CITATION, supervision_violation=supervision_violation ) # Act _ = normalize_violations_on_responses(supervision_violation_response) # Assert self.assertEqual([ StateSupervisionViolationTypeEntry( state_code='US_MO', violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text=None) ], supervision_violation.supervision_violation_types) self.assertEqual([], supervision_violation.supervision_violated_conditions)
def test_getRankedViolationTypeAndSubtypeCounts(self): # Arrange violations = [ StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( condition='LAW') ]), StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( condition='DRG') ]), StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ]), StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType. MISDEMEANOR), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ]) ] # Act ordered_counts = get_ranked_violation_type_and_subtype_counts( violations, VIOLATION_TYPE_SEVERITY_ORDER) # Assert expected_counts = OrderedDict([('fel', 2), ('subs', 1), ('tech', 1)]) self.assertEqual(expected_counts, ordered_counts)
def test_get_violation_type_frequency_counter_us_pa(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code="US_PA", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.ABSCONDED, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text="L05", ), ], ), StateSupervisionViolation.new_with_defaults( state_code="US_PA", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.MISDEMEANOR, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.TECHNICAL, violation_type_raw_text="H12", ), ], ), ] violation_type_frequency_counter = ( violation_utils.get_violation_type_frequency_counter( violations, UsPaViolationDelegate() ) ) self.assertEqual( [["ABSCONDED", "FELONY", "LOW_TECH"], ["MISDEMEANOR", "SUBSTANCE_ABUSE"]], violation_type_frequency_counter, )
def test_get_violation_and_response_history_us_mo_handle_law_technicals(self): """Tests that a US_MO violation report with a TECHNICAL type and a LAW condition is not treated like a citation with a LAW condition.""" supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_MO", violation_date=datetime.date(2009, 1, 7), supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_MO", violation_type=StateSupervisionViolationType.TECHNICAL, ), ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_MO", condition="LAW" ), ], ) supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( state_code="US_MO", supervision_violation_response_id=_DEFAULT_SSVR_ID, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, response_subtype="ITR", response_date=datetime.date(2009, 1, 7), is_draft=False, supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_MO", decision=StateSupervisionViolationResponseDecision.REVOCATION, revocation_type=StateSupervisionViolationResponseRevocationType.REINCARCERATION, ), StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_MO", decision=StateSupervisionViolationResponseDecision.CONTINUANCE, revocation_type=StateSupervisionViolationResponseRevocationType.SHOCK_INCARCERATION, ), ], supervision_violation=supervision_violation, ) revocation_date = datetime.date(2009, 2, 13) violation_history = violation_utils.get_violation_and_response_history( revocation_date, [supervision_violation_response], UsMoViolationDelegate() ) expected_output = violation_utils.ViolationHistory( most_severe_violation_type=StateSupervisionViolationType.TECHNICAL, most_severe_violation_type_subtype=StateSupervisionViolationType.TECHNICAL.value, most_severe_response_decision=StateSupervisionViolationResponseDecision.REVOCATION, response_count=1, violation_history_description="1tech", violation_type_frequency_counter=[["LAW", "TECHNICAL"]], ) self.assertEqual(expected_output, violation_history)
def test_get_violation_and_response_history_with_us_mo_subtype(self): supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_MO", violation_date=datetime.date(2009, 1, 3), supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_MO", violation_type=StateSupervisionViolationType.TECHNICAL, ), ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_MO", condition="DRG" ), StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_MO", condition="OTHER" ), ], ) supervision_violation_response = StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=_DEFAULT_SSVR_ID, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, response_subtype="INI", state_code="US_MO", response_date=datetime.date(2009, 1, 7), supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_MO", decision=StateSupervisionViolationResponseDecision.REVOCATION, revocation_type=StateSupervisionViolationResponseRevocationType.REINCARCERATION, ), StateSupervisionViolationResponseDecisionEntry.new_with_defaults( state_code="US_MO", decision=StateSupervisionViolationResponseDecision.CONTINUANCE, ), ], supervision_violation=supervision_violation, ) revocation_date = datetime.date(2009, 2, 13) violation_history = violation_utils.get_violation_and_response_history( revocation_date, [supervision_violation_response], UsMoViolationDelegate() ) expected_output = violation_utils.ViolationHistory( most_severe_violation_type=StateSupervisionViolationType.TECHNICAL, most_severe_violation_type_subtype="SUBSTANCE_ABUSE", most_severe_response_decision=StateSupervisionViolationResponseDecision.REVOCATION, response_count=1, violation_history_description="1subs", violation_type_frequency_counter=[["SUBSTANCE_ABUSE", "OTHER"]], ) self.assertEqual(expected_output, violation_history)
def test_get_violation_type_frequency_counter(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code='US_XX', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.ABSCONDED ), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ], ) ] violation_type_frequency_counter = violation_utils.get_violation_type_frequency_counter( violations) self.assertEqual([['ABSCONDED', 'FELONY']], violation_type_frequency_counter)
def test_identify_most_severe_violation_type_test_all_types(self): for violation_type in StateSupervisionViolationType: violation = StateSupervisionViolation.new_with_defaults( state_code='US_MO', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=violation_type) ]) most_severe_violation_type, most_severe_violation_type_subtype = \ calculator_utils.identify_most_severe_violation_type_and_subtype([violation]) self.assertEqual(most_severe_violation_type, violation_type) self.assertEqual('UNSET', most_severe_violation_type_subtype)
def test_get_violation_type_frequency_counter(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code="US_XX", supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.ABSCONDED, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ), ], ) ] violation_type_frequency_counter = ( violation_utils.get_violation_type_frequency_counter(violations)) self.assertEqual([["ABSCONDED", "FELONY"]], violation_type_frequency_counter)
def test_get_violation_type_frequency_counter_us_mo(self) -> None: violations = [ StateSupervisionViolation.new_with_defaults( state_code='US_MO', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.ABSCONDED ), StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.FELONY) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( condition='DRG') ]) ] violation_type_frequency_counter = violation_utils.get_violation_type_frequency_counter( violations) self.assertEqual([['ABSCONDED', 'FELONY', 'SUBSTANCE_ABUSE']], violation_type_frequency_counter)
def test_identify_most_severe_violation_type_test_all_types(self) -> None: for violation_type in StateSupervisionViolationType: violation = StateSupervisionViolation.new_with_defaults( state_code='US_XX', supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=violation_type) ]) most_severe_violation_type, most_severe_violation_type_subtype = \ violation_utils.identify_most_severe_violation_type_and_subtype([violation]) self.assertEqual(most_severe_violation_type, violation_type) self.assertEqual(violation_type.value, most_severe_violation_type_subtype)
def testSetViolationOnViolationsResponse(self): """Tests that the hydrated StateSupervisionViolation is set on the StateSupervisionViolationResponse.""" supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=123, response_type= StateSupervisionViolationResponseType.PERMANENT_DECISION ) supervision_violation = \ StateSupervisionViolation.new_with_defaults( supervision_violation_id=999, supervision_violation_responses= [supervision_violation_response], supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( violation_type=StateSupervisionViolationType.TECHNICAL )] ) supervision_violations_and_responses = ( {'violations': [supervision_violation], 'violation_responses': [supervision_violation_response] } ) expected_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=123, response_type= StateSupervisionViolationResponseType.PERMANENT_DECISION, supervision_violation=supervision_violation ) test_pipeline = TestPipeline() output = (test_pipeline | beam.Create([(12345, supervision_violations_and_responses)]) | 'Set Supervision Violation on ' 'Supervision Violation Response' >> beam.ParDo( entity_hydration_utils.SetViolationOnViolationsResponse()) ) assert_that(output, equal_to([(12345, expected_violation_response)])) test_pipeline.run()