def test_convert_ingest_info_one_charge_to_one_bond( self, mock_create: Mock ) -> None: mock_create.side_effect = self._create_generated_id info = ingest_info.IngestInfo() person = info.create_person() person.person_id = "id1" booking = person.create_booking() booking.booking_id = "id1" charge = booking.create_charge() charge.charge_id = "id1" bond1 = charge.create_bond() bond1.amount = "$1" charge = booking.create_charge() charge.charge_id = "id2" bond2 = charge.create_bond() bond2.amount = "$1" expected_proto = ingest_info_pb2.IngestInfo() proto_person = expected_proto.people.add() proto_person.person_id = "id1" proto_person.booking_ids.append("id1") proto_booking = expected_proto.bookings.add() proto_booking.booking_id = "id1" proto_booking.charge_ids.extend(["id1", "id2"]) proto_charge = expected_proto.charges.add() proto_charge.charge_id = "id1" proto_bond1 = expected_proto.bonds.add() proto_bond1.amount = "$1" proto_bond1.bond_id = "1_GENERATE" proto_charge.bond_id = proto_bond1.bond_id proto_charge = expected_proto.charges.add() proto_charge.charge_id = "id2" proto_bond2 = expected_proto.bonds.add() proto_bond2.amount = "$1" proto_bond2.bond_id = "2_GENERATE" proto_charge.bond_id = proto_bond2.bond_id proto = serialization.convert_ingest_info_to_proto(info) assert expected_proto == proto info_back = serialization.convert_proto_to_ingest_info(proto) assert info_back == info
def test_convert_ingest_info_one_charge_to_one_bond(self, mock_create): mock_create.side_effect = self._create_generated_id info = ingest_info.IngestInfo() person = info.create_person() person.person_id = 'id1' booking = person.create_booking() booking.booking_id = 'id1' charge = booking.create_charge() charge.charge_id = 'id1' bond1 = charge.create_bond() bond1.amount = '$1' charge = booking.create_charge() charge.charge_id = 'id2' bond2 = charge.create_bond() bond2.amount = '$1' expected_proto = ingest_info_pb2.IngestInfo() person = expected_proto.people.add() person.person_id = 'id1' person.booking_ids.append('id1') booking = expected_proto.bookings.add() booking.booking_id = 'id1' booking.charge_ids.extend(['id1', 'id2']) charge = expected_proto.charges.add() charge.charge_id = 'id1' proto_bond1 = expected_proto.bonds.add() proto_bond1.amount = '$1' proto_bond1.bond_id = '1_GENERATE' charge.bond_id = proto_bond1.bond_id charge = expected_proto.charges.add() charge.charge_id = 'id2' proto_bond2 = expected_proto.bonds.add() proto_bond2.amount = '$1' proto_bond2.bond_id = '2_GENERATE' charge.bond_id = proto_bond2.bond_id proto = ingest_utils.convert_ingest_info_to_proto(info) assert expected_proto == proto info_back = ingest_utils.convert_proto_to_ingest_info(proto) assert info_back == info
def test_convert_ingest_info_id_is_generated(self, mock_create): mock_create.side_effect = self._create_generated_id info = ingest_info.IngestInfo() person = info.create_person() person.surname = "testname" person.create_booking() expected_proto = ingest_info_pb2.IngestInfo() proto_person = expected_proto.people.add() proto_person.surname = "testname" proto_person.person_id = "1_GENERATE" proto_booking = expected_proto.bookings.add() proto_booking.booking_id = "2_GENERATE" proto_person.booking_ids.append(proto_booking.booking_id) proto = ingest_utils.convert_ingest_info_to_proto(info) assert proto == expected_proto info_back = ingest_utils.convert_proto_to_ingest_info(proto) assert info_back == info
def test_convert_ingest_info_many_charge_to_one_bond(self, mock_create): mock_create.side_effect = self._create_generated_id info = ingest_info.IngestInfo() person = info.create_person() person.person_id = "id1" booking = person.create_booking() booking.booking_id = "id1" charge = booking.create_charge() charge.charge_id = "id1" bond1 = charge.create_bond() bond1.amount = "$1" charge = booking.create_charge() charge.charge_id = "id2" charge.bond = bond1 expected_proto = ingest_info_pb2.IngestInfo() person = expected_proto.people.add() person.person_id = "id1" person.booking_ids.append("id1") booking = expected_proto.bookings.add() booking.booking_id = "id1" booking.charge_ids.extend(["id1", "id2"]) charge = expected_proto.charges.add() charge.charge_id = "id1" proto_bond = expected_proto.bonds.add() proto_bond.amount = "$1" proto_bond.bond_id = "1_GENERATE" charge.bond_id = proto_bond.bond_id charge = expected_proto.charges.add() charge.charge_id = "id2" charge.bond_id = proto_bond.bond_id proto = ingest_utils.convert_ingest_info_to_proto(info) assert len(proto.bonds) == 1 assert expected_proto == proto info_back = ingest_utils.convert_proto_to_ingest_info(proto) assert info_back == info
def test_convert_ingest_info_id_is_not_generated(self): info = ingest_info.IngestInfo() person = info.create_person() person.person_id = "id1" person.surname = "testname" booking = person.create_booking() booking.booking_id = "id2" booking.admission_date = "testdate" expected_proto = ingest_info_pb2.IngestInfo() person = expected_proto.people.add() person.person_id = "id1" person.surname = "testname" person.booking_ids.append("id2") booking = expected_proto.bookings.add() booking.booking_id = "id2" booking.admission_date = "testdate" proto = ingest_utils.convert_ingest_info_to_proto(info) assert expected_proto == proto info_back = ingest_utils.convert_proto_to_ingest_info(proto) assert info_back == info
def test_convert_ingest_info_state_entities(self): # Arrange Python ingest info info = ingest_info.IngestInfo() person = info.create_state_person() person.state_person_id = "person1" person.surname = "testname" race = person.create_state_person_race() race.state_person_race_id = "race1" race.race = "white" ethnicity = person.create_state_person_ethnicity() ethnicity.state_person_ethnicity_id = "ethnicity1" ethnicity.ethnicity = "non-hispanic" external_id = person.create_state_person_external_id() external_id.state_person_external_id_id = "external_id1" external_id.id_type = "contrived" alias = person.create_state_alias() alias.state_alias_id = "alias1" alias.surname = "testerson" assessment = person.create_state_assessment() assessment.state_assessment_id = "assessment1" assessment.assessment_score = "42" supervising_officer = person.create_state_agent() supervising_officer.state_agent_id = "supervising_officer1" supervising_officer.full_name = "Officer Supervising" assessment_agent = assessment.create_state_agent() assessment_agent.state_agent_id = "agent1" assessment_agent.full_name = "Officer Jones" program_assignment = person.create_state_program_assignment() program_assignment.state_program_assignment_id = "assignment1" program_assignment.program_id = "program_id1" program_assignment_agent = program_assignment.create_state_agent() program_assignment_agent.state_agent_id = "program_agent1" program_assignment_agent.full_name = "Officer Program" group = person.create_state_sentence_group() group.state_sentence_group_id = "group1" fine = group.create_state_fine() fine.state_fine_id = "fine1" incarceration_sentence = group.create_state_incarceration_sentence() incarceration_sentence.state_incarceration_sentence_id = "is1" early_discharge1 = incarceration_sentence.create_state_early_discharge() early_discharge1.state_early_discharge_id = "early_discharge1" charge1 = incarceration_sentence.create_state_charge() charge1.state_charge_id = "charge1" charge1.classification_type = "F" incarceration_period = ( incarceration_sentence.create_state_incarceration_period() ) incarceration_period.state_incarceration_period_id = "ip1" incarceration_period.status = "IN_CUSTODY" incarceration_period.specialized_purpose_for_incarceration = ( "SHOCK INCARCERATION" ) incarceration_period.state_program_assignments = [program_assignment] incident = incarceration_period.create_state_incarceration_incident() incident.state_incarceration_incident_id = "incident1" incident.incident_type = "FISTICUFFS" incident_outcome = incident.create_state_incarceration_incident_outcome() incident_outcome.state_incarceration_incident_outcome_id = "incident1-1" incident_outcome.outcome_type = "FINE" incident_agent = incident.create_state_agent() incident_agent.state_agent_id = "agent2" incident_agent.full_name = "Officer Thompson" decision = incarceration_period.create_state_parole_decision() decision.state_parole_decision_id = "decision1" decision_agent = decision.create_state_agent() decision_agent.state_agent_id = "agent3" decision_agent.full_name = "Officer Barkley" supervision_sentence = group.create_state_supervision_sentence() supervision_sentence.state_supervision_sentence_id = "ss1" early_discharge2 = supervision_sentence.create_state_early_discharge() early_discharge2.state_early_discharge_id = "early_discharge2" charge2 = supervision_sentence.create_state_charge() charge2.state_charge_id = "charge2" charge2.classification_type = "M" supervision_period = supervision_sentence.create_state_supervision_period() supervision_period.state_supervision_period_id = "sp1" supervision_period.status = "TERMINATED" supervision_period_agent = supervision_period.create_state_agent() supervision_period_agent.state_agent_id = "agentPO" supervision_period_agent.full_name = "Officer Paroley" supervision_period.state_program_assignments = [program_assignment] supervision_case_type_entry = ( supervision_period.create_state_supervision_case_type_entry() ) supervision_case_type_entry.case_type = "case_type" supervision_case_type_entry.state_supervision_case_type_entry_id = ( "case_type_entry_id" ) supervision_contact = supervision_period.create_state_supervision_contact() supervision_contact.state_supervision_contact_id = "supervision_contact_id" supervision_contact.contact_type = "contact_type" supervision_contacted_agent = supervision_contact.create_state_agent() supervision_contacted_agent.state_agent_id = "agentPO" supervision_contacted_agent.full_name = "Officer Paroley" violation = supervision_period.create_state_supervision_violation() violation.state_supervision_violation_id = "violation1" violation.violated_conditions = "cond" violation.is_violent = "false" violation_type = violation.create_state_supervision_violation_type_entry() violation_type.state_supervision_violation_type_entry_id = "violation_type_id" violation_type.violation_type = "FELONY" violated_condition = ( violation.create_state_supervision_violated_condition_entry() ) violated_condition.state_supervision_violated_condition_entry_id = ( "condition_id" ) violated_condition.condition = "CURFEW" response = violation.create_state_supervision_violation_response() response.state_supervision_violation_response_id = "response1" response_decision_agent = response.create_state_agent() response_decision_agent.state_agent_id = "agentTERM" response_decision_agent.full_name = "Officer Termy" response_decision = ( response.create_state_supervision_violation_response_decision_entry() ) response_decision.state_supervision_violation_response_decision_entry_id = ( "response_decision_id" ) response_decision.decision = "REVOCATION" response_decision.revocation_type = "REINCARCERATION" bond = charge1.create_state_bond() bond.state_bond_id = "bond1" court_case = charge2.create_state_court_case() court_case.state_court_case_id = "case1" court_case_agent = court_case.create_state_agent() court_case_agent.state_agent_id = "agentJ" court_case_agent.full_name = "Judge Agent" # Arrange Proto ingest info expected_proto = ingest_info_pb2.IngestInfo() person_pb = expected_proto.state_people.add() person_pb.state_person_id = "person1" person_pb.surname = "testname" person_pb.state_person_race_ids.append("race1") race_pb = expected_proto.state_person_races.add() race_pb.state_person_race_id = "race1" race_pb.race = "white" person_pb.state_person_ethnicity_ids.append("ethnicity1") ethnicity_pb = expected_proto.state_person_ethnicities.add() ethnicity_pb.state_person_ethnicity_id = "ethnicity1" ethnicity_pb.ethnicity = "non-hispanic" person_pb.state_person_external_ids_ids.append("contrived:external_id1") external_id_pb = expected_proto.state_person_external_ids.add() external_id_pb.state_person_external_id_id = "contrived:external_id1" external_id_pb.id_type = "contrived" person_pb.state_alias_ids.append("alias1") alias_pb = expected_proto.state_aliases.add() alias_pb.state_alias_id = "alias1" alias_pb.surname = "testerson" person_pb.state_assessment_ids.append("assessment1") assessment_pb = expected_proto.state_assessments.add() assessment_pb.state_assessment_id = "assessment1" assessment_pb.assessment_score = "42" person_pb.supervising_officer_id = "supervising_officer1" supervising_officer_pb = expected_proto.state_agents.add() supervising_officer_pb.state_agent_id = "supervising_officer1" supervising_officer_pb.full_name = "Officer Supervising" assessment_pb.conducting_agent_id = "agent1" assessment_agent_pb = expected_proto.state_agents.add() assessment_agent_pb.state_agent_id = "agent1" assessment_agent_pb.full_name = "Officer Jones" person_pb.state_program_assignment_ids.append("assignment1") program_assignment_pb = expected_proto.state_program_assignments.add() program_assignment_pb.state_program_assignment_id = "assignment1" program_assignment_pb.program_id = "program_id1" program_assignment_pb.referring_agent_id = "program_agent1" program_assignment_agent_pb = expected_proto.state_agents.add() program_assignment_agent_pb.state_agent_id = "program_agent1" program_assignment_agent_pb.full_name = "Officer Program" person_pb.state_sentence_group_ids.append("group1") group_pb = expected_proto.state_sentence_groups.add() group_pb.state_sentence_group_id = "group1" group_pb.state_fine_ids.append("fine1") fine_pb = expected_proto.state_fines.add() fine_pb.state_fine_id = "fine1" group_pb.state_supervision_sentence_ids.append("ss1") supervision_sentence_pb = expected_proto.state_supervision_sentences.add() supervision_sentence_pb.state_supervision_sentence_id = "ss1" supervision_sentence_pb.state_early_discharge_ids.append("early_discharge2") early_discharge2_pb = expected_proto.state_early_discharges.add() early_discharge2_pb.state_early_discharge_id = "early_discharge2" supervision_sentence_pb.state_charge_ids.append("charge2") charge2_pb = expected_proto.state_charges.add() charge2_pb.state_charge_id = "charge2" charge2_pb.classification_type = "M" supervision_sentence_pb.state_supervision_period_ids.append("sp1") supervision_period_pb = expected_proto.state_supervision_periods.add() supervision_period_pb.state_supervision_period_id = "sp1" supervision_period_pb.status = "TERMINATED" supervision_period_pb.state_program_assignment_ids.append("assignment1") # An ordering requirement in the proto equality check at the end of this # test requires that this agent be added after agent1 and before agentPO court_case_agent_pb = expected_proto.state_agents.add() court_case_agent_pb.state_agent_id = "agentJ" court_case_agent_pb.full_name = "Judge Agent" supervision_period_pb.supervising_officer_id = "agentPO" supervision_period_agent_pb = expected_proto.state_agents.add() supervision_period_agent_pb.state_agent_id = "agentPO" supervision_period_agent_pb.full_name = "Officer Paroley" supervision_case_type_entry_pb = ( expected_proto.state_supervision_case_type_entries.add() ) supervision_case_type_entry_pb.state_supervision_case_type_entry_id = ( "case_type_entry_id" ) supervision_case_type_entry_pb.case_type = "case_type" supervision_period_pb.state_supervision_case_type_entry_ids.append( "case_type_entry_id" ) supervision_contact_pb = expected_proto.state_supervision_contacts.add() supervision_contact_pb.state_supervision_contact_id = "supervision_contact_id" supervision_contact_pb.contact_type = "contact_type" supervision_contact_pb.contacted_agent_id = "agentPO" supervision_period_pb.state_supervision_contact_ids.append( "supervision_contact_id" ) supervision_period_pb.state_supervision_violation_entry_ids.append("violation1") violation_pb = expected_proto.state_supervision_violations.add() violation_pb.state_supervision_violation_id = "violation1" violation_pb.is_violent = "false" violation_pb.violated_conditions = "cond" violation_pb.state_supervision_violation_type_entry_ids.append( "violation_type_id" ) violation_type_pb = ( expected_proto.state_supervision_violation_type_entries.add() ) violation_type_pb.state_supervision_violation_type_entry_id = ( "violation_type_id" ) violation_type_pb.violation_type = "FELONY" violation_pb.state_supervision_violated_condition_entry_ids.append( "condition_id" ) violation_type_pb = ( expected_proto.state_supervision_violated_condition_entries.add() ) violation_type_pb.state_supervision_violated_condition_entry_id = "condition_id" violation_type_pb.condition = "CURFEW" violation_pb.state_supervision_violation_response_ids.append("response1") response_pb = expected_proto.state_supervision_violation_responses.add() response_pb.state_supervision_violation_response_id = "response1" response_pb.decision_agent_ids.append("agentTERM") response_decision_agent_pb = expected_proto.state_agents.add() response_decision_agent_pb.state_agent_id = "agentTERM" response_decision_agent_pb.full_name = "Officer Termy" response_decision_pb = ( expected_proto.state_supervision_violation_response_decision_entries.add() ) response_decision_pb.state_supervision_violation_response_decision_entry_id = ( "response_decision_id" ) response_decision_pb.decision = "REVOCATION" response_decision_pb.revocation_type = "REINCARCERATION" response_pb.state_supervision_violation_response_decision_entry_ids.append( "response_decision_id" ) group_pb.state_incarceration_sentence_ids.append("is1") incarceration_sentence_pb = expected_proto.state_incarceration_sentences.add() incarceration_sentence_pb.state_incarceration_sentence_id = "is1" incarceration_sentence_pb.state_early_discharge_ids.append("early_discharge1") early_discharge1_pb = expected_proto.state_early_discharges.add() early_discharge1_pb.state_early_discharge_id = "early_discharge1" incarceration_sentence_pb.state_charge_ids.append("charge1") charge1_pb = expected_proto.state_charges.add() charge1_pb.state_charge_id = "charge1" charge1_pb.classification_type = "F" incarceration_sentence_pb.state_incarceration_period_ids.append("ip1") incarceration_period_pb = expected_proto.state_incarceration_periods.add() incarceration_period_pb.state_incarceration_period_id = "ip1" incarceration_period_pb.status = "IN_CUSTODY" incarceration_period_pb.specialized_purpose_for_incarceration = ( "SHOCK INCARCERATION" ) incarceration_period_pb.state_incarceration_incident_ids.append("incident1") incident_pb = expected_proto.state_incarceration_incidents.add() incident_pb.state_incarceration_incident_id = "incident1" incident_pb.incident_type = "FISTICUFFS" incarceration_period_pb.state_program_assignment_ids.append("assignment1") incident_pb.responding_officer_id = "agent2" incident_agent_pb = expected_proto.state_agents.add() incident_agent_pb.state_agent_id = "agent2" incident_agent_pb.full_name = "Officer Thompson" incident_pb.state_incarceration_incident_outcome_ids.append("incident1-1") incident_outcome_pb = expected_proto.state_incarceration_incident_outcomes.add() incident_outcome_pb.state_incarceration_incident_outcome_id = "incident1-1" incident_outcome_pb.outcome_type = "FINE" incarceration_period_pb.state_parole_decision_ids.append("decision1") decision_pb = expected_proto.state_parole_decisions.add() decision_pb.state_parole_decision_id = "decision1" decision_pb.decision_agent_ids.append("agent3") decision_agent_pb = expected_proto.state_agents.add() decision_agent_pb.state_agent_id = "agent3" decision_agent_pb.full_name = "Officer Barkley" charge1_pb.state_bond_id = "bond1" bond_pb = expected_proto.state_bonds.add() bond_pb.state_bond_id = "bond1" charge2_pb.state_court_case_id = "case1" court_case_pb = expected_proto.state_court_cases.add() court_case_pb.state_court_case_id = "case1" court_case_pb.judge_id = "agentJ" expected_info = copy.deepcopy(info) # Act & Assert proto = ingest_utils.convert_ingest_info_to_proto(info) assert expected_proto == proto info_back = ingest_utils.convert_proto_to_ingest_info(proto) assert info_back == expected_info # Assert that none of the proto's collections are empty, i.e. we've # tested all of the object graph proto_classes = [field.name for field in proto.DESCRIPTOR.fields] for cls in proto_classes: if cls.startswith("state_"): assert proto.__getattribute__(cls)
def test_convert_ingest_info_state_entities(self): # Arrange Python ingest info info = ingest_info.IngestInfo() person = info.create_state_person() person.state_person_id = 'person1' person.surname = 'testname' race = person.create_state_person_race() race.state_person_race_id = 'race1' race.race = 'white' ethnicity = person.create_state_person_ethnicity() ethnicity.state_person_ethnicity_id = 'ethnicity1' ethnicity.ethnicity = 'non-hispanic' external_id = person.create_state_person_external_id() external_id.state_person_external_id_id = 'external_id1' external_id.id_type = 'contrived' alias = person.create_state_alias() alias.state_alias_id = 'alias1' alias.surname = 'testerson' assessment = person.create_state_assessment() assessment.state_assessment_id = 'assessment1' assessment.assessment_score = '42' supervising_officer = person.create_state_agent() supervising_officer.state_agent_id = 'supervising_officer1' supervising_officer.full_name = 'Officer Supervising' assessment_agent = assessment.create_state_agent() assessment_agent.state_agent_id = 'agent1' assessment_agent.full_name = 'Officer Jones' program_assignment = person.create_state_program_assignment() program_assignment.state_program_assignment_id = 'assignment1' program_assignment.program_id = 'program_id1' program_assignment_agent = program_assignment.create_state_agent() program_assignment_agent.state_agent_id = 'program_agent1' program_assignment_agent.full_name = 'Officer Program' group = person.create_state_sentence_group() group.state_sentence_group_id = 'group1' fine = group.create_state_fine() fine.state_fine_id = 'fine1' incarceration_sentence = group.create_state_incarceration_sentence() incarceration_sentence.state_incarceration_sentence_id = 'is1' early_discharge1 = incarceration_sentence.create_state_early_discharge( ) early_discharge1.state_early_discharge_id = 'early_discharge1' charge1 = incarceration_sentence.create_state_charge() charge1.state_charge_id = 'charge1' charge1.classification_type = 'F' incarceration_period = incarceration_sentence. \ create_state_incarceration_period() incarceration_period.state_incarceration_period_id = 'ip1' incarceration_period.status = 'IN_CUSTODY' incarceration_period.specialized_purpose_for_incarceration = \ 'SHOCK INCARCERATION' incarceration_period.state_program_assignments = [program_assignment] incident = incarceration_period.create_state_incarceration_incident() incident.state_incarceration_incident_id = 'incident1' incident.incident_type = 'FISTICUFFS' incident_outcome = \ incident.create_state_incarceration_incident_outcome() incident_outcome.state_incarceration_incident_outcome_id = 'incident1-1' incident_outcome.outcome_type = 'FINE' incident_agent = incident.create_state_agent() incident_agent.state_agent_id = 'agent2' incident_agent.full_name = 'Officer Thompson' decision = incarceration_period.create_state_parole_decision() decision.state_parole_decision_id = 'decision1' decision_agent = decision.create_state_agent() decision_agent.state_agent_id = 'agent3' decision_agent.full_name = 'Officer Barkley' supervision_sentence = group.create_state_supervision_sentence() supervision_sentence.state_supervision_sentence_id = 'ss1' early_discharge2 = supervision_sentence.create_state_early_discharge() early_discharge2.state_early_discharge_id = 'early_discharge2' charge2 = supervision_sentence.create_state_charge() charge2.state_charge_id = 'charge2' charge2.classification_type = 'M' supervision_period = supervision_sentence. \ create_state_supervision_period() supervision_period.state_supervision_period_id = 'sp1' supervision_period.status = 'TERMINATED' supervision_period_agent = supervision_period.create_state_agent() supervision_period_agent.state_agent_id = 'agentPO' supervision_period_agent.full_name = 'Officer Paroley' supervision_period.state_program_assignments = [program_assignment] supervision_case_type_entry = supervision_period.create_state_supervision_case_type_entry( ) supervision_case_type_entry.case_type = 'case_type' supervision_case_type_entry.state_supervision_case_type_entry_id = 'case_type_entry_id' supervision_contact = supervision_period.create_state_supervision_contact( ) supervision_contact.state_supervision_contact_id = 'supervision_contact_id' supervision_contact.contact_type = 'contact_type' supervision_contacted_agent = supervision_contact.create_state_agent() supervision_contacted_agent.state_agent_id = 'agentPO' supervision_contacted_agent.full_name = 'Officer Paroley' violation = supervision_period.create_state_supervision_violation() violation.state_supervision_violation_id = 'violation1' violation.violated_conditions = 'cond' violation.is_violent = 'false' violation_type = violation.\ create_state_supervision_violation_type_entry() violation_type.state_supervision_violation_type_entry_id =\ 'violation_type_id' violation_type.violation_type = 'FELONY' violated_condition = \ violation.create_state_supervision_violated_condition_entry() violated_condition.state_supervision_violated_condition_entry_id =\ 'condition_id' violated_condition.condition = 'CURFEW' response = violation.create_state_supervision_violation_response() response.state_supervision_violation_response_id = 'response1' response_decision_agent = response.create_state_agent() response_decision_agent.state_agent_id = 'agentTERM' response_decision_agent.full_name = 'Officer Termy' response_decision = response.\ create_state_supervision_violation_response_decision_entry() response_decision.\ state_supervision_violation_response_decision_entry_id =\ 'response_decision_id' response_decision.decision = 'REVOCATION' response_decision.revocation_type = 'REINCARCERATION' bond = charge1.create_state_bond() bond.state_bond_id = 'bond1' court_case = charge2.create_state_court_case() court_case.state_court_case_id = 'case1' court_case_agent = court_case.create_state_agent() court_case_agent.state_agent_id = 'agentJ' court_case_agent.full_name = 'Judge Agent' # Arrange Proto ingest info expected_proto = ingest_info_pb2.IngestInfo() person_pb = expected_proto.state_people.add() person_pb.state_person_id = 'person1' person_pb.surname = 'testname' person_pb.state_person_race_ids.append('race1') race_pb = expected_proto.state_person_races.add() race_pb.state_person_race_id = 'race1' race_pb.race = 'white' person_pb.state_person_ethnicity_ids.append('ethnicity1') ethnicity_pb = expected_proto.state_person_ethnicities.add() ethnicity_pb.state_person_ethnicity_id = 'ethnicity1' ethnicity_pb.ethnicity = 'non-hispanic' person_pb.state_person_external_ids_ids.append( 'contrived:external_id1') external_id_pb = expected_proto.state_person_external_ids.add() external_id_pb.state_person_external_id_id = 'contrived:external_id1' external_id_pb.id_type = 'contrived' person_pb.state_alias_ids.append('alias1') alias_pb = expected_proto.state_aliases.add() alias_pb.state_alias_id = 'alias1' alias_pb.surname = 'testerson' person_pb.state_assessment_ids.append('assessment1') assessment_pb = expected_proto.state_assessments.add() assessment_pb.state_assessment_id = 'assessment1' assessment_pb.assessment_score = '42' person_pb.supervising_officer_id = 'supervising_officer1' supervising_officer_pb = expected_proto.state_agents.add() supervising_officer_pb.state_agent_id = 'supervising_officer1' supervising_officer_pb.full_name = 'Officer Supervising' assessment_pb.conducting_agent_id = 'agent1' assessment_agent_pb = expected_proto.state_agents.add() assessment_agent_pb.state_agent_id = 'agent1' assessment_agent_pb.full_name = 'Officer Jones' person_pb.state_program_assignment_ids.append('assignment1') program_assignment_pb = expected_proto.state_program_assignments.add() program_assignment_pb.state_program_assignment_id = 'assignment1' program_assignment_pb.program_id = 'program_id1' program_assignment_pb.referring_agent_id = 'program_agent1' program_assignment_agent_pb = expected_proto.state_agents.add() program_assignment_agent_pb.state_agent_id = 'program_agent1' program_assignment_agent_pb.full_name = 'Officer Program' person_pb.state_sentence_group_ids.append('group1') group_pb = expected_proto.state_sentence_groups.add() group_pb.state_sentence_group_id = 'group1' group_pb.state_fine_ids.append('fine1') fine_pb = expected_proto.state_fines.add() fine_pb.state_fine_id = 'fine1' group_pb.state_supervision_sentence_ids.append('ss1') supervision_sentence_pb = \ expected_proto.state_supervision_sentences.add() supervision_sentence_pb.state_supervision_sentence_id = 'ss1' supervision_sentence_pb.state_early_discharge_ids.append( 'early_discharge2') early_discharge2_pb = expected_proto.state_early_discharges.add() early_discharge2_pb.state_early_discharge_id = 'early_discharge2' supervision_sentence_pb.state_charge_ids.append('charge2') charge2_pb = expected_proto.state_charges.add() charge2_pb.state_charge_id = 'charge2' charge2_pb.classification_type = 'M' supervision_sentence_pb.state_supervision_period_ids.append('sp1') supervision_period_pb = expected_proto.state_supervision_periods.add() supervision_period_pb.state_supervision_period_id = 'sp1' supervision_period_pb.status = 'TERMINATED' supervision_period_pb.state_program_assignment_ids.append( 'assignment1') # An ordering requirement in the proto equality check at the end of this # test requires that this agent be added after agent1 and before agentPO court_case_agent_pb = expected_proto.state_agents.add() court_case_agent_pb.state_agent_id = 'agentJ' court_case_agent_pb.full_name = 'Judge Agent' supervision_period_pb.supervising_officer_id = 'agentPO' supervision_period_agent_pb = expected_proto.state_agents.add() supervision_period_agent_pb.state_agent_id = 'agentPO' supervision_period_agent_pb.full_name = 'Officer Paroley' supervision_case_type_entry_pb = expected_proto.state_supervision_case_type_entries.add( ) supervision_case_type_entry_pb.state_supervision_case_type_entry_id = 'case_type_entry_id' supervision_case_type_entry_pb.case_type = 'case_type' supervision_period_pb.state_supervision_case_type_entry_ids.append( 'case_type_entry_id') supervision_contact_pb = expected_proto.state_supervision_contacts.add( ) supervision_contact_pb.state_supervision_contact_id = 'supervision_contact_id' supervision_contact_pb.contact_type = 'contact_type' supervision_contact_pb.contacted_agent_id = 'agentPO' supervision_period_pb.state_supervision_contact_ids.append( 'supervision_contact_id') supervision_period_pb.state_supervision_violation_entry_ids.append( 'violation1') violation_pb = expected_proto.state_supervision_violations.add() violation_pb.state_supervision_violation_id = 'violation1' violation_pb.is_violent = 'false' violation_pb.violated_conditions = 'cond' violation_pb.state_supervision_violation_type_entry_ids.append( 'violation_type_id') violation_type_pb = \ expected_proto.state_supervision_violation_type_entries.add() violation_type_pb.state_supervision_violation_type_entry_id = \ 'violation_type_id' violation_type_pb.violation_type = 'FELONY' violation_pb.state_supervision_violated_condition_entry_ids.append( 'condition_id') violation_type_pb = \ expected_proto.state_supervision_violated_condition_entries.add() violation_type_pb.state_supervision_violated_condition_entry_id = \ 'condition_id' violation_type_pb.condition = 'CURFEW' violation_pb.state_supervision_violation_response_ids.append( 'response1') response_pb = expected_proto.state_supervision_violation_responses.add( ) response_pb.state_supervision_violation_response_id = 'response1' response_pb.decision_agent_ids.append('agentTERM') response_decision_agent_pb = expected_proto.state_agents.add() response_decision_agent_pb.state_agent_id = 'agentTERM' response_decision_agent_pb.full_name = 'Officer Termy' response_decision_pb = \ expected_proto.\ state_supervision_violation_response_decision_entries.add() response_decision_pb.\ state_supervision_violation_response_decision_entry_id = \ 'response_decision_id' response_decision_pb.decision = 'REVOCATION' response_decision_pb.revocation_type = 'REINCARCERATION' response_pb.\ state_supervision_violation_response_decision_entry_ids.append( 'response_decision_id' ) group_pb.state_incarceration_sentence_ids.append('is1') incarceration_sentence_pb = \ expected_proto.state_incarceration_sentences.add() incarceration_sentence_pb.state_incarceration_sentence_id = 'is1' incarceration_sentence_pb.state_early_discharge_ids.append( 'early_discharge1') early_discharge1_pb = expected_proto.state_early_discharges.add() early_discharge1_pb.state_early_discharge_id = 'early_discharge1' incarceration_sentence_pb.state_charge_ids.append('charge1') charge1_pb = expected_proto.state_charges.add() charge1_pb.state_charge_id = 'charge1' charge1_pb.classification_type = 'F' incarceration_sentence_pb.state_incarceration_period_ids.append('ip1') incarceration_period_pb = \ expected_proto.state_incarceration_periods.add() incarceration_period_pb.state_incarceration_period_id = 'ip1' incarceration_period_pb.status = 'IN_CUSTODY' incarceration_period_pb.specialized_purpose_for_incarceration = \ 'SHOCK INCARCERATION' incarceration_period_pb.state_incarceration_incident_ids \ .append('incident1') incident_pb = expected_proto.state_incarceration_incidents.add() incident_pb.state_incarceration_incident_id = 'incident1' incident_pb.incident_type = 'FISTICUFFS' incarceration_period_pb.state_program_assignment_ids.append( 'assignment1') incident_pb.responding_officer_id = 'agent2' incident_agent_pb = expected_proto.state_agents.add() incident_agent_pb.state_agent_id = 'agent2' incident_agent_pb.full_name = 'Officer Thompson' incident_pb.state_incarceration_incident_outcome_ids.append( 'incident1-1') incident_outcome_pb = \ expected_proto.state_incarceration_incident_outcomes.add() incident_outcome_pb.state_incarceration_incident_outcome_id = \ 'incident1-1' incident_outcome_pb.outcome_type = 'FINE' incarceration_period_pb.state_parole_decision_ids.append('decision1') decision_pb = expected_proto.state_parole_decisions.add() decision_pb.state_parole_decision_id = 'decision1' decision_pb.decision_agent_ids.append('agent3') decision_agent_pb = expected_proto.state_agents.add() decision_agent_pb.state_agent_id = 'agent3' decision_agent_pb.full_name = 'Officer Barkley' charge1_pb.state_bond_id = 'bond1' bond_pb = expected_proto.state_bonds.add() bond_pb.state_bond_id = 'bond1' charge2_pb.state_court_case_id = 'case1' court_case_pb = expected_proto.state_court_cases.add() court_case_pb.state_court_case_id = 'case1' court_case_pb.judge_id = 'agentJ' expected_info = copy.deepcopy(info) # Act & Assert proto = ingest_utils.convert_ingest_info_to_proto(info) assert expected_proto == proto info_back = ingest_utils.convert_proto_to_ingest_info(proto) assert info_back == expected_info # Assert that none of the proto's collections are empty, i.e. we've # tested all of the object graph proto_classes = [field.name for field in proto.DESCRIPTOR.fields] for cls in proto_classes: if cls.startswith('state_'): assert proto.__getattribute__(cls)
def ingest_info_from_serializable(serializable: Dict[Any, Any]) \ -> ingest_info.IngestInfo: proto = json_format.ParseDict(serializable, ingest_info_pb2.IngestInfo()) return convert_proto_to_ingest_info(proto)
def convert_ingest_info_to_proto(ingest_info_py: ingest_info.IngestInfo) \ -> ingest_info_pb2.IngestInfo: """Converts an ingest_info python object to an ingest info proto.""" def _process_external_ids(ii: ingest_info.IngestInfo) -> None: # As states can have multiple external_ids from different systems, we # create new ids that contain type and external_id information so ids # from different systems don't collide. for p in ii.state_people: for ex_id in p.state_person_external_ids: id_type = cast(str, ex_id.id_type) existing_id = cast(str, ex_id.state_person_external_id_id) ex_id.state_person_external_id_id = create_synthetic_id( external_id=existing_id, id_type=id_type) _process_external_ids(ingest_info_py) proto = ingest_info_pb2.IngestInfo() person_map: Dict[str, ingest_info.Person] = {} booking_map: Dict[str, ingest_info.Booking] = {} charge_map: Dict[str, ingest_info.Charge] = {} hold_map: Dict[str, ingest_info.Hold] = {} arrest_map: Dict[str, ingest_info.Arrest] = {} bond_map: Dict[str, ingest_info.Bond] = {} sentence_map: Dict[str, ingest_info.Sentence] = {} state_person_map: Dict[str, ingest_info.StatePerson] = {} state_person_race_map: Dict[str, ingest_info.StatePersonRace] = {} state_person_ethnicity_map: Dict[str, ingest_info.StatePersonEthnicity] = {} state_person_external_id_map: \ Dict[str, ingest_info.StatePersonExternalId] = {} state_alias_map: Dict[str, ingest_info.StateAlias] = {} state_assessment_map: Dict[str, ingest_info.StateAssessment] = {} state_sentence_group_map: Dict[str, ingest_info.StateSentenceGroup] = {} state_supervision_sentence_map: \ Dict[str, ingest_info.StateSupervisionSentence] = {} state_incarceration_sentence_map: \ Dict[str, ingest_info.StateIncarcerationSentence] = {} state_fine_map: Dict[str, ingest_info.StateFine] = {} state_charge_map: Dict[str, ingest_info.StateCharge] = {} state_court_case_map: Dict[str, ingest_info.StateCourtCase] = {} state_bond_map: Dict[str, ingest_info.StateBond] = {} state_incarceration_period_map: \ Dict[str, ingest_info.StateIncarcerationPeriod] = {} state_supervision_period_map: \ Dict[str, ingest_info.StateSupervisionPeriod] = {} state_incarceration_incident_map: \ Dict[str, ingest_info.StateIncarcerationIncident] = {} state_incarceration_incident_outcome_map: \ Dict[str, ingest_info.StateIncarcerationIncidentOutcome] = {} state_parole_decision_map: Dict[str, ingest_info.StateParoleDecision] = {} state_supervision_violation_map: \ Dict[str, ingest_info.StateSupervisionViolation] = {} state_supervision_violation_response_map: \ Dict[str, ingest_info.StateSupervisionViolationResponse] = {} state_agent_map: Dict[str, ingest_info.StateAgent] = {} id_to_generated: Dict[int, str] = {} def _populate_proto(proto_name, ingest_info_source, id_name, proto_map): """Populates all of the proto fields from an IngestInfo object. Args: proto_name: The name of the proto we are populating, like 'people', 'arrests', etc... ingest_info_source: The source object we are copying from id_name: The name of the id, is 'person_id', 'arrest_id', etc... This is used to decide whether or not to generate a new proto, use the given id, or generate a new one proto_map: A map of protos we have already created to know whether we need to go ahead creating one or if we can just return the already created one. Returns: A populated proto """ obj_id = getattr(ingest_info_source, id_name) if not obj_id: obj_id = id_to_generated.get(id(ingest_info_source)) or \ common_utils.create_generated_id() id_to_generated[id(ingest_info_source)] = obj_id # If we've already seen this id, we don't need to create it, we can # simply return it as is. Not that we use this local in memory # proto map so as to avoid using the map provided in proto to make it # simpler for external people to read it. If we decide that no one # but us will ever read the proto then we can remove this logic here # and use the built in proto map. if obj_id in proto_map: return proto_map[obj_id] proto_to_populate = getattr(proto, proto_name).add() setattr(proto_to_populate, id_name, obj_id) _copy_fields(ingest_info_source, proto_to_populate, proto_to_populate.DESCRIPTOR) proto_map[obj_id] = proto_to_populate return proto_to_populate def _populate_state_charge_protos(parent_ingest_object, parent_proto): """Populates StateCharge proto fields for some parent object, e.g. SupervisionSentence and IncarcerationSentence, which both reference StateCharge. """ for state_charge in parent_ingest_object.state_charges: proto_state_charge = _populate_proto('state_charges', state_charge, 'state_charge_id', state_charge_map) parent_proto.state_charge_ids.append( proto_state_charge.state_charge_id) if state_charge.state_court_case: state_court_case = state_charge.state_court_case proto_court_case = _populate_proto('state_court_cases', state_court_case, 'state_court_case_id', state_court_case_map) proto_state_charge.state_court_case_id = \ proto_court_case.state_court_case_id if state_court_case.judge: proto_judge = _populate_proto('state_agents', state_court_case.judge, 'state_agent_id', state_agent_map) proto_court_case.judge_id = \ proto_judge.state_agent_id if state_charge.state_bond: proto_state_bond = _populate_proto('state_bonds', state_charge.state_bond, 'state_bond_id', state_bond_map) proto_state_charge.state_bond_id = \ proto_state_bond.state_bond_id def _populate_incarceration_period_protos(parent_ingest_object, parent_proto): """Populates IncarcerationPeriod proto fields for some parent object, e.g. SupervisionSentence and IncarcerationSentence, which both reference IncarcerationPeriod. """ for incarceration_period in \ parent_ingest_object.state_incarceration_periods: proto_period = _populate_proto('state_incarceration_periods', incarceration_period, 'state_incarceration_period_id', state_incarceration_period_map) parent_proto.state_incarceration_period_ids.append( proto_period.state_incarceration_period_id) for incident in incarceration_period.state_incarceration_incidents: proto_incident = _populate_proto( 'state_incarceration_incidents', incident, 'state_incarceration_incident_id', state_incarceration_incident_map) if proto_incident.state_incarceration_incident_id not in \ proto_period.state_incarceration_incident_ids: proto_period.state_incarceration_incident_ids.append( proto_incident.state_incarceration_incident_id) if incident.responding_officer: proto_agent = _populate_proto('state_agents', incident.responding_officer, 'state_agent_id', state_agent_map) proto_incident.responding_officer_id = \ proto_agent.state_agent_id for incident_outcome in \ incident.state_incarceration_incident_outcomes: proto_incident_outcome = _populate_proto( 'state_incarceration_incident_outcomes', incident_outcome, 'state_incarceration_incident_outcome_id', state_incarceration_incident_outcome_map) proto_incident.state_incarceration_incident_outcome_ids \ .append(proto_incident_outcome. state_incarceration_incident_outcome_id) for decision in incarceration_period.state_parole_decisions: proto_decision = _populate_proto('state_parole_decisions', decision, 'state_parole_decision_id', state_parole_decision_map) proto_period.state_parole_decision_ids.append( proto_decision.state_parole_decision_id) for agent in decision.decision_agents: proto_agent = _populate_proto('state_agents', agent, 'state_agent_id', state_agent_map) proto_decision.decision_agent_ids.append( proto_agent.state_agent_id) for period_assessment in incarceration_period.state_assessments: proto_period_assessment = _populate_proto( 'state_assessments', period_assessment, 'state_assessment_id', state_assessment_map) proto_period.state_assessment_ids.append( proto_period_assessment.state_assessment_id) if period_assessment.conducting_agent: proto_agent = _populate_proto( 'state_agents', period_assessment.conducting_agent, 'state_agent_id', state_agent_map) proto_period_assessment.conducting_agent_id = \ proto_agent.state_agent_id def _populate_supervision_period_protos(parent_ingest_object, parent_proto): """Populates SupervisionPeriod proto fields for some parent object, e.g. SupervisionSentence and IncarcerationSentence, which both reference SupervisionPeriod. """ for supervision_period in \ parent_ingest_object.state_supervision_periods: proto_period = _populate_proto('state_supervision_periods', supervision_period, 'state_supervision_period_id', state_supervision_period_map) parent_proto.state_supervision_period_ids.append( proto_period.state_supervision_period_id) for violation in supervision_period.state_supervision_violations: proto_violation = _populate_proto( 'state_supervision_violations', violation, 'state_supervision_violation_id', state_supervision_violation_map) proto_period.state_supervision_violation_ids.append( proto_violation.state_supervision_violation_id) for response in violation.state_supervision_violation_responses: proto_response = _populate_proto( 'state_supervision_violation_responses', response, 'state_supervision_violation_response_id', state_supervision_violation_response_map) proto_violation.state_supervision_violation_response_ids \ .append(proto_response. state_supervision_violation_response_id) for period_assessment in supervision_period.state_assessments: proto_period_assessment = _populate_proto( 'state_assessments', period_assessment, 'state_assessment_id', state_assessment_map) proto_period.state_assessment_ids.append( proto_period_assessment.state_assessment_id) if period_assessment.conducting_agent: proto_agent = _populate_proto( 'state_agents', period_assessment.conducting_agent, 'state_agent_id', state_agent_map) proto_period_assessment.conducting_agent_id = \ proto_agent.state_agent_id for person in ingest_info_py.people: proto_person = _populate_proto('people', person, 'person_id', person_map) for booking in person.bookings: proto_booking = _populate_proto('bookings', booking, 'booking_id', booking_map) # Can safely append the ids now since they should be unique. proto_person.booking_ids.append(proto_booking.booking_id) if booking.arrest: proto_arrest = _populate_proto('arrests', booking.arrest, 'arrest_id', arrest_map) proto_booking.arrest_id = proto_arrest.arrest_id for hold in booking.holds: proto_hold = _populate_proto('holds', hold, 'hold_id', hold_map) proto_booking.hold_ids.append(proto_hold.hold_id) for charge in booking.charges: proto_charge = _populate_proto('charges', charge, 'charge_id', charge_map) proto_booking.charge_ids.append(proto_charge.charge_id) if charge.bond: proto_bond = _populate_proto('bonds', charge.bond, 'bond_id', bond_map) proto_charge.bond_id = proto_bond.bond_id if charge.sentence: proto_sentence = _populate_proto('sentences', charge.sentence, 'sentence_id', sentence_map) proto_charge.sentence_id = proto_sentence.sentence_id for state_person in ingest_info_py.state_people: proto_state_person = _populate_proto('state_people', state_person, 'state_person_id', state_person_map) for race in state_person.state_person_races: proto_race = _populate_proto('state_person_races', race, 'state_person_race_id', state_person_race_map) proto_state_person.state_person_race_ids.append( proto_race.state_person_race_id) for ethnicity in state_person.state_person_ethnicities: proto_ethnicity = _populate_proto('state_person_ethnicities', ethnicity, 'state_person_ethnicity_id', state_person_ethnicity_map) proto_state_person.state_person_ethnicity_ids.append( proto_ethnicity.state_person_ethnicity_id) for external_id in state_person.state_person_external_ids: proto_external_id = _populate_proto('state_person_external_ids', external_id, 'state_person_external_id_id', state_person_external_id_map) proto_state_person.state_person_external_ids_ids.append( proto_external_id.state_person_external_id_id) for alias in state_person.state_aliases: proto_alias = _populate_proto('state_aliases', alias, 'state_alias_id', state_alias_map) proto_state_person.state_alias_ids.append( proto_alias.state_alias_id) for assessment in state_person.state_assessments: proto_assessment = _populate_proto('state_assessments', assessment, 'state_assessment_id', state_assessment_map) proto_state_person.state_assessment_ids.append( proto_assessment.state_assessment_id) if assessment.conducting_agent: proto_agent = _populate_proto('state_agents', assessment.conducting_agent, 'state_agent_id', state_agent_map) proto_assessment.conducting_agent_id = \ proto_agent.state_agent_id for sentence_group in state_person.state_sentence_groups: proto_sentence_group = _populate_proto('state_sentence_groups', sentence_group, 'state_sentence_group_id', state_sentence_group_map) proto_state_person.state_sentence_group_ids.append( proto_sentence_group.state_sentence_group_id) for supervision_sentence in \ sentence_group.state_supervision_sentences: proto_supervision_sentence = _populate_proto( 'state_supervision_sentences', supervision_sentence, 'state_supervision_sentence_id', state_supervision_sentence_map) proto_sentence_group.state_supervision_sentence_ids.append( proto_supervision_sentence.state_supervision_sentence_id) _populate_state_charge_protos(supervision_sentence, proto_supervision_sentence) _populate_incarceration_period_protos( supervision_sentence, proto_supervision_sentence) _populate_supervision_period_protos( supervision_sentence, proto_supervision_sentence) for incarceration_sentence in \ sentence_group.state_incarceration_sentences: proto_incarceration_sentence = _populate_proto( 'state_incarceration_sentences', incarceration_sentence, 'state_incarceration_sentence_id', state_incarceration_sentence_map) proto_sentence_group.state_incarceration_sentence_ids \ .append(proto_incarceration_sentence .state_incarceration_sentence_id) _populate_state_charge_protos(incarceration_sentence, proto_incarceration_sentence) _populate_incarceration_period_protos( incarceration_sentence, proto_incarceration_sentence) _populate_supervision_period_protos( incarceration_sentence, proto_incarceration_sentence) for fine in sentence_group.state_fines: proto_fine = _populate_proto('state_fines', fine, 'state_fine_id', state_fine_map) proto_sentence_group.state_fine_ids.append( proto_fine.state_fine_id) _populate_state_charge_protos(fine, proto_fine) return proto
def test_convert_ingest_info_duplicate_incarceration_incidents(self): # Arrange Python ingest info info = ingest_info.IngestInfo() person = info.create_state_person() person.state_person_id = 'person1' person.surname = 'testname' group = person.create_state_sentence_group() group.state_sentence_group_id = 'group1' incarceration_sentence = group.create_state_incarceration_sentence() incarceration_sentence.state_incarceration_sentence_id = 'is1' incarceration_period = incarceration_sentence. \ create_state_incarceration_period() incarceration_period.state_incarceration_period_id = 'ip1' incarceration_period.status = 'IN_CUSTODY' incident = incarceration_period.create_state_incarceration_incident() incident.state_incarceration_incident_id = 'incident1' incident.incident_type = 'FISTICUFFS' incident_outcome = \ incident.create_state_incarceration_incident_outcome() incident_outcome.state_incarceration_incident_outcome_id = 'incident1-1' incident_outcome.outcome_type = 'FINE' incident_dup = \ incarceration_period.create_state_incarceration_incident() incident_dup.state_incarceration_incident_id = 'incident1' incident_dup.incident_type = 'FISTICUFFS' incident_outcome_2 = \ incident_dup.create_state_incarceration_incident_outcome() incident_outcome_2.state_incarceration_incident_outcome_id = \ 'incident1-2' incident_outcome_2.outcome_type = 'FINE' # Arrange Proto ingest info expected_proto = ingest_info_pb2.IngestInfo() pb_person = expected_proto.state_people.add() pb_person.state_person_id = 'person1' pb_person.surname = 'testname' pb_person.state_sentence_group_ids.append('group1') pb_group = expected_proto.state_sentence_groups.add() pb_group.state_sentence_group_id = 'group1' pb_group.state_incarceration_sentence_ids.append('is1') pb_incarceration_sentence = \ expected_proto.state_incarceration_sentences.add() pb_incarceration_sentence.state_incarceration_sentence_id = 'is1' pb_incarceration_sentence.state_incarceration_period_ids.append('ip1') pb_incarceration_period = \ expected_proto.state_incarceration_periods.add() pb_incarceration_period.state_incarceration_period_id = 'ip1' pb_incarceration_period.status = 'IN_CUSTODY' pb_incarceration_period.state_incarceration_incident_ids \ .append('incident1') pb_incident = expected_proto.state_incarceration_incidents.add() pb_incident.state_incarceration_incident_id = 'incident1' pb_incident.incident_type = 'FISTICUFFS' pb_incident.state_incarceration_incident_outcome_ids.append( 'incident1-1') pb_incident_outcome = \ expected_proto.state_incarceration_incident_outcomes.add() pb_incident_outcome.state_incarceration_incident_outcome_id = \ 'incident1-1' pb_incident_outcome.outcome_type = 'FINE' pb_incident.state_incarceration_incident_outcome_ids.append( 'incident1-2') pb_incident_outcome = \ expected_proto.state_incarceration_incident_outcomes.add() pb_incident_outcome.state_incarceration_incident_outcome_id = \ 'incident1-2' pb_incident_outcome.outcome_type = 'FINE' # Act & Assert proto = ingest_utils.convert_ingest_info_to_proto(info) assert expected_proto == proto # Duplicate IncarcerationIncident is gone. info_back = ingest_utils.convert_proto_to_ingest_info(proto) incarceration_period.state_incarceration_incidents = [incident] incident.state_incarceration_incident_outcomes = [ incident_outcome, incident_outcome_2 ] assert info_back == info