예제 #1
0
    def testConvert_ExternalId_ClearPII(self):
        # Arrange
        metadata = IngestMetadata('REGION', _JURISDICTION_ID, _INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(person_id='PERSON_ID',
                               full_name='full_name',
                               booking_ids=['BOOKING_ID'])
        ingest_info.bookings.add(booking_id='BOOKING_ID',
                                 admission_date=str(_RELEASE_DATE))
        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                external_id='PERSON_ID',
                region='REGION',
                jurisdiction_id='JURISDICTION_ID',
                bookings=[
                    Booking.new_with_defaults(
                        external_id='BOOKING_ID',
                        admission_date=_RELEASE_DATE,
                        admission_date_inferred=False,
                        custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                        first_seen_time=_INGEST_TIME,
                        last_seen_time=_INGEST_TIME)
                ])
        ]

        self.assertEqual(result, expected_result)
 def test_get_entity_name_county_entity_sample(self):
     self.assertEqual('person',
                      Person.new_with_defaults().get_entity_name())
     self.assertEqual('booking',
                      Booking.new_with_defaults().get_entity_name())
     self.assertEqual('hold',
                      Hold.new_with_defaults().get_entity_name())
예제 #3
0
    def testConvert_TotalBondNoCharge_CreatesChargeWithTotalBondAmount(self):
        # Arrange
        metadata = IngestMetadata.new_with_defaults(ingest_time=_INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(booking_ids=['BOOKING_ID'])
        ingest_info.bookings.add(booking_id='BOOKING_ID',
                                 total_bond_amount='$100')

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(bookings=[
                Booking.new_with_defaults(
                    admission_date=_INGEST_TIME.date(),
                    admission_date_inferred=True,
                    first_seen_time=_INGEST_TIME,
                    last_seen_time=_INGEST_TIME,
                    external_id='BOOKING_ID',
                    custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                    charges=[
                        Charge.new_with_defaults(
                            status=ChargeStatus.PRESENT_WITHOUT_INFO,
                            bond=Bond.new_with_defaults(
                                status=BondStatus.PRESENT_WITHOUT_INFO,
                                bond_type=BondType.CASH,
                                amount_dollars=100))
                    ])
            ])
        ]

        self.assertEqual(result, expected_result)
예제 #4
0
    def testConvert_PersonInferredBooking(self):
        # Arrange
        metadata = IngestMetadata.new_with_defaults(ingest_time=_INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add()

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                bookings=[
                    Booking.new_with_defaults(
                        admission_date_inferred=True,
                        first_seen_time=_INGEST_TIME,
                        last_seen_time=_INGEST_TIME,
                        admission_date=_INGEST_TIME.date(),
                        custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                    )
                ]
            )
        ]

        self.assertEqual(result, expected_result)
 def test_class_id_name_county_entity_sample(self):
     self.assertEqual('person_id',
                      Person.get_class_id_name())
     self.assertEqual('booking_id',
                      Booking.get_class_id_name())
     self.assertEqual('hold_id',
                      Hold.get_class_id_name())
예제 #6
0
    def testConvert_FullIngestInfo_GeneratedIds(self):
        # Arrange
        metadata = IngestMetadata('REGION', _JURISDICTION_ID, _INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(person_id='PERSON_ID_GENERATE',
                               booking_ids=['BOOKING_ID_GENERATE'])
        ingest_info.bookings.add(
            booking_id='BOOKING_ID_GENERATE',
            arrest_id='ARREST_ID_GENERATE',
            hold_ids=['HOLD_ID_1_GENERATE', 'HOLD_ID_2_GENERATE'],
            charge_ids=['CHARGE_ID_GENERATE'])
        ingest_info.holds.add(hold_id='HOLD_ID_1_GENERATE',
                              jurisdiction_name='jurisdiction')
        ingest_info.holds.add(hold_id='HOLD_ID_2_GENERATE',
                              jurisdiction_name='jurisdiction')
        ingest_info.arrests.add(arrest_id='ARREST_ID_GENERATE', agency='PD')
        ingest_info.charges.add(charge_id='CHARGE_ID_GENERATE',
                                name='DUI',
                                bond_id='BOND_ID_GENERATE',
                                sentence_id='SENTENCE_ID_GENERATE')
        ingest_info.bonds.add(bond_id='BOND_ID_GENERATE')
        ingest_info.sentences.add(sentence_id='SENTENCE_ID_GENERATE',
                                  is_life='True')

        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                region='REGION',
                jurisdiction_id='JURISDICTION_ID',
                bookings=[
                    Booking.new_with_defaults(
                        admission_date=_INGEST_TIME.date(),
                        admission_date_inferred=True,
                        first_seen_time=_INGEST_TIME,
                        last_seen_time=_INGEST_TIME,
                        custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                        arrest=Arrest.new_with_defaults(agency='PD'),
                        holds=[
                            Hold.new_with_defaults(
                                jurisdiction_name='JURISDICTION',
                                status=HoldStatus.PRESENT_WITHOUT_INFO)
                        ],
                        charges=[
                            Charge.new_with_defaults(
                                status=ChargeStatus.PRESENT_WITHOUT_INFO,
                                name='DUI',
                                bond=Bond.new_with_defaults(
                                    status=BondStatus.PRESENT_WITHOUT_INFO),
                                sentence=Sentence.new_with_defaults(
                                    status=SentenceStatus.PRESENT_WITHOUT_INFO,
                                    is_life=True))
                        ])
                ])
        ]

        self.assertEqual(result, expected_result)
 def test_get_id_county_entity_sample(self):
     self.assertEqual(123,
                      Person.new_with_defaults(person_id=123).get_id())
     self.assertEqual(456,
                      Booking.new_with_defaults(booking_id=456).get_id())
     self.assertEqual(789,
                      Hold.new_with_defaults(hold_id=789).get_id())
     self.assertIsNone(Charge.new_with_defaults().get_id())
예제 #8
0
def match_arrest(*, db_booking: entities.Booking,
                 ingested_booking: entities.Booking):
    """
    Matches the arrest from the |db_booking| to the arrest on the
    |ingested_booking| if both exist. If there is a match, the primary key is
    added to the |ingested_booking|.
    """
    if not db_booking.arrest:
        return

    if not ingested_booking.arrest:
        ingested_booking.arrest = entities.Arrest.new_with_defaults(
            arrest_id=db_booking.arrest.arrest_id, )
        return

    ingested_booking.arrest.arrest_id = db_booking.arrest.arrest_id
예제 #9
0
    def testConvert_TotalBondWithCharge_SetsTotalBondOnCharge(self):
        # Arrange
        metadata = FakeIngestMetadata.for_county(
            region="REGION",
            jurisdiction_id="JURISDICTION_ID",
            ingest_time=_INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(booking_ids=["BOOKING_ID"])
        ingest_info.bookings.add(booking_id="BOOKING_ID",
                                 total_bond_amount="$100",
                                 charge_ids=["CHARGE_ID"])
        ingest_info.charges.add(charge_id="CHARGE_ID")

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                region="REGION",
                jurisdiction_id="JURISDICTION_ID",
                bookings=[
                    Booking.new_with_defaults(
                        external_id="BOOKING_ID",
                        admission_date=_INGEST_TIME.date(),
                        admission_date_inferred=True,
                        first_seen_time=_INGEST_TIME,
                        last_seen_time=_INGEST_TIME,
                        custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                        charges=[
                            Charge.new_with_defaults(
                                external_id="CHARGE_ID_COUNT_1",
                                status=ChargeStatus.PRESENT_WITHOUT_INFO,
                                bond=Bond.new_with_defaults(
                                    amount_dollars=100,
                                    status=BondStatus.PRESENT_WITHOUT_INFO,
                                    bond_type=BondType.CASH,
                                ),
                            )
                        ],
                    )
                ],
            )
        ]

        self.assertEqual(result, expected_result)
예제 #10
0
    def testConvert_MultipleCountsOfCharge_CreatesDuplicateCharges(self):
        # Arrange
        metadata = IngestMetadata.new_with_defaults(ingest_time=_INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(booking_ids=['BOOKING_ID'])
        ingest_info.bookings.add(booking_id='BOOKING_ID',
                                 charge_ids=['CHARGE_ID'])
        ingest_info.charges.add(charge_id='CHARGE_ID',
                                name='CHARGE_NAME',
                                number_of_counts='3',
                                bond_id='BOND_ID')
        ingest_info.bonds.add(bond_id='BOND_ID')

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_duplicate_charge = Charge.new_with_defaults(
            external_id='CHARGE_ID_COUNT_1',
            status=ChargeStatus.PRESENT_WITHOUT_INFO,
            name='CHARGE_NAME')
        expected_bond = Bond.new_with_defaults(
            external_id='BOND_ID', status=BondStatus.PRESENT_WITHOUT_INFO)
        expected_result = [
            Person.new_with_defaults(bookings=[
                Booking.new_with_defaults(
                    external_id='BOOKING_ID',
                    last_seen_time=_INGEST_TIME,
                    first_seen_time=_INGEST_TIME,
                    admission_date_inferred=True,
                    admission_date=_INGEST_TIME.date(),
                    custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                    charges=[
                        attr.evolve(expected_duplicate_charge,
                                    external_id='CHARGE_ID_COUNT_1',
                                    bond=expected_bond),
                        attr.evolve(expected_duplicate_charge,
                                    external_id='CHARGE_ID_COUNT_2',
                                    bond=expected_bond),
                        attr.evolve(expected_duplicate_charge,
                                    external_id='CHARGE_ID_COUNT_3',
                                    bond=expected_bond),
                    ])
            ])
        ]

        self.assertEqual(result, expected_result)

        # Assert that the expanded charges, while containing duplicate
        # information, are actually different objects.

        # For some reason, pylint is having trouble identifying that you can
        # index into the result list even though the revealed type is a list.
        # pylint: disable=unsubscriptable-object
        result_expanded_charges = result[0].bookings[0].charges

        charges_grouped_by_id = list(
            itertools.groupby(result_expanded_charges, key=id))
        self.assertEqual(len(result_expanded_charges),
                         len(charges_grouped_by_id))

        # Assert that the bond belonging to each charge is the same object.
        bonds = [charge.bond for charge in result_expanded_charges]
        self.assertTrue(all(bond is bonds[0] for bond in bonds))
예제 #11
0
    def testConvert_FullIngestInfo_NoOpenBookings(self):
        # Arrange
        metadata = IngestMetadata('REGION', _JURISDICTION_ID, _INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(person_id='PERSON_ID',
                               full_name='TEST',
                               birthdate=str(_BIRTHDATE),
                               booking_ids=['BOOKING_ID'])
        ingest_info.bookings.add(booking_id='BOOKING_ID',
                                 arrest_id='ARREST_ID',
                                 release_date=str(_RELEASE_DATE),
                                 charge_ids=['CHARGE_ID'])
        ingest_info.arrests.add(arrest_id='ARREST_ID', agency='PD')
        ingest_info.charges.add(charge_id='CHARGE_ID',
                                name='DUI',
                                bond_id='BOND_ID',
                                sentence_id='SENTENCE_ID')
        ingest_info.bonds.add(bond_id='BOND_ID')
        ingest_info.sentences.add(sentence_id='SENTENCE_ID', is_life='True')

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                external_id='PERSON_ID',
                region='REGION',
                jurisdiction_id='JURISDICTION_ID',
                birthdate=_BIRTHDATE_SCRUBBED,
                birthdate_inferred_from_age=False,
                bookings=[
                    Booking.new_with_defaults(
                        external_id='BOOKING_ID',
                        admission_date=_INGEST_TIME.date(),
                        admission_date_inferred=True,
                        release_date=_RELEASE_DATE,
                        release_date_inferred=False,
                        last_seen_time=_INGEST_TIME,
                        first_seen_time=_INGEST_TIME,
                        custody_status=CustodyStatus.RELEASED,
                        arrest=Arrest.new_with_defaults(
                            external_id='ARREST_ID', agency='PD'),
                        charges=[
                            Charge.new_with_defaults(
                                external_id='CHARGE_ID_COUNT_1',
                                status=ChargeStatus.PRESENT_WITHOUT_INFO,
                                name='DUI',
                                bond=Bond.new_with_defaults(
                                    external_id='BOND_ID',
                                    status=BondStatus.PRESENT_WITHOUT_INFO),
                                sentence=Sentence.new_with_defaults(
                                    status=SentenceStatus.PRESENT_WITHOUT_INFO,
                                    external_id='SENTENCE_ID',
                                    is_life=True))
                        ])
                ])
        ]

        self.assertEqual(result, expected_result)
예제 #12
0
    def testConvert_FullIngestInfo(self):
        # Arrange
        metadata = IngestMetadata(
            "REGION", _JURISDICTION_ID, _INGEST_TIME, facility_id=_FACILITY_ID
        )

        ingest_info = IngestInfo()
        ingest_info.people.add(person_id="PERSON_ID", booking_ids=["BOOKING_ID"])
        ingest_info.bookings.add(
            booking_id="BOOKING_ID", arrest_id="ARREST_ID", charge_ids=["CHARGE_ID"]
        )
        ingest_info.arrests.add(arrest_id="ARREST_ID", agency="PD")
        ingest_info.charges.add(
            charge_id="CHARGE_ID",
            name="DUI",
            bond_id="BOND_ID",
            sentence_id="SENTENCE_ID",
        )
        ingest_info.bonds.add(bond_id="BOND_ID")
        ingest_info.sentences.add(sentence_id="SENTENCE_ID", is_life="True")

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                external_id="PERSON_ID",
                region="REGION",
                jurisdiction_id="JURISDICTION_ID",
                bookings=[
                    Booking.new_with_defaults(
                        external_id="BOOKING_ID",
                        facility_id=_FACILITY_ID,
                        admission_date=_INGEST_TIME.date(),
                        admission_date_inferred=True,
                        first_seen_time=_INGEST_TIME,
                        last_seen_time=_INGEST_TIME,
                        custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                        arrest=Arrest.new_with_defaults(
                            external_id="ARREST_ID", agency="PD"
                        ),
                        charges=[
                            Charge.new_with_defaults(
                                external_id="CHARGE_ID_COUNT_1",
                                status=ChargeStatus.PRESENT_WITHOUT_INFO,
                                name="DUI",
                                bond=Bond.new_with_defaults(
                                    external_id="BOND_ID",
                                    status=BondStatus.PRESENT_WITHOUT_INFO,
                                ),
                                sentence=Sentence.new_with_defaults(
                                    status=SentenceStatus.PRESENT_WITHOUT_INFO,
                                    external_id="SENTENCE_ID",
                                    is_life=True,
                                ),
                            )
                        ],
                    )
                ],
            )
        ]

        self.assertEqual(result, expected_result)
예제 #13
0
    def testConvert_FullIngestInfo_GeneratedIds(self):
        # Arrange
        metadata = IngestMetadata("REGION", _JURISDICTION_ID, _INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(
            person_id="PERSON_ID_GENERATE", booking_ids=["BOOKING_ID_GENERATE"]
        )
        ingest_info.bookings.add(
            booking_id="BOOKING_ID_GENERATE",
            arrest_id="ARREST_ID_GENERATE",
            hold_ids=["HOLD_ID_1_GENERATE", "HOLD_ID_2_GENERATE"],
            charge_ids=["CHARGE_ID_GENERATE"],
        )
        ingest_info.holds.add(
            hold_id="HOLD_ID_1_GENERATE", jurisdiction_name="jurisdiction"
        )
        ingest_info.holds.add(
            hold_id="HOLD_ID_2_GENERATE", jurisdiction_name="jurisdiction"
        )
        ingest_info.arrests.add(arrest_id="ARREST_ID_GENERATE", agency="PD")
        ingest_info.charges.add(
            charge_id="CHARGE_ID_GENERATE",
            name="DUI",
            bond_id="BOND_ID_GENERATE",
            sentence_id="SENTENCE_ID_GENERATE",
        )
        ingest_info.bonds.add(bond_id="BOND_ID_GENERATE")
        ingest_info.sentences.add(sentence_id="SENTENCE_ID_GENERATE", is_life="True")

        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                region="REGION",
                jurisdiction_id="JURISDICTION_ID",
                bookings=[
                    Booking.new_with_defaults(
                        admission_date=_INGEST_TIME.date(),
                        admission_date_inferred=True,
                        first_seen_time=_INGEST_TIME,
                        last_seen_time=_INGEST_TIME,
                        custody_status=CustodyStatus.PRESENT_WITHOUT_INFO,
                        arrest=Arrest.new_with_defaults(agency="PD"),
                        holds=[
                            Hold.new_with_defaults(
                                jurisdiction_name="JURISDICTION",
                                status=HoldStatus.PRESENT_WITHOUT_INFO,
                            )
                        ],
                        charges=[
                            Charge.new_with_defaults(
                                status=ChargeStatus.PRESENT_WITHOUT_INFO,
                                name="DUI",
                                bond=Bond.new_with_defaults(
                                    status=BondStatus.PRESENT_WITHOUT_INFO
                                ),
                                sentence=Sentence.new_with_defaults(
                                    status=SentenceStatus.PRESENT_WITHOUT_INFO,
                                    is_life=True,
                                ),
                            )
                        ],
                    )
                ],
            )
        ]

        self.assertEqual(result, expected_result)
예제 #14
0
    def testConvert_FullIngestInfo_NoOpenBookings(self):
        # Arrange
        metadata = FakeIngestMetadata.for_county(
            region="REGION",
            jurisdiction_id=_JURISDICTION_ID,
            ingest_time=_INGEST_TIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(
            person_id="PERSON_ID",
            full_name="TEST",
            birthdate=str(_BIRTHDATE),
            booking_ids=["BOOKING_ID"],
        )
        ingest_info.bookings.add(
            booking_id="BOOKING_ID",
            arrest_id="ARREST_ID",
            release_date=str(_RELEASE_DATE),
            charge_ids=["CHARGE_ID"],
        )
        ingest_info.arrests.add(arrest_id="ARREST_ID", agency="PD")
        ingest_info.charges.add(
            charge_id="CHARGE_ID",
            name="DUI",
            bond_id="BOND_ID",
            sentence_id="SENTENCE_ID",
        )
        ingest_info.bonds.add(bond_id="BOND_ID")
        ingest_info.sentences.add(sentence_id="SENTENCE_ID", is_life="True")

        # Act
        result = self._convert_and_throw_on_errors(ingest_info, metadata)

        # Assert
        expected_result = [
            Person.new_with_defaults(
                external_id="PERSON_ID",
                region="REGION",
                jurisdiction_id="JURISDICTION_ID",
                birthdate=_BIRTHDATE_SCRUBBED,
                birthdate_inferred_from_age=False,
                bookings=[
                    Booking.new_with_defaults(
                        external_id="BOOKING_ID",
                        admission_date=_INGEST_TIME.date(),
                        admission_date_inferred=True,
                        release_date=_RELEASE_DATE,
                        release_date_inferred=False,
                        last_seen_time=_INGEST_TIME,
                        first_seen_time=_INGEST_TIME,
                        custody_status=CustodyStatus.RELEASED,
                        arrest=Arrest.new_with_defaults(
                            external_id="ARREST_ID", agency="PD"),
                        charges=[
                            Charge.new_with_defaults(
                                external_id="CHARGE_ID_COUNT_1",
                                status=ChargeStatus.PRESENT_WITHOUT_INFO,
                                name="DUI",
                                bond=Bond.new_with_defaults(
                                    external_id="BOND_ID",
                                    status=BondStatus.PRESENT_WITHOUT_INFO,
                                ),
                                sentence=Sentence.new_with_defaults(
                                    status=SentenceStatus.PRESENT_WITHOUT_INFO,
                                    external_id="SENTENCE_ID",
                                    is_life=True,
                                ),
                            )
                        ],
                    )
                ],
            )
        ]

        self.assertEqual(result, expected_result)
예제 #15
0
 def test_get_entity_name_county_entity_sample(self) -> None:
     self.assertEqual("person",
                      Person.new_with_defaults().get_entity_name())
     self.assertEqual("booking",
                      Booking.new_with_defaults().get_entity_name())
     self.assertEqual("hold", Hold.new_with_defaults().get_entity_name())
예제 #16
0
 def test_class_id_name_county_entity_sample(self) -> None:
     self.assertEqual("person_id", Person.get_class_id_name())
     self.assertEqual("booking_id", Booking.get_class_id_name())
     self.assertEqual("hold_id", Hold.get_class_id_name())