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_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_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)
Beispiel #7
0
    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