def test_us_pa_get_violation_type_subtype_strings_for_violation_unsupported_raw_text( 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="XL", ), ], ) # Act with pytest.raises(ValueError): _ = self.delegate.get_violation_type_subtype_strings_for_violation( violation )
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_normalize_violations_on_responses_not_us_mo(self) -> None: # Arrange supervision_violation = StateSupervisionViolation.new_with_defaults( state_code="US_NOT_MO", supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_NOT_MO", condition="LAW"), ], ) supervision_violation_response = ( StateSupervisionViolationResponse.new_with_defaults( state_code="US_NOT_MO", response_type=StateSupervisionViolationResponseType.CITATION, supervision_violation=supervision_violation, )) # Act and Assert with pytest.raises(ValueError): # This function should only be called for responses from US_MO _ = _normalize_violations_on_responses( supervision_violation_response)
def test_handle_citation_violations_not_us_mo(self): # Arrange supervision_violation = \ StateSupervisionViolation.new_with_defaults( state_code='US_NOT_MO', supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults(condition='LAW'), ] ) supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( state_code='US_NOT_MO', response_type=StateSupervisionViolationResponseType.CITATION, supervision_violation=supervision_violation ) # Act and Assert with pytest.raises(ValueError): # This function should only be called for responses from US_MO _ = _normalize_violations_on_responses_us_mo( supervision_violation_response)
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_normalize_violations_on_responses_us_mo(self) -> None: # Arrange supervision_violation = StateSupervisionViolation.new_with_defaults( state_code="US_MO", supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_MO", 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( state_code="US_MO", condition=_LAW_CITATION_SUBTYPE_STR), ], )
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 = us_pa_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_us_pa_get_violation_type_subtype_strings_for_violation_electronic_monitoring( 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, violation_type_raw_text="M16", ) ], ) # Act type_subtype_strings = ( self.delegate.get_violation_type_subtype_strings_for_violation(violation) ) # Assert expected_type_subtype_strings = ["ELEC_MONITORING"] self.assertEqual(expected_type_subtype_strings, type_subtype_strings)
def test_us_pa_get_violation_type_subtype_strings_for_violation_substance( 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, violation_type_raw_text="H12", ) ], ) # Act type_subtype_strings = ( self.delegate.get_violation_type_subtype_strings_for_violation(violation) ) # Assert expected_type_subtype_strings = ["SUBSTANCE_ABUSE"] self.assertEqual(expected_type_subtype_strings, type_subtype_strings)
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)) self.assertEqual([["SUBSTANCE_ABUSE"]], violation_type_frequency_counter)
def test_removeSeosFromViolationIds(self): svr = schema.StateSupervisionViolationResponse( external_id='DOC-CYC-VSN1-SEO-FSO') sv = schema.StateSupervisionViolation( external_id='DOC-CYC-VSN1-SEO-FSO', supervision_violation_responses=[svr]) svr_2 = schema.StateSupervisionViolationResponse( external_id='DOC-CYC-VSN1-SEO-FSO') sv_2 = schema.StateSupervisionViolation( external_id='DOC-CYC-VSN1-SEO-FSO', supervision_violation_responses=[svr_2]) sp = schema.StateSupervisionPeriod( supervision_violation_entries=[sv, sv_2]) ss = schema.StateSupervisionSentence(supervision_periods=[sp]) sg = schema.StateSentenceGroup(supervision_sentences=[ss]) p = schema.StatePerson(sentence_groups=[sg]) expected_svr = StateSupervisionViolationResponse.new_with_defaults( external_id='DOC-CYC-VSN1') expected_sv = StateSupervisionViolation.new_with_defaults( external_id='DOC-CYC-VSN1', supervision_violation_responses=[expected_svr]) expected_svr_2 = attr.evolve(expected_svr) expected_sv_2 = attr.evolve( expected_sv, supervision_violation_responses=[expected_svr_2]) expected_sp = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[expected_sv, expected_sv_2]) expected_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[expected_sp]) expected_sg = StateSentenceGroup.new_with_defaults( supervision_sentences=[expected_ss]) expected_p = StatePerson.new_with_defaults( sentence_groups=[expected_sg]) remove_suffix_from_violation_ids([p]) self.assertEqual(expected_p, self.to_entity(p))
def test_associateSvrsWithIps_within90Days(self) -> None: # Arrange svr_1 = StateSupervisionViolationResponse.new_with_defaults( state_code=_STATE_CODE, response_date=_DATE_2 + datetime.timedelta(days=1), revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION, ) svr_2 = StateSupervisionViolationResponse.new_with_defaults( state_code=_STATE_CODE, response_date=_DATE_4 + datetime.timedelta(days=100), revocation_type=StateSupervisionViolationResponseRevocationType. RETURN_TO_SUPERVISION, ) placeholder_sv = StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, supervision_violation_responses=[svr_1, svr_2]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( state_code=_STATE_CODE, supervision_violation_entries=[placeholder_sv], status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) placeholder_ss = StateSupervisionSentence.new_with_defaults( state_code=_STATE_CODE, supervision_periods=[placeholder_sp], status=StateSentenceStatus.PRESENT_WITHOUT_INFO, ) ip_1 = StateIncarcerationPeriod.new_with_defaults( state_code=_STATE_CODE, admission_date=_DATE_2, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, ) ip_2 = StateIncarcerationPeriod.new_with_defaults( state_code=_STATE_CODE, admission_date=_DATE_4, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, ) placeholder_is = StateIncarcerationSentence.new_with_defaults( state_code=_STATE_CODE, incarceration_periods=[ip_1, ip_2], status=StateSentenceStatus.PRESENT_WITHOUT_INFO, ) placeholder_sg = StateSentenceGroup.new_with_defaults( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss], ) placeholder_person = StatePerson.new_with_defaults( state_code=_STATE_CODE, sentence_groups=[placeholder_sg]) expected_svr_1 = attr.evolve(svr_1) expected_svr_2 = attr.evolve(svr_2) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1, expected_svr_2], ) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violation_entries=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve( ip_1, source_supervision_violation_response=expected_svr_1) expected_ip_2 = attr.evolve(ip_2) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is], ) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) # Act input_people = converter.convert_entity_people_to_schema_people( [placeholder_person]) associate_revocation_svrs_with_ips(input_people) # Assert self.assert_people_match([expected_placeholder_person], input_people)
def testSetViolationResponseOnIncarcerationPeriod(self): """Tests that the hydrated StateSupervisionViolationResponse is set on the StateIncarcerationPeriod.""" supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=123, response_type= StateSupervisionViolationResponseType.PERMANENT_DECISION ) incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2015, 5, 30), admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, release_date=date(2020, 12, 4), release_reason=StateIncarcerationPeriodReleaseReason. SENTENCE_SERVED, source_supervision_violation_response=supervision_violation_response ) supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=55555) hydrated_supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=123, response_type= StateSupervisionViolationResponseType.PERMANENT_DECISION, supervision_violation=supervision_violation ) incarceration_periods_violation_responses = { 'incarceration_periods': [incarceration_period], 'violation_responses': [hydrated_supervision_violation_response] } expected_incarceration_period = \ StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', admission_date=date(2015, 5, 30), admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, release_date=date(2020, 12, 4), release_reason=StateIncarcerationPeriodReleaseReason. SENTENCE_SERVED, source_supervision_violation_response= hydrated_supervision_violation_response ) test_pipeline = TestPipeline() output = (test_pipeline | beam.Create( [(12345, incarceration_periods_violation_responses)]) | 'Set Supervision Violation Response on ' 'Incarceration Period' >> beam.ParDo(entity_hydration_utils. SetViolationResponseOnIncarcerationPeriod())) assert_that(output, equal_to([(12345, expected_incarceration_period)])) test_pipeline.run()
def testConvert_FullIngestInfo(self): # Arrange metadata = FakeIngestMetadata.for_state(region="us_nd") ingest_info = IngestInfo() ingest_info.state_agents.add(state_agent_id="AGENT_ID1", full_name="AGENT WILLIAMS") ingest_info.state_agents.add(state_agent_id="AGENT_ID2", full_name="AGENT HERNANDEZ") ingest_info.state_agents.add(state_agent_id="AGENT_ID3", full_name="AGENT SMITH") ingest_info.state_agents.add(state_agent_id="AGENT_ID4", full_name="AGENT PO") ingest_info.state_agents.add(state_agent_id="JUDGE_AGENT_ID_1", full_name="JUDGE JUDY") ingest_info.state_agents.add(state_agent_id="AGENT_ID_PO", full_name="AGENT PAROLEY") ingest_info.state_agents.add( state_agent_id="AGENT_ID_TERM", full_name="AGENT TERMY", agent_type="SUPERVISION_OFFICER", ) ingest_info.state_agents.add( state_agent_id="AGENT_ID_SUPERVISING", full_name="SUPERVISING AGENT", ) # We expect the external_ids coming in to have the format # [type]:[external_id] ii_person_external_id_1 = US_ND_ELITE + ":" + "EXTERNAL_ID1" ii_person_external_id_2 = US_ND_SID + ":" + "EXTERNAL_ID2" ingest_info.state_people.add( state_person_id="PERSON_ID", state_person_race_ids=["RACE_ID1", "RACE_ID2"], state_person_ethnicity_ids=["ETHNICITY_ID"], state_alias_ids=["ALIAS_ID1", "ALIAS_ID2"], state_person_external_ids_ids=[ ii_person_external_id_1, ii_person_external_id_2, ], state_assessment_ids=["ASSESSMENT_ID"], state_program_assignment_ids=["PROGRAM_ASSIGNMENT_ID"], state_sentence_group_ids=["GROUP_ID1", "GROUP_ID2"], supervising_officer_id="AGENT_ID_SUPERVISING", ) ingest_info.state_person_races.add( state_person_race_id="RACE_ID1", race="WHITE", ) ingest_info.state_person_races.add(state_person_race_id="RACE_ID2", race="OTHER") ingest_info.state_person_ethnicities.add( state_person_ethnicity_id="ETHNICITY_ID", ethnicity="HISPANIC") ingest_info.state_aliases.add(state_alias_id="ALIAS_ID1", full_name="LONNY BREAUX") ingest_info.state_aliases.add(state_alias_id="ALIAS_ID2", full_name="FRANK OCEAN") ingest_info.state_person_external_ids.add( state_person_external_id_id=ii_person_external_id_1, id_type=US_ND_ELITE) ingest_info.state_person_external_ids.add( state_person_external_id_id=ii_person_external_id_2, id_type=US_ND_SID) ingest_info.state_assessments.add( state_assessment_id="ASSESSMENT_ID", assessment_class="MENTAL_HEALTH", conducting_agent_id="AGENT_ID1", ) ingest_info.state_program_assignments.add( state_program_assignment_id="PROGRAM_ASSIGNMENT_ID", participation_status="DISCHARGED", referral_date="2019/02/10", start_date="2019/02/11", discharge_date="2019/02/12", program_id="PROGRAM_ID", program_location_id="PROGRAM_LOCATION_ID", discharge_reason="COMPLETED", referring_agent_id="AGENT_ID4", ) ingest_info.state_sentence_groups.add( state_sentence_group_id="GROUP_ID1", state_supervision_sentence_ids=["SUPERVISION_SENTENCE_ID1"], state_incarceration_sentence_ids=[ "INCARCERATION_SENTENCE_ID1", "INCARCERATION_SENTENCE_ID2", ], ) ingest_info.state_sentence_groups.add( state_sentence_group_id="GROUP_ID2", state_supervision_sentence_ids=["SUPERVISION_SENTENCE_ID2"], state_fine_ids=["FINE_ID"], ) ingest_info.state_fines.add(state_fine_id="FINE_ID", status="PAID") ingest_info.state_supervision_sentences.add( state_supervision_sentence_id="SUPERVISION_SENTENCE_ID1", state_charge_ids=["CHARGE_ID1", "CHARGE_ID2"], state_supervision_period_ids=["S_PERIOD_ID1"], ) ingest_info.state_supervision_sentences.add( state_supervision_sentence_id="SUPERVISION_SENTENCE_ID2", state_charge_ids=["CHARGE_ID2"], state_supervision_period_ids=["S_PERIOD_ID2"], ) ingest_info.state_incarceration_sentences.add( state_incarceration_sentence_id="INCARCERATION_SENTENCE_ID1", state_charge_ids=["CHARGE_ID1"], state_incarceration_period_ids=["I_PERIOD_ID"], ) ingest_info.state_incarceration_sentences.add( state_incarceration_sentence_id="INCARCERATION_SENTENCE_ID2", state_charge_ids=["CHARGE_ID2", "CHARGE_ID3"], state_supervision_period_ids=["S_PERIOD_ID3"], ) ingest_info.state_charges.add( state_charge_id="CHARGE_ID1", state_court_case_id="CASE_ID", state_bond_id="BOND_ID", classification_type="M", classification_subtype="1", ncic_code="5006", ) ingest_info.state_charges.add( state_charge_id="CHARGE_ID2", state_court_case_id="CASE_ID", classification_type="M", classification_subtype="2", ) ingest_info.state_charges.add( state_charge_id="CHARGE_ID3", state_court_case_id="CASE_ID", classification_type="F", classification_subtype="3", ncic_code="5006", description="Obstruction of investigation", ) ingest_info.state_court_cases.add( state_court_case_id="CASE_ID", judge_id="JUDGE_AGENT_ID_1", ) ingest_info.state_bonds.add(state_bond_id="BOND_ID", status="POSTED") ingest_info.state_supervision_periods.add( state_supervision_period_id="S_PERIOD_ID1", state_supervision_violation_entry_ids=["VIOLATION_ID"], supervision_type="PAROLE", supervision_level="MED", state_supervision_contact_ids=["SUPERVISION_CONTACT_ID"], state_program_assignment_ids=["PROGRAM_ASSIGNMENT_ID"], ) ingest_info.state_supervision_periods.add( state_supervision_period_id="S_PERIOD_ID2", supervision_type="PAROLE") ingest_info.state_supervision_periods.add( state_supervision_period_id="S_PERIOD_ID3", state_assessment_ids=["ASSESSMENT_ID"], supervising_officer_id="AGENT_ID_PO", supervision_type="PROBATION", state_supervision_case_type_entry_ids=["CASE_TYPE_ID"], ) ingest_info.state_supervision_case_type_entries.add( state_supervision_case_type_entry_id="CASE_TYPE_ID", case_type="DOMESTIC_VIOLENCE", ) ingest_info.state_incarceration_periods.add( state_incarceration_period_id="I_PERIOD_ID", state_incarceration_incident_ids=["INCIDENT_ID"], state_parole_decision_ids=["DECISION_ID"], state_assessment_ids=["ASSESSMENT_ID"], state_program_assignment_ids=["PROGRAM_ASSIGNMENT_ID"], source_supervision_violation_response_id="RESPONSE_ID", ) ingest_info.state_supervision_violation_type_entries.add( state_supervision_violation_type_entry_id="VIOLATION_TYPE_ENTRY_ID", violation_type="FELONY", state_code="US_ND", ) ingest_info.state_supervision_violated_condition_entries.add( state_supervision_violated_condition_entry_id= "VIOLATED_CONDITION_ENTRY_ID", condition="CURFEW", state_code="US_ND", ) ingest_info.state_supervision_violations.add( state_supervision_violation_id="VIOLATION_ID", state_supervision_violation_response_ids=["RESPONSE_ID"], state_supervision_violated_condition_entry_ids=[ "VIOLATED_CONDITION_ENTRY_ID" ], state_supervision_violation_type_entry_ids=[ "VIOLATION_TYPE_ENTRY_ID" ], ) ingest_info.state_supervision_violated_condition_entries.add( state_supervision_violated_condition_entry_id= "VIOLATED_CONDITION_ENTRY_ID", condition="CURFEW", state_code="US_ND", ) ingest_info.state_supervision_violation_response_decision_entries.add( state_supervision_violation_response_decision_entry_id= "VIOLATION_RESPONSE_DECISION_ENTRY_ID", decision="REVOCATION", revocation_type="REINCARCERATION", state_code="US_ND", ) ingest_info.state_supervision_violation_responses.add( state_supervision_violation_response_id="RESPONSE_ID", decision_agent_ids=["AGENT_ID_TERM"], state_supervision_violation_response_decision_entry_ids=[ "VIOLATION_RESPONSE_DECISION_ENTRY_ID" ], response_type="CITATION", ) ingest_info.state_incarceration_incidents.add( state_incarceration_incident_id="INCIDENT_ID", incident_type="CONTRABAND", responding_officer_id="AGENT_ID2", state_incarceration_incident_outcome_ids=["INCIDENT_OUTCOME_ID"], ) ingest_info.state_incarceration_incident_outcomes.add( state_incarceration_incident_outcome_id="INCIDENT_OUTCOME_ID", outcome_type="GOOD_TIME_LOSS", date_effective="2/10/2018", hearing_date="2/6/2018", report_date="2/8/2018", state_code="US_ND", outcome_description="Good time", punishment_length_days="7", ) ingest_info.state_parole_decisions.add( state_parole_decision_id="DECISION_ID", decision_agent_ids=["AGENT_ID2", "AGENT_ID3"], ) ingest_info.state_supervision_contacts.add( state_supervision_contact_id="SUPERVISION_CONTACT_ID", contacted_agent_id="AGENT_ID_PO", ) # Act result = self._convert_and_throw_on_errors(ingest_info, metadata) # Assert supervision_contact = StateSupervisionContact.new_with_defaults( external_id="SUPERVISION_CONTACT_ID", state_code="US_ND", contacted_agent=StateAgent.new_with_defaults( external_id="AGENT_ID_PO", state_code="US_ND", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT PAROLEY"}', ), ) incident_outcome = StateIncarcerationIncidentOutcome.new_with_defaults( external_id="INCIDENT_OUTCOME_ID", outcome_type=StateIncarcerationIncidentOutcomeType.GOOD_TIME_LOSS, outcome_type_raw_text="GOOD_TIME_LOSS", date_effective=datetime.date(year=2018, month=2, day=10), hearing_date=datetime.date(year=2018, month=2, day=6), report_date=datetime.date(year=2018, month=2, day=8), state_code="US_ND", outcome_description="GOOD TIME", punishment_length_days=7, ) incident = StateIncarcerationIncident.new_with_defaults( external_id="INCIDENT_ID", state_code="US_ND", incident_type=StateIncarcerationIncidentType.CONTRABAND, incident_type_raw_text="CONTRABAND", responding_officer=StateAgent.new_with_defaults( external_id="AGENT_ID2", state_code="US_ND", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT HERNANDEZ"}', ), incarceration_incident_outcomes=[incident_outcome], ) assessment = StateAssessment.new_with_defaults( external_id="ASSESSMENT_ID", state_code="US_ND", assessment_class=StateAssessmentClass.MENTAL_HEALTH, assessment_class_raw_text="MENTAL_HEALTH", conducting_agent=StateAgent.new_with_defaults( external_id="AGENT_ID1", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, state_code="US_ND", full_name='{"full_name": "AGENT WILLIAMS"}', ), ) program_assignment = StateProgramAssignment.new_with_defaults( external_id="PROGRAM_ASSIGNMENT_ID", state_code="US_ND", participation_status=StateProgramAssignmentParticipationStatus. DISCHARGED, participation_status_raw_text="DISCHARGED", referral_date=datetime.date(year=2019, month=2, day=10), start_date=datetime.date(year=2019, month=2, day=11), discharge_date=datetime.date(year=2019, month=2, day=12), program_id="PROGRAM_ID", program_location_id="PROGRAM_LOCATION_ID", discharge_reason=StateProgramAssignmentDischargeReason.COMPLETED, discharge_reason_raw_text="COMPLETED", referring_agent=StateAgent.new_with_defaults( external_id="AGENT_ID4", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, state_code="US_ND", full_name='{"full_name": "AGENT PO"}', ), ) response = StateSupervisionViolationResponse.new_with_defaults( external_id="RESPONSE_ID", state_code="US_ND", response_type=StateSupervisionViolationResponseType.CITATION, response_type_raw_text="CITATION", decision_agents=[ StateAgent.new_with_defaults( external_id="AGENT_ID_TERM", state_code="US_ND", full_name='{"full_name": "AGENT TERMY"}', agent_type=StateAgentType.SUPERVISION_OFFICER, agent_type_raw_text="SUPERVISION_OFFICER", ) ], supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry. new_with_defaults( state_code="US_ND", decision=StateSupervisionViolationResponseDecision. REVOCATION, decision_raw_text="REVOCATION", revocation_type= StateSupervisionViolationResponseRevocationType. REINCARCERATION, revocation_type_raw_text="REINCARCERATION", ) ], ) violation = StateSupervisionViolation.new_with_defaults( external_id="VIOLATION_ID", state_code="US_ND", supervision_violation_responses=[response], supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_ND", violation_type=StateSupervisionViolationType.FELONY, violation_type_raw_text="FELONY", ) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code="US_ND", condition="CURFEW", ) ], ) court_case = StateCourtCase.new_with_defaults( external_id="CASE_ID", state_code="US_ND", status=StateCourtCaseStatus.PRESENT_WITHOUT_INFO, court_type=StateCourtType.PRESENT_WITHOUT_INFO, judge=StateAgent.new_with_defaults( external_id="JUDGE_AGENT_ID_1", state_code="US_ND", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "JUDGE JUDY"}', ), ) charge_1 = StateCharge.new_with_defaults( external_id="CHARGE_ID1", classification_type=StateChargeClassificationType.MISDEMEANOR, classification_type_raw_text="M", classification_subtype="1", ncic_code="5006", description="FALSE STATEMENT", state_code="US_ND", status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case, bond=StateBond.new_with_defaults( external_id="BOND_ID", state_code="US_ND", status=BondStatus.POSTED, status_raw_text="POSTED", ), ) charge_2 = StateCharge.new_with_defaults( external_id="CHARGE_ID2", classification_type=StateChargeClassificationType.MISDEMEANOR, classification_type_raw_text="M", classification_subtype="2", state_code="US_ND", status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case, ) charge_3 = StateCharge.new_with_defaults( external_id="CHARGE_ID3", state_code="US_ND", classification_type=StateChargeClassificationType.FELONY, classification_type_raw_text="F", classification_subtype="3", ncic_code="5006", description="OBSTRUCTION OF INVESTIGATION", status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case, ) incarceration_sentence_1 = StateIncarcerationSentence.new_with_defaults( external_id="INCARCERATION_SENTENCE_ID1", state_code="US_ND", status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType.STATE_PRISON, charges=[charge_1], incarceration_periods=[ StateIncarcerationPeriod.new_with_defaults( external_id="I_PERIOD_ID", status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType.STATE_PRISON, state_code="US_ND", incarceration_incidents=[incident], program_assignments=[program_assignment], parole_decisions=[ StateParoleDecision.new_with_defaults( external_id="DECISION_ID", state_code="US_ND", decision_agents=[ StateAgent.new_with_defaults( external_id="AGENT_ID2", agent_type=StateAgentType. PRESENT_WITHOUT_INFO, state_code="US_ND", full_name= '{"full_name": "AGENT HERNANDEZ"}', ), StateAgent.new_with_defaults( external_id="AGENT_ID3", state_code="US_ND", agent_type=StateAgentType. PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT SMITH"}', ), ], ) ], assessments=[assessment], source_supervision_violation_response=response, ) ], ) incarceration_sentence_2 = StateIncarcerationSentence.new_with_defaults( external_id="INCARCERATION_SENTENCE_ID2", state_code="US_ND", status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType.STATE_PRISON, charges=[charge_2, charge_3], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id="S_PERIOD_ID3", status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, state_code="US_ND", supervision_type=StateSupervisionType.PROBATION, supervision_type_raw_text="PROBATION", assessments=[assessment], supervising_officer=StateAgent.new_with_defaults( external_id="AGENT_ID_PO", state_code="US_ND", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT PAROLEY"}', ), case_type_entries=[ StateSupervisionCaseTypeEntry.new_with_defaults( case_type=StateSupervisionCaseType. DOMESTIC_VIOLENCE, case_type_raw_text="DOMESTIC_VIOLENCE", state_code="US_ND", external_id="CASE_TYPE_ID", ) ], ) ], ) expected_result = [ StatePerson.new_with_defaults( state_code="US_ND", external_ids=[ StatePersonExternalId.new_with_defaults( external_id="EXTERNAL_ID1", state_code="US_ND", id_type=US_ND_ELITE, ), StatePersonExternalId.new_with_defaults( external_id="EXTERNAL_ID2", state_code="US_ND", id_type=US_ND_SID, ), ], races=[ StatePersonRace(race=Race.WHITE, race_raw_text="WHITE", state_code="US_ND"), StatePersonRace(race=Race.OTHER, race_raw_text="OTHER", state_code="US_ND"), ], ethnicities=[ StatePersonEthnicity( ethnicity=Ethnicity.HISPANIC, ethnicity_raw_text="HISPANIC", state_code="US_ND", ) ], aliases=[ StatePersonAlias.new_with_defaults( full_name='{"full_name": "LONNY BREAUX"}', state_code="US_ND"), StatePersonAlias.new_with_defaults( full_name='{"full_name": "FRANK OCEAN"}', state_code="US_ND"), ], supervising_officer=StateAgent.new_with_defaults( external_id="AGENT_ID_SUPERVISING", state_code="US_ND", agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "SUPERVISING AGENT"}', ), assessments=[assessment], program_assignments=[program_assignment], sentence_groups=[ StateSentenceGroup.new_with_defaults( external_id="GROUP_ID1", status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code="US_ND", supervision_sentences=[ StateSupervisionSentence.new_with_defaults( external_id="SUPERVISION_SENTENCE_ID1", state_code="US_ND", status=StateSentenceStatus. PRESENT_WITHOUT_INFO, charges=[charge_1, charge_2], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id="S_PERIOD_ID1", status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, supervision_level=StateSupervisionLevel .MEDIUM, supervision_level_raw_text="MED", state_code="US_ND", supervision_type=StateSupervisionType. PAROLE, supervision_type_raw_text="PAROLE", supervision_violation_entries=[ violation ], program_assignments=[ program_assignment ], supervision_contacts=[ supervision_contact ], ) ], ) ], incarceration_sentences=[ incarceration_sentence_1, incarceration_sentence_2, ], ), StateSentenceGroup.new_with_defaults( external_id="GROUP_ID2", status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code="US_ND", supervision_sentences=[ StateSupervisionSentence.new_with_defaults( external_id="SUPERVISION_SENTENCE_ID2", state_code="US_ND", status=StateSentenceStatus. PRESENT_WITHOUT_INFO, charges=[charge_2], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id="S_PERIOD_ID2", status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, state_code="US_ND", supervision_type=StateSupervisionType. PAROLE, supervision_type_raw_text="PAROLE", ) ], ) ], fines=[ StateFine.new_with_defaults( external_id="FINE_ID", state_code="US_ND", status=StateFineStatus.PAID, status_raw_text="PAID", ) ], ), ], ) ] print("\n", expected_result, "\n\n\n", result) self.assertCountEqual(expected_result, result)
def test_removeSeosFromSupervisionViolation(self): supervision_violation_response = \ StateSupervisionViolationResponse.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX) supervision_violation = StateSupervisionViolation.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX, supervision_violation_responses=[supervision_violation_response]) placeholder_supervision_period = \ StateSupervisionPeriod.new_with_defaults( state_code=_US_MO, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, supervision_violation_entries=[supervision_violation]) supervision_sentence = StateSupervisionSentence.new_with_defaults( status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code=_US_MO, external_id=_EXTERNAL_ID, supervision_periods=[placeholder_supervision_period]) sentence_group = StateSentenceGroup.new_with_defaults( state_code=_US_MO, external_id=_EXTERNAL_ID_WITH_SUFFIX, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_sentences=[], supervision_sentences=[supervision_sentence]) external_id = StatePersonExternalId.new_with_defaults( state_code=_US_MO, id_type=_ID_TYPE, external_id=_EXTERNAL_ID) person = StatePerson.new_with_defaults( sentence_groups=[sentence_group], external_ids=[external_id]) updated_external_id = _EXTERNAL_ID expected_supervision_violation_response = attr.evolve( supervision_violation_response, external_id=updated_external_id) expected_supervision_violation = attr.evolve( supervision_violation, external_id=updated_external_id, supervision_violation_responses=[ expected_supervision_violation_response ]) expected_placeholder_supervision_period = attr.evolve( placeholder_supervision_period, supervision_violation_entries=[expected_supervision_violation]) expected_supervision_sentence = attr.evolve( supervision_sentence, supervision_periods=[expected_placeholder_supervision_period]) expected_sentence_group = attr.evolve( sentence_group, supervision_sentences=[expected_supervision_sentence]) expected_external_id = attr.evolve(external_id) expected_person = attr.evolve( person, external_ids=[expected_external_id], sentence_groups=[expected_sentence_group]) # Act 1 - Match session = self._session() matched_entities = entity_matching.match(session, _US_MO, ingested_people=[person]) self.assert_people_match_pre_and_post_commit([expected_person], matched_entities.people, session) self.assertEqual(0, matched_entities.error_count) self.assertEqual(1, matched_entities.total_root_entities)
def test_associateSvrsWithIps_onlyRevocationTypes(self): # Arrange svr_1 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_1, revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) svr_2 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_3, revocation_type=StateSupervisionViolationResponseRevocationType. RETURN_TO_SUPERVISION) placeholder_sv = StateSupervisionViolation.new_with_defaults( supervision_violation_responses=[svr_1, svr_2]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( supervision_violations=[placeholder_sv]) placeholder_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[placeholder_sp]) ip_1 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_2, admission_reason=StateIncarcerationPeriodAdmissionReason. NEW_ADMISSION) ip_2 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_4, admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION) placeholder_is = StateIncarcerationSentence.new_with_defaults( incarceration_periods=[ip_1, ip_2]) placeholder_sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss]) placeholder_person = StatePerson.new_with_defaults( sentence_groups=[placeholder_sg]) expected_svr_1 = attr.evolve(svr_1) expected_svr_2 = attr.evolve(svr_2) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1, expected_svr_2]) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violations=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve(ip_1) expected_ip_2 = attr.evolve( ip_2, source_supervision_violation_response=svr_1) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is]) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) # Act associate_revocation_svrs_with_ips([placeholder_person]) # Assert self.assertEqual(expected_placeholder_person, placeholder_person)
def testConvert_FullIngestInfo(self): # Arrange metadata = IngestMetadata('us_nd', _JURISDICTION_ID, _INGEST_TIME, system_level=SystemLevel.STATE) ingest_info = IngestInfo() ingest_info.state_agents.add(state_agent_id='AGENT_ID1', full_name='AGENT WILLIAMS') ingest_info.state_agents.add(state_agent_id='AGENT_ID2', full_name='AGENT HERNANDEZ') ingest_info.state_agents.add(state_agent_id='AGENT_ID3', full_name='AGENT SMITH') ingest_info.state_agents.add(state_agent_id='AGENT_ID4', full_name='AGENT PO') ingest_info.state_agents.add(state_agent_id='JUDGE_AGENT_ID_1', full_name='JUDGE JUDY') ingest_info.state_agents.add(state_agent_id='AGENT_ID_PO', full_name='AGENT PAROLEY') ingest_info.state_agents.add(state_agent_id='AGENT_ID_TERM', full_name='AGENT TERMY', agent_type='SUPERVISION_OFFICER') ingest_info.state_agents.add( state_agent_id='AGENT_ID_SUPERVISING', full_name='SUPERVISING AGENT', ) # We expect the external_ids coming in to have the format # [type]:[external_id] ii_person_external_id_1 = US_ND_ELITE + ':' + 'EXTERNAL_ID1' ii_person_external_id_2 = US_ND_SID + ':' + 'EXTERNAL_ID2' ingest_info.state_people.add( state_person_id='PERSON_ID', state_person_race_ids=['RACE_ID1', 'RACE_ID2'], state_person_ethnicity_ids=['ETHNICITY_ID'], state_alias_ids=['ALIAS_ID1', 'ALIAS_ID2'], state_person_external_ids_ids=[ ii_person_external_id_1, ii_person_external_id_2 ], state_assessment_ids=['ASSESSMENT_ID'], state_program_assignment_ids=['PROGRAM_ASSIGNMENT_ID'], state_sentence_group_ids=['GROUP_ID1', 'GROUP_ID2'], supervising_officer_id='AGENT_ID_SUPERVISING', ) ingest_info.state_person_races.add( state_person_race_id='RACE_ID1', race='WHITE', ) ingest_info.state_person_races.add(state_person_race_id='RACE_ID2', race='OTHER') ingest_info.state_person_ethnicities.add( state_person_ethnicity_id='ETHNICITY_ID', ethnicity='HISPANIC') ingest_info.state_aliases.add(state_alias_id='ALIAS_ID1', full_name='LONNY BREAUX') ingest_info.state_aliases.add(state_alias_id='ALIAS_ID2', full_name='FRANK OCEAN') ingest_info.state_person_external_ids.add( state_person_external_id_id=ii_person_external_id_1, id_type=US_ND_ELITE) ingest_info.state_person_external_ids.add( state_person_external_id_id=ii_person_external_id_2, id_type=US_ND_SID) ingest_info.state_assessments.add(state_assessment_id='ASSESSMENT_ID', assessment_class='MENTAL_HEALTH', conducting_agent_id='AGENT_ID1') ingest_info.state_program_assignments.add( state_program_assignment_id='PROGRAM_ASSIGNMENT_ID', participation_status='DISCHARGED', referral_date='2019/02/10', start_date='2019/02/11', discharge_date='2019/02/12', program_id='PROGRAM_ID', program_location_id='PROGRAM_LOCATION_ID', discharge_reason='COMPLETED', referring_agent_id='AGENT_ID4') ingest_info.state_sentence_groups.add( state_sentence_group_id='GROUP_ID1', state_supervision_sentence_ids=['SUPERVISION_SENTENCE_ID1'], state_incarceration_sentence_ids=[ 'INCARCERATION_SENTENCE_ID1', 'INCARCERATION_SENTENCE_ID2' ]) ingest_info.state_sentence_groups.add( state_sentence_group_id='GROUP_ID2', state_supervision_sentence_ids=['SUPERVISION_SENTENCE_ID2'], state_fine_ids=['FINE_ID']) ingest_info.state_fines.add(state_fine_id='FINE_ID', status='PAID') ingest_info.state_supervision_sentences.add( state_supervision_sentence_id='SUPERVISION_SENTENCE_ID1', state_charge_ids=['CHARGE_ID1', 'CHARGE_ID2'], state_supervision_period_ids=['S_PERIOD_ID1']) ingest_info.state_supervision_sentences.add( state_supervision_sentence_id='SUPERVISION_SENTENCE_ID2', state_charge_ids=['CHARGE_ID2'], state_supervision_period_ids=['S_PERIOD_ID2']) ingest_info.state_incarceration_sentences.add( state_incarceration_sentence_id='INCARCERATION_SENTENCE_ID1', state_charge_ids=['CHARGE_ID1'], state_incarceration_period_ids=['I_PERIOD_ID']) ingest_info.state_incarceration_sentences.add( state_incarceration_sentence_id='INCARCERATION_SENTENCE_ID2', state_charge_ids=['CHARGE_ID2', 'CHARGE_ID3'], state_supervision_period_ids=['S_PERIOD_ID3']) ingest_info.state_charges.add( state_charge_id='CHARGE_ID1', state_court_case_id='CASE_ID', state_bond_id='BOND_ID', classification_type='M', classification_subtype='1', ncic_code='5006', ) ingest_info.state_charges.add( state_charge_id='CHARGE_ID2', state_court_case_id='CASE_ID', classification_type='M', classification_subtype='2', ) ingest_info.state_charges.add( state_charge_id='CHARGE_ID3', state_court_case_id='CASE_ID', classification_type='F', classification_subtype='3', ncic_code='5006', description='Obstruction of investigation', ) ingest_info.state_court_cases.add( state_court_case_id='CASE_ID', judge_id='JUDGE_AGENT_ID_1', ) ingest_info.state_bonds.add(state_bond_id='BOND_ID', status='POSTED') ingest_info.state_supervision_periods.add( state_supervision_period_id='S_PERIOD_ID1', state_supervision_violation_entry_ids=['VIOLATION_ID'], supervision_type='PAROLE', supervision_level='MED', state_supervision_contact_ids=['SUPERVISION_CONTACT_ID'], state_program_assignment_ids=['PROGRAM_ASSIGNMENT_ID']) ingest_info.state_supervision_periods.add( state_supervision_period_id='S_PERIOD_ID2', supervision_type='PAROLE') ingest_info.state_supervision_periods.add( state_supervision_period_id='S_PERIOD_ID3', state_assessment_ids=['ASSESSMENT_ID'], supervising_officer_id='AGENT_ID_PO', supervision_type='PROBATION', state_supervision_case_type_entry_ids=['CASE_TYPE_ID'], ) ingest_info.state_supervision_case_type_entries.add( state_supervision_case_type_entry_id='CASE_TYPE_ID', case_type='DOMESTIC_VIOLENCE') ingest_info.state_incarceration_periods.add( state_incarceration_period_id='I_PERIOD_ID', state_incarceration_incident_ids=['INCIDENT_ID'], state_parole_decision_ids=['DECISION_ID'], state_assessment_ids=['ASSESSMENT_ID'], state_program_assignment_ids=['PROGRAM_ASSIGNMENT_ID'], source_supervision_violation_response_id='RESPONSE_ID') ingest_info.state_supervision_violation_type_entries.add( state_supervision_violation_type_entry_id='VIOLATION_TYPE_ENTRY_ID', violation_type='FELONY', state_code='US_ND') ingest_info.state_supervision_violated_condition_entries.add( state_supervision_violated_condition_entry_id= 'VIOLATED_CONDITION_ENTRY_ID', condition='CURFEW', state_code='US_ND') ingest_info.state_supervision_violations.add( state_supervision_violation_id='VIOLATION_ID', state_supervision_violation_response_ids=['RESPONSE_ID'], state_supervision_violated_condition_entry_ids=[ 'VIOLATED_CONDITION_ENTRY_ID' ], state_supervision_violation_type_entry_ids=[ 'VIOLATION_TYPE_ENTRY_ID' ], ) ingest_info.state_supervision_violated_condition_entries.add( state_supervision_violated_condition_entry_id= 'VIOLATED_CONDITION_ENTRY_ID', condition='CURFEW', state_code='US_ND') ingest_info.state_supervision_violation_response_decision_entries.add( state_supervision_violation_response_decision_entry_id= 'VIOLATION_RESPONSE_DECISION_ENTRY_ID', decision='REVOCATION', revocation_type='REINCARCERATION', state_code='US_ND') ingest_info.state_supervision_violation_responses.add( state_supervision_violation_response_id='RESPONSE_ID', decision_agent_ids=['AGENT_ID_TERM'], state_supervision_violation_response_decision_entry_ids=[ 'VIOLATION_RESPONSE_DECISION_ENTRY_ID' ], response_type='CITATION') ingest_info.state_incarceration_incidents.add( state_incarceration_incident_id='INCIDENT_ID', incident_type='CONTRABAND', responding_officer_id='AGENT_ID2', state_incarceration_incident_outcome_ids=['INCIDENT_OUTCOME_ID'], ) ingest_info.state_incarceration_incident_outcomes.add( state_incarceration_incident_outcome_id='INCIDENT_OUTCOME_ID', outcome_type='GOOD_TIME_LOSS', date_effective='2/10/2018', hearing_date='2/6/2018', report_date='2/8/2018', state_code='US_ND', outcome_description='Good time', punishment_length_days='7', ) ingest_info.state_parole_decisions.add( state_parole_decision_id='DECISION_ID', decision_agent_ids=['AGENT_ID2', 'AGENT_ID3']) ingest_info.state_supervision_contacts.add( state_supervision_contact_id='SUPERVISION_CONTACT_ID', contacted_agent_id='AGENT_ID_PO') # Act result = self._convert_and_throw_on_errors(ingest_info, metadata) # Assert supervision_contact = StateSupervisionContact.new_with_defaults( external_id='SUPERVISION_CONTACT_ID', state_code='US_ND', contacted_agent=StateAgent.new_with_defaults( external_id='AGENT_ID_PO', state_code='US_ND', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT PAROLEY"}'), ) incident_outcome = StateIncarcerationIncidentOutcome.new_with_defaults( external_id='INCIDENT_OUTCOME_ID', outcome_type=StateIncarcerationIncidentOutcomeType.GOOD_TIME_LOSS, outcome_type_raw_text='GOOD_TIME_LOSS', date_effective=datetime.date(year=2018, month=2, day=10), hearing_date=datetime.date(year=2018, month=2, day=6), report_date=datetime.date(year=2018, month=2, day=8), state_code='US_ND', outcome_description='GOOD TIME', punishment_length_days=7, ) incident = StateIncarcerationIncident.new_with_defaults( external_id='INCIDENT_ID', state_code='US_ND', incident_type=StateIncarcerationIncidentType.CONTRABAND, incident_type_raw_text='CONTRABAND', responding_officer=StateAgent.new_with_defaults( external_id='AGENT_ID2', state_code='US_ND', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT HERNANDEZ"}', ), incarceration_incident_outcomes=[incident_outcome]) assessment = StateAssessment.new_with_defaults( external_id='ASSESSMENT_ID', state_code='US_ND', assessment_class=StateAssessmentClass.MENTAL_HEALTH, assessment_class_raw_text='MENTAL_HEALTH', conducting_agent=StateAgent.new_with_defaults( external_id='AGENT_ID1', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, state_code='US_ND', full_name='{"full_name": "AGENT WILLIAMS"}', )) program_assignment = StateProgramAssignment.new_with_defaults( external_id='PROGRAM_ASSIGNMENT_ID', state_code='US_ND', participation_status=StateProgramAssignmentParticipationStatus. DISCHARGED, participation_status_raw_text='DISCHARGED', referral_date=datetime.date(year=2019, month=2, day=10), start_date=datetime.date(year=2019, month=2, day=11), discharge_date=datetime.date(year=2019, month=2, day=12), program_id='PROGRAM_ID', program_location_id='PROGRAM_LOCATION_ID', discharge_reason=StateProgramAssignmentDischargeReason.COMPLETED, discharge_reason_raw_text='COMPLETED', referring_agent=StateAgent.new_with_defaults( external_id='AGENT_ID4', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, state_code='US_ND', full_name='{"full_name": "AGENT PO"}')) response = StateSupervisionViolationResponse.new_with_defaults( external_id='RESPONSE_ID', state_code='US_ND', response_type=StateSupervisionViolationResponseType.CITATION, response_type_raw_text='CITATION', decision_agents=[ StateAgent.new_with_defaults( external_id='AGENT_ID_TERM', state_code='US_ND', full_name='{"full_name": "AGENT TERMY"}', agent_type=StateAgentType.SUPERVISION_OFFICER, agent_type_raw_text='SUPERVISION_OFFICER', ) ], supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry. new_with_defaults( state_code='US_ND', decision=StateSupervisionViolationResponseDecision. REVOCATION, decision_raw_text='REVOCATION', revocation_type= StateSupervisionViolationResponseRevocationType. REINCARCERATION, revocation_type_raw_text='REINCARCERATION') ]) violation = StateSupervisionViolation.new_with_defaults( external_id='VIOLATION_ID', state_code='US_ND', supervision_violation_responses=[response], supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code='US_ND', violation_type=StateSupervisionViolationType.FELONY, violation_type_raw_text='FELONY', ) ], supervision_violated_conditions=[ StateSupervisionViolatedConditionEntry.new_with_defaults( state_code='US_ND', condition='CURFEW', ) ]) court_case = StateCourtCase.new_with_defaults( external_id='CASE_ID', state_code='US_ND', status=StateCourtCaseStatus.PRESENT_WITHOUT_INFO, court_type=StateCourtType.PRESENT_WITHOUT_INFO, judge=StateAgent.new_with_defaults( external_id='JUDGE_AGENT_ID_1', state_code='US_ND', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "JUDGE JUDY"}', )) charge_1 = StateCharge.new_with_defaults( external_id='CHARGE_ID1', classification_type=StateChargeClassificationType.MISDEMEANOR, classification_type_raw_text='M', classification_subtype='1', ncic_code='5006', description='FALSE STATEMENT', state_code='US_ND', status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case, bond=StateBond.new_with_defaults(external_id='BOND_ID', state_code='US_ND', status=BondStatus.POSTED, status_raw_text='POSTED')) charge_2 = StateCharge.new_with_defaults( external_id='CHARGE_ID2', classification_type=StateChargeClassificationType.MISDEMEANOR, classification_type_raw_text='M', classification_subtype='2', state_code='US_ND', status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case) charge_3 = StateCharge.new_with_defaults( external_id='CHARGE_ID3', state_code='US_ND', classification_type=StateChargeClassificationType.FELONY, classification_type_raw_text='F', classification_subtype='3', ncic_code='5006', description='OBSTRUCTION OF INVESTIGATION', status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case) incarceration_sentence_1 = StateIncarcerationSentence.new_with_defaults( external_id='INCARCERATION_SENTENCE_ID1', state_code='US_ND', status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType.STATE_PRISON, charges=[charge_1], incarceration_periods=[ StateIncarcerationPeriod.new_with_defaults( external_id='I_PERIOD_ID', status=StateIncarcerationPeriodStatus.PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType.STATE_PRISON, state_code='US_ND', incarceration_incidents=[incident], program_assignments=[program_assignment], parole_decisions=[ StateParoleDecision.new_with_defaults( external_id='DECISION_ID', state_code='US_ND', decision_agents=[ StateAgent.new_with_defaults( external_id='AGENT_ID2', agent_type=StateAgentType. PRESENT_WITHOUT_INFO, state_code='US_ND', full_name='{"full_name": "AGENT HERNANDEZ"}' ), StateAgent.new_with_defaults( external_id='AGENT_ID3', state_code='US_ND', agent_type=StateAgentType. PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT SMITH"}') ]) ], assessments=[assessment], source_supervision_violation_response=response, ) ]) incarceration_sentence_2 = StateIncarcerationSentence.new_with_defaults( external_id='INCARCERATION_SENTENCE_ID2', state_code='US_ND', status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType.STATE_PRISON, charges=[charge_2, charge_3], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id='S_PERIOD_ID3', status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_type=StateSupervisionType.PROBATION, supervision_type_raw_text='PROBATION', assessments=[assessment], supervising_officer=StateAgent.new_with_defaults( external_id='AGENT_ID_PO', state_code='US_ND', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "AGENT PAROLEY"}', ), case_type_entries=[ StateSupervisionCaseTypeEntry.new_with_defaults( case_type=StateSupervisionCaseType. DOMESTIC_VIOLENCE, case_type_raw_text='DOMESTIC_VIOLENCE', state_code='US_ND', external_id='CASE_TYPE_ID') ]) ]) expected_result = [ StatePerson.new_with_defaults( state_code='US_ND', external_ids=[ StatePersonExternalId.new_with_defaults( external_id='EXTERNAL_ID1', state_code='US_ND', id_type=US_ND_ELITE), StatePersonExternalId.new_with_defaults( external_id='EXTERNAL_ID2', state_code='US_ND', id_type=US_ND_SID) ], races=[ StatePersonRace(race=Race.WHITE, race_raw_text='WHITE', state_code='US_ND'), StatePersonRace(race=Race.OTHER, race_raw_text='OTHER', state_code='US_ND'), ], ethnicities=[ StatePersonEthnicity(ethnicity=Ethnicity.HISPANIC, ethnicity_raw_text='HISPANIC', state_code='US_ND') ], aliases=[ StatePersonAlias.new_with_defaults( full_name='{"full_name": "LONNY BREAUX"}', state_code='US_ND'), StatePersonAlias.new_with_defaults( full_name='{"full_name": "FRANK OCEAN"}', state_code='US_ND'), ], supervising_officer=StateAgent.new_with_defaults( external_id='AGENT_ID_SUPERVISING', state_code='US_ND', agent_type=StateAgentType.PRESENT_WITHOUT_INFO, full_name='{"full_name": "SUPERVISING AGENT"}'), assessments=[assessment], program_assignments=[program_assignment], sentence_groups=[ StateSentenceGroup.new_with_defaults( external_id='GROUP_ID1', status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_sentences=[ StateSupervisionSentence.new_with_defaults( external_id='SUPERVISION_SENTENCE_ID1', state_code='US_ND', status=StateSentenceStatus. PRESENT_WITHOUT_INFO, charges=[charge_1, charge_2], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id='S_PERIOD_ID1', status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, supervision_level=StateSupervisionLevel .MEDIUM, supervision_level_raw_text='MED', state_code='US_ND', supervision_type=StateSupervisionType. PAROLE, supervision_type_raw_text='PAROLE', supervision_violation_entries=[ violation ], program_assignments=[ program_assignment ], supervision_contacts=[ supervision_contact ], ) ]) ], incarceration_sentences=[ incarceration_sentence_1, incarceration_sentence_2 ]), StateSentenceGroup.new_with_defaults( external_id='GROUP_ID2', status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_sentences=[ StateSupervisionSentence.new_with_defaults( external_id='SUPERVISION_SENTENCE_ID2', state_code='US_ND', status=StateSentenceStatus. PRESENT_WITHOUT_INFO, charges=[charge_2], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id='S_PERIOD_ID2', status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_type=StateSupervisionType. PAROLE, supervision_type_raw_text='PAROLE', ) ]) ], fines=[ StateFine.new_with_defaults( external_id='FINE_ID', state_code='US_ND', status=StateFineStatus.PAID, status_raw_text='PAID') ]) ]) ] print("\n", expected_result, "\n\n\n", result) self.assertCountEqual(expected_result, result)
def test_moveViolationsOntoSupervisionPeriodsForPerson_violationNoLongerOverlaps( self): # Act sv_ss = StateSupervisionViolation.new_with_defaults( supervision_violation_id=_ID, state_code=_STATE_CODE, violation_date=_DATE_4) # This supervision period, which has already been written to the DB, has presumably been updated so that the # date range no longer overlaps with the attached violation (or the violation has been updated). sp_ss = StateSupervisionPeriod.new_with_defaults( supervision_period_id=_ID, external_id=_EXTERNAL_ID, state_code=_STATE_CODE, start_date=_DATE_1, termination_date=_DATE_3, supervision_violation_entries=[sv_ss]) ss = StateSupervisionSentence.new_with_defaults( supervision_sentence_id=_ID, external_id=_EXTERNAL_ID, state_code=_STATE_CODE, supervision_periods=[sp_ss]) sg = StateSentenceGroup.new_with_defaults(external_id=_EXTERNAL_ID, sentence_group_id=_ID, state_code=_STATE_CODE, supervision_sentences=[ss]) state_person = StatePerson.new_with_defaults(person_id=_ID, sentence_groups=[sg]) expected_sp_ss = attr.evolve(sp_ss, supervision_violation_entries=[]) expected_ss = attr.evolve(ss, supervision_periods=[expected_sp_ss]) expected_sg = attr.evolve(sg, supervision_sentences=[expected_ss]) expected_sv_ss = attr.evolve(sv_ss) expected_placeholder_sp = StateSupervisionPeriod.new_with_defaults( state_code=_STATE_CODE, status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, supervision_violation_entries=[expected_sv_ss]) expected_placeholder_ss = StateSupervisionSentence.new_with_defaults( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, supervision_periods=[expected_placeholder_sp]) expected_placeholder_sg = StateSentenceGroup.new_with_defaults( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, supervision_sentences=[expected_placeholder_ss]) expected_person = attr.evolve( state_person, sentence_groups=[expected_sg, expected_placeholder_sg]) # Act input_people = converter.convert_entity_people_to_schema_people( [state_person]) move_violations_onto_supervision_periods_for_person( input_people, _STATE_CODE) # Assert self.assert_people_match([expected_person], input_people)
def test_moveViolationsOntoSupervisionPeriodsForSentence(self): # Arrange sv_1 = StateSupervisionViolation.new_with_defaults( violation_date=_DATE_2) svr = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_3) sv_2 = StateSupervisionViolation.new_with_defaults( supervision_violation_responses=[svr]) sv_3 = StateSupervisionViolation.new_with_defaults( violation_date=_DATE_8) placeholder_sp_ss = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[sv_1, sv_3]) sp_ss = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID, start_date=_DATE_1, termination_date=_DATE_3) sp_2_ss = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID_2, start_date=_DATE_7) ss = StateSupervisionSentence.new_with_defaults( external_id=_EXTERNAL_ID, supervision_periods=[sp_ss, sp_2_ss, placeholder_sp_ss]) placeholder_sp_is = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[sv_2, sv_3]) sp_is = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID_3, start_date=_DATE_2, termination_date=_DATE_3) sp_2_is = StateSupervisionPeriod.new_with_defaults( external_id=_EXTERNAL_ID_4, start_date=_DATE_3, termination_date=_DATE_6) inc_s = StateIncarcerationSentence.new_with_defaults( external_id=_EXTERNAL_ID, supervision_periods=[sp_is, sp_2_is, placeholder_sp_is]) sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[inc_s], supervision_sentences=[ss]) state_person = StatePerson.new_with_defaults(sentence_groups=[sg]) expected_sv_1 = attr.evolve(sv_1) expected_svr_2 = attr.evolve(svr) expected_sv_2 = attr.evolve( sv_2, supervision_violation_responses=[expected_svr_2]) expected_sv_3 = attr.evolve(sv_3) expected_placeholder_sp_ss = attr.evolve( placeholder_sp_ss, supervision_violation_entries=[]) expected_sp_ss = attr.evolve( sp_ss, supervision_violation_entries=[expected_sv_1]) expected_sp_2_ss = attr.evolve( sp_2_ss, supervision_violation_entries=[expected_sv_3]) expected_ss = attr.evolve(ss, supervision_periods=[ expected_placeholder_sp_ss, expected_sp_ss, expected_sp_2_ss ]) expected_placeholder_sp_is = attr.evolve( placeholder_sp_is, supervision_violation_entries=[expected_sv_3]) expected_sp_is = attr.evolve(sp_is, supervision_violation_entries=[]) expected_sp_2_is = attr.evolve( sp_2_is, supervision_violation_entries=[expected_sv_2]) expected_inc_s = attr.evolve(inc_s, supervision_periods=[ expected_placeholder_sp_is, expected_sp_is, expected_sp_2_is ]) expected_sg = attr.evolve(sg, supervision_sentences=[expected_ss], incarceration_sentences=[expected_inc_s]) expected_person = attr.evolve(state_person, sentence_groups=[expected_sg]) # Act input_people = converter.convert_entity_people_to_schema_people( [state_person]) move_violations_onto_supervision_periods_for_sentence(input_people) # Assert self.assert_people_match([expected_person], input_people)
def test_get_violation_and_response_history_outside_lookback(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, ), ], ) # This is outside of the lookback window supervision_violation_response_before_look_back = ( StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=_DEFAULT_SSVR_ID, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, state_code="US_XX", response_date=datetime.date(2018, 7, 25), ) ) 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(2019, 1, 20), 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, ) violation_responses = [ supervision_violation_response_before_look_back, supervision_violation_response, ] end_date = datetime.date(2019, 9, 5) violation_history = violation_utils.get_violation_and_response_history( end_date, violation_responses, 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_us_nd_prepare_violation_responses_for_calculations_multiple_types( 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, 25), response_type=StateSupervisionViolationResponseType.PERMANENT_DECISION, ) duplicate_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, ), ], ) duplicate_ssvr = StateSupervisionViolationResponse.new_with_defaults( state_code=STATE_CODE, supervision_violation_response_id=123, supervision_violation=duplicate_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, duplicate_ssvr] ) ) expected_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, ), StateSupervisionViolationTypeEntry.new_with_defaults( state_code=STATE_CODE, violation_type=StateSupervisionViolationType.ABSCONDED, ), ], ) expected_response = attr.evolve(ssvr, supervision_violation=expected_violation) self.assertEqual([expected_response], prepared_responses)
def test_get_violation_and_response_history_with_us_pa_subtype_multiple_types(self): supervision_violation_1 = StateSupervisionViolation.new_with_defaults( supervision_violation_id=12345, 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.TECHNICAL, violation_type_raw_text="M05", # MED_TECH ), ], ) supervision_violation_2 = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123456, 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.TECHNICAL, violation_type_raw_text="M05", # MED_TECH ), ], ) supervision_violation_3 = StateSupervisionViolation.new_with_defaults( supervision_violation_id=1234567, 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.TECHNICAL, violation_type_raw_text="M14", # SUBSTANCE_ABUSE ), ], ) supervision_violation_response_1 = 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_1, ) supervision_violation_response_2 = ( StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=1234567, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, state_code="US_PA", response_date=datetime.date(2009, 1, 6), supervision_violation=supervision_violation_2, ) ) supervision_violation_response_3 = ( StateSupervisionViolationResponse.new_with_defaults( supervision_violation_response_id=1234567, response_type=StateSupervisionViolationResponseType.VIOLATION_REPORT, state_code="US_PA", response_date=datetime.date(2009, 1, 5), supervision_violation=supervision_violation_3, ) ) revocation_date = datetime.date(2009, 2, 13) violation_history = violation_utils.get_violation_and_response_history( revocation_date, [ supervision_violation_response_3, supervision_violation_response_2, supervision_violation_response_1, ], UsPaViolationDelegate(), ) 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=3, violation_history_description="1subs;2med_tech", violation_type_frequency_counter=[ ["SUBSTANCE_ABUSE"], ["MED_TECH"], ["MED_TECH"], ], ) self.assertEqual(expected_output, violation_history)
def testConvert_FullIngestInfo(self): # Arrange metadata = IngestMetadata('us_nd', _JURISDICTION_ID, _INGEST_TIME, system_level=SystemLevel.STATE) ingest_info = IngestInfo() ingest_info.state_agents.add(state_agent_id='AGENT_ID1', full_name='AGENT WILLIAMS') ingest_info.state_agents.add(state_agent_id='AGENT_ID2', full_name='AGENT HERNANDEZ') ingest_info.state_agents.add(state_agent_id='AGENT_ID3', full_name='AGENT SMITH') ingest_info.state_agents.add(state_agent_id='JUDGE_AGENT_ID_1', full_name='JUDGE JUDY') # We expect the external_ids coming in to have the format # [type]:[external_id] ii_person_external_id_1 = US_ND_ELITE + ':' + 'EXTERNAL_ID1' ii_person_external_id_2 = US_ND_SID + ':' + 'EXTERNAL_ID2' ingest_info.state_people.add( state_person_id='PERSON_ID', state_person_race_ids=['RACE_ID1', 'RACE_ID2'], state_person_ethnicity_ids=['ETHNICITY_ID'], state_alias_ids=['ALIAS_ID1', 'ALIAS_ID2'], state_person_external_ids_ids=[ ii_person_external_id_1, ii_person_external_id_2 ], state_assessment_ids=['ASSESSMENT_ID'], state_sentence_group_ids=['GROUP_ID1', 'GROUP_ID2']) ingest_info.state_person_races.add( state_person_race_id='RACE_ID1', race='WHITE', ) ingest_info.state_person_races.add(state_person_race_id='RACE_ID2', race='OTHER') ingest_info.state_person_ethnicities.add( state_person_ethnicity_id='ETHNICITY_ID', ethnicity='HISPANIC') ingest_info.state_aliases.add(state_alias_id='ALIAS_ID1', full_name='LONNY BREAUX') ingest_info.state_aliases.add(state_alias_id='ALIAS_ID2', full_name='FRANK OCEAN') ingest_info.state_person_external_ids.add( state_person_external_id_id=ii_person_external_id_1, id_type=US_ND_ELITE) ingest_info.state_person_external_ids.add( state_person_external_id_id=ii_person_external_id_2, id_type=US_ND_SID) ingest_info.state_assessments.add(state_assessment_id='ASSESSMENT_ID', assessment_class='MENTAL_HEALTH', conducting_agent_id='AGENT_ID1') ingest_info.state_sentence_groups.add( state_sentence_group_id='GROUP_ID1', state_supervision_sentence_ids=['SUPERVISION_SENTENCE_ID1'], state_incarceration_sentence_ids=[ 'INCARCERATION_SENTENCE_ID1', 'INCARCERATION_SENTENCE_ID2' ]) ingest_info.state_sentence_groups.add( state_sentence_group_id='GROUP_ID2', state_supervision_sentence_ids=['SUPERVISION_SENTENCE_ID2'], state_fine_ids=['FINE_ID']) ingest_info.state_fines.add(state_fine_id='FINE_ID', status='PAID') ingest_info.state_supervision_sentences.add( state_supervision_sentence_id='SUPERVISION_SENTENCE_ID1', state_charge_ids=['CHARGE_ID1', 'CHARGE_ID2'], state_supervision_period_ids=['S_PERIOD_ID1']) ingest_info.state_supervision_sentences.add( state_supervision_sentence_id='SUPERVISION_SENTENCE_ID2', state_charge_ids=['CHARGE_ID2'], state_supervision_period_ids=['S_PERIOD_ID2']) ingest_info.state_incarceration_sentences.add( state_incarceration_sentence_id='INCARCERATION_SENTENCE_ID1', state_charge_ids=['CHARGE_ID1'], state_incarceration_period_ids=['I_PERIOD_ID']) ingest_info.state_incarceration_sentences.add( state_incarceration_sentence_id='INCARCERATION_SENTENCE_ID2', state_charge_ids=['CHARGE_ID2', 'CHARGE_ID3'], state_supervision_period_ids=['S_PERIOD_ID3']) ingest_info.state_charges.add( state_charge_id='CHARGE_ID1', state_court_case_id='CASE_ID', state_bond_id='BOND_ID', classification_type='M', classification_subtype='1', ) ingest_info.state_charges.add( state_charge_id='CHARGE_ID2', state_court_case_id='CASE_ID', classification_type='M', classification_subtype='2', ) ingest_info.state_charges.add(state_charge_id='CHARGE_ID3', state_court_case_id='CASE_ID', classification_type='F', classification_subtype='3') ingest_info.state_court_cases.add( state_court_case_id='CASE_ID', judge_id='JUDGE_AGENT_ID_1', ) ingest_info.state_bonds.add(state_bond_id='BOND_ID', status='POSTED') ingest_info.state_supervision_periods.add( state_supervision_period_id='S_PERIOD_ID1', state_supervision_violation_ids=['VIOLATION_ID'], supervision_type='PAROLE', supervision_level='MED') ingest_info.state_supervision_periods.add( state_supervision_period_id='S_PERIOD_ID2', supervision_type='PAROLE') ingest_info.state_supervision_periods.add( state_supervision_period_id='S_PERIOD_ID3', state_assessment_ids=['ASSESSMENT_ID'], supervision_type='PROBATION') ingest_info.state_incarceration_periods.add( state_incarceration_period_id='I_PERIOD_ID', state_incarceration_incident_ids=['INCIDENT_ID'], state_parole_decision_ids=['DECISION_ID'], state_assessment_ids=['ASSESSMENT_ID'], ) ingest_info.state_supervision_violations.add( state_supervision_violation_id='VIOLATION_ID', state_supervision_violation_response_ids=['RESPONSE_ID']) ingest_info.state_supervision_violation_responses.add( state_supervision_violation_response_id='RESPONSE_ID', response_type='CITATION') ingest_info.state_incarceration_incidents.add( state_incarceration_incident_id='INCIDENT_ID', incident_type='CONTRABAND', responding_officer_id='AGENT_ID2', state_incarceration_incident_outcome_ids=['INCIDENT_OUTCOME_ID'], ) ingest_info.state_incarceration_incident_outcomes.add( state_incarceration_incident_outcome_id='INCIDENT_OUTCOME_ID', outcome_type='GOOD_TIME_LOSS', date_effective='2/10/2018', state_code='US_ND', outcome_description='Good time', punishment_length_days='7', ) ingest_info.state_parole_decisions.add( state_parole_decision_id='DECISION_ID', decision_agent_ids=['AGENT_ID2', 'AGENT_ID3']) # Act result = self._convert_and_throw_on_errors(ingest_info, metadata) # Assert incident_outcome = StateIncarcerationIncidentOutcome.new_with_defaults( external_id='INCIDENT_OUTCOME_ID', outcome_type=StateIncarcerationIncidentOutcomeType.GOOD_TIME_LOSS, outcome_type_raw_text='GOOD_TIME_LOSS', date_effective=datetime.date(year=2018, month=2, day=10), state_code='US_ND', outcome_description='GOOD TIME', punishment_length_days=7, ) incident = StateIncarcerationIncident.new_with_defaults( external_id='INCIDENT_ID', state_code='US_ND', incident_type=StateIncarcerationIncidentType.CONTRABAND, incident_type_raw_text='CONTRABAND', responding_officer=StateAgent.new_with_defaults( external_id='AGENT_ID2', state_code='US_ND', full_name='{"full_name": "AGENT HERNANDEZ"}', ), incarceration_incident_outcomes=[incident_outcome]) assessment = StateAssessment.new_with_defaults( external_id='ASSESSMENT_ID', state_code='US_ND', assessment_class=StateAssessmentClass.MENTAL_HEALTH, assessment_class_raw_text='MENTAL_HEALTH', conducting_agent=StateAgent.new_with_defaults( external_id='AGENT_ID1', state_code='US_ND', full_name='{"full_name": "AGENT WILLIAMS"}', )) violation = StateSupervisionViolation.new_with_defaults( external_id='VIOLATION_ID', state_code='US_ND', supervision_violation_responses=[ StateSupervisionViolationResponse.new_with_defaults( external_id='RESPONSE_ID', state_code='US_ND', response_type=StateSupervisionViolationResponseType. CITATION, response_type_raw_text='CITATION') ]) court_case = StateCourtCase.new_with_defaults( external_id='CASE_ID', state_code='US_ND', status=StateCourtCaseStatus.PRESENT_WITHOUT_INFO, court_type=StateCourtType.PRESENT_WITHOUT_INFO, judge=StateAgent.new_with_defaults( external_id='JUDGE_AGENT_ID_1', state_code='US_ND', full_name='{"full_name": "JUDGE JUDY"}', )) charge_1 = StateCharge.new_with_defaults( external_id='CHARGE_ID1', classification_type=StateChargeClassificationType.MISDEMEANOR, classification_type_raw_text='M', classification_subtype='1', state_code='US_ND', status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case, bond=StateBond.new_with_defaults(external_id='BOND_ID', state_code='US_ND', status=BondStatus.POSTED, status_raw_text='POSTED')) charge_2 = StateCharge.new_with_defaults( external_id='CHARGE_ID2', classification_type=StateChargeClassificationType.MISDEMEANOR, classification_type_raw_text='M', classification_subtype='2', state_code='US_ND', status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case) charge_3 = StateCharge.new_with_defaults( external_id='CHARGE_ID3', state_code='US_ND', classification_type=StateChargeClassificationType.FELONY, classification_type_raw_text='F', classification_subtype='3', status=ChargeStatus.PRESENT_WITHOUT_INFO, court_case=court_case) expected_result = [ StatePerson.new_with_defaults( external_ids=[ StatePersonExternalId.new_with_defaults( external_id='EXTERNAL_ID1', state_code='US_ND', id_type=US_ND_ELITE), StatePersonExternalId.new_with_defaults( external_id='EXTERNAL_ID2', state_code='US_ND', id_type=US_ND_SID) ], races=[ StatePersonRace(race=Race.WHITE, race_raw_text='WHITE', state_code='US_ND'), StatePersonRace(race=Race.OTHER, race_raw_text='OTHER', state_code='US_ND'), ], ethnicities=[ StatePersonEthnicity(ethnicity=Ethnicity.HISPANIC, ethnicity_raw_text='HISPANIC', state_code='US_ND') ], aliases=[ StatePersonAlias.new_with_defaults( full_name='{"full_name": "LONNY BREAUX"}', state_code='US_ND'), StatePersonAlias.new_with_defaults( full_name='{"full_name": "FRANK OCEAN"}', state_code='US_ND'), ], assessments=[assessment], sentence_groups=[ StateSentenceGroup.new_with_defaults( external_id='GROUP_ID1', status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_sentences=[ StateSupervisionSentence.new_with_defaults( external_id='SUPERVISION_SENTENCE_ID1', state_code='US_ND', status=StateSentenceStatus. PRESENT_WITHOUT_INFO, charges=[charge_1, charge_2], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id='S_PERIOD_ID1', status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, supervision_level=StateSupervisionLevel .MEDIUM, supervision_level_raw_text='MED', state_code='US_ND', supervision_type=StateSupervisionType. PAROLE, supervision_type_raw_text='PAROLE', supervision_violations=[violation]) ]) ], incarceration_sentences=[ StateIncarcerationSentence.new_with_defaults( external_id='INCARCERATION_SENTENCE_ID1', state_code='US_ND', status=StateSentenceStatus. PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType. STATE_PRISON, charges=[charge_1], incarceration_periods=[ StateIncarcerationPeriod.new_with_defaults( external_id='I_PERIOD_ID', status=StateIncarcerationPeriodStatus. PRESENT_WITHOUT_INFO, incarceration_type= StateIncarcerationType.STATE_PRISON, state_code='US_ND', incarceration_incidents=[incident], parole_decisions=[ StateParoleDecision. new_with_defaults( external_id='DECISION_ID', state_code='US_ND', decision_agents=[ StateAgent. new_with_defaults( external_id='AGENT_ID2', state_code='US_ND', full_name= '{"full_name": ' '"AGENT HERNANDEZ"}'), StateAgent. new_with_defaults( external_id='AGENT_ID3', state_code='US_ND', full_name= '{"full_name": ' '"AGENT SMITH"}') ]) ], assessments=[assessment], ) ]), StateIncarcerationSentence.new_with_defaults( external_id='INCARCERATION_SENTENCE_ID2', state_code='US_ND', status=StateSentenceStatus. PRESENT_WITHOUT_INFO, incarceration_type=StateIncarcerationType. STATE_PRISON, charges=[charge_2, charge_3], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id='S_PERIOD_ID3', status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_type=StateSupervisionType. PROBATION, supervision_type_raw_text='PROBATION', assessments=[assessment]) ]) ]), StateSentenceGroup.new_with_defaults( external_id='GROUP_ID2', status=StateSentenceStatus.PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_sentences=[ StateSupervisionSentence.new_with_defaults( external_id='SUPERVISION_SENTENCE_ID2', state_code='US_ND', status=StateSentenceStatus. PRESENT_WITHOUT_INFO, charges=[charge_2], supervision_periods=[ StateSupervisionPeriod.new_with_defaults( external_id='S_PERIOD_ID2', status=StateSupervisionPeriodStatus. PRESENT_WITHOUT_INFO, state_code='US_ND', supervision_type=StateSupervisionType. PAROLE, supervision_type_raw_text='PAROLE', ) ]) ], fines=[ StateFine.new_with_defaults( external_id='FINE_ID', state_code='US_ND', status=StateFineStatus.PAID, status_raw_text='PAID') ]) ]) ] print(expected_result, "\n\n\n", result) self.assertEqual(result, expected_result)
def test_associateSvrsWithIps(self): # Arrange ip_1 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_1, admission_reason= StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION) ip_2 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_2, admission_reason= StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION) placeholder_is = StateIncarcerationSentence.new_with_defaults( incarceration_periods=[ip_1, ip_2]) svr_1 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_1 - datetime.timedelta(days=1), revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) svr_2 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_2 + datetime.timedelta(days=1), revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) svr_3 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_2 + datetime.timedelta(days=30), revocation_type=StateSupervisionViolationResponseRevocationType. RETURN_TO_SUPERVISION) placeholder_sv = StateSupervisionViolation.new_with_defaults( supervision_violation_responses=[svr_1, svr_2, svr_3]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[placeholder_sv]) placeholder_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[placeholder_sp]) placeholder_sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss]) placeholder_person = StatePerson.new_with_defaults( sentence_groups=[placeholder_sg]) external_id = StatePersonExternalId.new_with_defaults( external_id=_EXTERNAL_ID) person_without_revocation = StatePerson.new_with_defaults( external_ids=[external_id]) expected_svr_1 = attr.evolve(svr_1) expected_svr_2 = attr.evolve(svr_2) expected_svr_3 = attr.evolve(svr_3) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1, expected_svr_2, expected_svr_3]) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violation_entries=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve( ip_1, source_supervision_violation_response=expected_svr_1) expected_ip_2 = attr.evolve( ip_2, source_supervision_violation_response=expected_svr_2) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is]) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) expected_person_without_revocation = attr.evolve( person_without_revocation) # Act input_people = \ converter.convert_entity_people_to_schema_people( [person_without_revocation, placeholder_person]) associate_revocation_svrs_with_ips(input_people) # Assert self.assert_people_match( [expected_person_without_revocation, expected_placeholder_person], input_people)
def testSetViolationsResponsesOntoViolationsNoResponses(self) -> None: """Tests the SetViolationResponsesOntoViolations is yielded even when there are no responses.""" supervision_violation_id = 123 supervision_violation_response_id = 234 hydrated_violation_response = StateSupervisionViolationResponse.new_with_defaults( state_code="US_XX", supervision_violation_response_id=supervision_violation_response_id, response_type=StateSupervisionViolationResponseType.CITATION, response_date=date(2021, 2, 1), supervision_violation_response_decisions=[ StateSupervisionViolationResponseDecisionEntry( state_code="US_XX", decision=StateSupervisionViolationResponseDecision. SPECIALIZED_COURT, ) ], ) hydrated_violation = StateSupervisionViolation.new_with_defaults( state_code="US_XX", supervision_violation_id=supervision_violation_id, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ) ], supervision_violation_responses=[], ) expected_violation = StateSupervisionViolation.new_with_defaults( state_code="US_XX", supervision_violation_id=supervision_violation_id, supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_XX", violation_type=StateSupervisionViolationType.FELONY, ) ], supervision_violation_responses=[], ) supervision_violations_and_responses = { "violations": [hydrated_violation], "violation_responses": [hydrated_violation_response], } test_pipeline = TestPipeline() output = ( test_pipeline | beam.Create([(12345, supervision_violations_and_responses)]) | "Set Supervision Violation Response on Supervision Violation" >> beam.ParDo( entity_hydration_utils.SetViolationResponsesOntoViolations())) assert_that(output, equal_to([(12345, expected_violation)])) test_pipeline.run()
def test_get_revocation_details_no_revocation_type_us_nd(self): supervision_period = StateSupervisionPeriod.new_with_defaults( supervision_period_id=_DEFAULT_SUPERVISION_PERIOD_ID, status=StateSupervisionPeriodStatus.TERMINATED, state_code="US_ND", start_date=date(2018, 3, 5), termination_date=date(2018, 5, 19), supervision_type=StateSupervisionType.PROBATION, supervision_site="X", ) supervision_violation = StateSupervisionViolation.new_with_defaults( supervision_violation_id=123455, state_code="US_ND", violation_date=date(2018, 4, 20), supervision_violation_types=[ StateSupervisionViolationTypeEntry.new_with_defaults( state_code="US_ND", violation_type=StateSupervisionViolationType.MISDEMEANOR, ) ], ) source_supervision_violation_response = ( StateSupervisionViolationResponse.new_with_defaults( state_code="US_ND", supervision_violation_response_id=_DEFAULT_SSVR_ID, response_date=date(2018, 4, 23), revocation_type=None, supervision_violation=supervision_violation, )) incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=111, external_id="ip1", status=StateIncarcerationPeriodStatus.IN_CUSTODY, state_code="US_ND", admission_date=date(2018, 5, 25), admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, source_supervision_violation_response= source_supervision_violation_response, ) revocation_details = self._test_get_revocation_details( incarceration_period, supervision_period) self.assertEqual( RevocationDetails( revocation_type=StateSupervisionViolationResponseRevocationType .REINCARCERATION, revocation_type_subtype=None, source_violation_type=StateSupervisionViolationType. MISDEMEANOR, level_1_supervision_location_external_id=supervision_period. supervision_site, level_2_supervision_location_external_id=None, supervising_officer_external_id= DEFAULT_SUPERVISION_PERIOD_AGENT_ASSOCIATIONS.get( supervision_period.supervision_period_id).get( "agent_external_id"), ), revocation_details, )
def test_associateSvrsWithIps_dontAssociateTheSameSvr(self): # Arrange svr_1 = StateSupervisionViolationResponse.new_with_defaults( response_date=_DATE_1, revocation_type=StateSupervisionViolationResponseRevocationType. REINCARCERATION) placeholder_sv = StateSupervisionViolation.new_with_defaults( supervision_violation_responses=[svr_1]) placeholder_sp = StateSupervisionPeriod.new_with_defaults( supervision_violation_entries=[placeholder_sv]) placeholder_ss = StateSupervisionSentence.new_with_defaults( supervision_periods=[placeholder_sp]) ip_1 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_2, admission_reason= StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION) ip_2 = StateIncarcerationPeriod.new_with_defaults( admission_date=_DATE_4, admission_reason= StateIncarcerationPeriodAdmissionReason.PROBATION_REVOCATION) placeholder_is = StateIncarcerationSentence.new_with_defaults( incarceration_periods=[ip_1, ip_2]) placeholder_sg = StateSentenceGroup.new_with_defaults( incarceration_sentences=[placeholder_is], supervision_sentences=[placeholder_ss]) placeholder_person = StatePerson.new_with_defaults( sentence_groups=[placeholder_sg]) expected_svr_1 = attr.evolve(svr_1) expected_placeholder_sv = attr.evolve( placeholder_sv, supervision_violation_responses=[expected_svr_1]) expected_placeholder_sp = attr.evolve( placeholder_sp, supervision_violation_entries=[expected_placeholder_sv]) expected_placeholder_ss = attr.evolve( placeholder_ss, supervision_periods=[expected_placeholder_sp]) expected_ip_1 = attr.evolve( ip_1, source_supervision_violation_response=expected_svr_1) expected_ip_2 = attr.evolve(ip_2) expected_placeholder_is = attr.evolve( placeholder_is, incarceration_periods=[expected_ip_1, expected_ip_2]) expected_placeholder_sg = attr.evolve( placeholder_sg, supervision_sentences=[expected_placeholder_ss], incarceration_sentences=[expected_placeholder_is]) expected_placeholder_person = attr.evolve( placeholder_person, sentence_groups=[expected_placeholder_sg]) # Act input_people = \ converter.convert_entity_people_to_schema_people( [placeholder_person]) associate_revocation_svrs_with_ips(input_people) # Assert self.assert_people_match( [expected_placeholder_person], input_people)
def test_removeSeosFromViolationIds(self) -> None: svr = schema.StateSupervisionViolationResponse( state_code=_STATE_CODE, external_id="DOC-CYC-VSN1-SEO-FSO") sv = schema.StateSupervisionViolation( state_code=_STATE_CODE, external_id="DOC-CYC-VSN1-SEO-FSO", supervision_violation_responses=[svr], ) svr_2 = schema.StateSupervisionViolationResponse( state_code=_STATE_CODE, external_id="DOC-CYC-VSN1-SEO-FSO") sv_2 = schema.StateSupervisionViolation( state_code=_STATE_CODE, external_id="DOC-CYC-VSN1-SEO-FSO", supervision_violation_responses=[svr_2], ) sp = schema.StateSupervisionPeriod( state_code=_STATE_CODE, supervision_violation_entries=[sv, sv_2], status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) ss = schema.StateSupervisionSentence( state_code=_STATE_CODE, supervision_periods=[sp], status=StateSentenceStatus.PRESENT_WITHOUT_INFO, ) sg = schema.StateSentenceGroup( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, supervision_sentences=[ss], ) p = schema.StatePerson(state_code=_STATE_CODE, sentence_groups=[sg]) expected_svr = StateSupervisionViolationResponse.new_with_defaults( state_code=_STATE_CODE, external_id="DOC-CYC-VSN1") expected_sv = StateSupervisionViolation.new_with_defaults( state_code=_STATE_CODE, external_id="DOC-CYC-VSN1", supervision_violation_responses=[expected_svr], ) expected_svr_2 = attr.evolve(expected_svr) expected_sv_2 = attr.evolve( expected_sv, supervision_violation_responses=[expected_svr_2]) expected_sp = StateSupervisionPeriod.new_with_defaults( state_code=_STATE_CODE, supervision_violation_entries=[expected_sv, expected_sv_2], status=StateSupervisionPeriodStatus.PRESENT_WITHOUT_INFO, ) expected_ss = StateSupervisionSentence.new_with_defaults( state_code=_STATE_CODE, supervision_periods=[expected_sp], status=StateSentenceStatus.PRESENT_WITHOUT_INFO, ) expected_sg = StateSentenceGroup.new_with_defaults( state_code=_STATE_CODE, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, supervision_sentences=[expected_ss], ) expected_p = StatePerson.new_with_defaults( state_code=_STATE_CODE, sentence_groups=[expected_sg]) remove_suffix_from_violation_ids([p]) self.assertEqual(expected_p, self.to_entity(p))