def test_duplicate_ids(self):
        # Arrange
        ingest_info = IngestInfo()
        ingest_info.people.extend([
            Person(person_id=PERSON_1),
            Person(person_id=PERSON_1),
            Person(person_id=PERSON_1, booking_ids=[BOOKING_1, BOOKING_2]),
        ])
        ingest_info.bookings.extend([
            Booking(booking_id=BOOKING_1),
            Booking(booking_id=BOOKING_1, charge_ids=[CHARGE_1, CHARGE_2]),
            Booking(booking_id=BOOKING_2, arrest_id=ARREST_1),
            Booking(booking_id=BOOKING_2, arrest_id=ARREST_2),
        ])
        ingest_info.arrests.extend([
            Arrest(arrest_id=ARREST_1),
            Arrest(arrest_id=ARREST_1),
            Arrest(arrest_id=ARREST_2),
        ])
        ingest_info.charges.extend(
            [Charge(charge_id=CHARGE_1),
             Charge(charge_id=CHARGE_2)])

        # Act
        with pytest.raises(ValidationError) as e:
            ingest_info_validator.validate(ingest_info)
        result = e.value.errors

        # Assert
        expected_result = {
            "people": {
                "duplicate_ids": {PERSON_1},
            },
            "bookings": {
                "duplicate_ids": {BOOKING_1, BOOKING_2}
            },
            "arrests": {
                "duplicate_ids": {ARREST_1}
            },
        }

        self.assertEqual(result, expected_result)
예제 #2
0
    def testEnumFromOriginalFieldIsPreferred(self):
        enum_fields = {
            "charge_class": ChargeClass,
            "status": ChargeStatus,
        }
        proto = Charge(charge_class="O", status="VIOLATION")

        overrides_builder = EnumOverrides.Builder()
        overrides_builder.add("O", ChargeClass.PROBATION_VIOLATION)
        overrides_builder.add("VIOLATION", ChargeClass.INFRACTION,
                              ChargeStatus)
        enum_mappings = EnumMappings(proto, enum_fields,
                                     overrides_builder.build())

        self.assertEqual(ChargeClass.PROBATION_VIOLATION,
                         enum_mappings.get(ChargeClass))
예제 #3
0
    def testMultipleMappingsFails(self):
        enum_fields = {
            "degree": ChargeDegree,
            "status": ChargeStatus,
        }
        proto = Charge(degree="O", status="VIOLATION")

        overrides_builder = EnumOverrides.Builder()
        overrides_builder.add("O", ChargeClass.PROBATION_VIOLATION,
                              ChargeDegree)
        overrides_builder.add("VIOLATION", ChargeClass.INFRACTION,
                              ChargeStatus)
        enum_mappings = EnumMappings(proto, enum_fields,
                                     overrides_builder.build())

        with self.assertRaises(ValueError):
            enum_mappings.get(ChargeClass)
    def testMultipleMappingsFails(self):
        enum_fields = {
            'degree': ChargeDegree,
            'status': ChargeStatus,
        }
        proto = Charge(degree='O', status='VIOLATION')

        overrides_builder = EnumOverrides.Builder()
        overrides_builder.add('O', ChargeClass.PROBATION_VIOLATION,
                              ChargeDegree)
        overrides_builder.add('VIOLATION', ChargeClass.INFRACTION,
                              ChargeStatus)
        enum_mappings = EnumMappings(proto, enum_fields,
                                     overrides_builder.build())

        with self.assertRaises(ValueError):
            enum_mappings.get(ChargeClass)
    def test_reports_all_errors_together(self):
        # Arrange
        ingest_info = IngestInfo()
        ingest_info.people.extend([
            Person(person_id=PERSON_1, booking_ids=[MISSING_BOOKING]),
            Person(person_id=PERSON_1, booking_ids=[BOOKING_1]),
            Person(person_id=PERSON_1, booking_ids=[BOOKING_1, BOOKING_2]),
            Person(person_id=EXTRA_PERSON),
        ])
        ingest_info.bookings.extend([
            Booking(booking_id=BOOKING_1),
            Booking(booking_id=BOOKING_1, arrest_id=MISSING_ARREST),
            Booking(
                booking_id=BOOKING_2,
                arrest_id=ARREST_1,
                charge_ids=[CHARGE_1, CHARGE_2, MISSING_CHARGE],
            ),
            Booking(booking_id=EXTRA_BOOKING),
        ])
        ingest_info.arrests.extend([
            Arrest(arrest_id=ARREST_1),
            Arrest(arrest_id=ARREST_1),
            Arrest(arrest_id=EXTRA_ARREST),
        ])
        ingest_info.charges.extend([
            Charge(charge_id=CHARGE_1),
            Charge(charge_id=CHARGE_1, sentence_id=SENTENCE_1, bond_id=BOND_1),
            Charge(
                charge_id=CHARGE_2,
                sentence_id=MISSING_SENTENCE,
                bond_id=MISSING_BOND,
            ),
            Charge(charge_id=EXTRA_CHARGE),
        ])
        ingest_info.bonds.extend([
            Bond(bond_id=BOND_1),
            Bond(bond_id=BOND_1),
            Bond(bond_id=EXTRA_BOND)
        ])
        ingest_info.sentences.extend([
            Sentence(sentence_id=SENTENCE_1),
            Sentence(sentence_id=SENTENCE_1),
            Sentence(sentence_id=EXTRA_SENTENCE),
        ])

        # Act
        with pytest.raises(ValidationError) as e:
            ingest_info_validator.validate(ingest_info)
        result = e.value.errors

        # Assert
        expected_result = {
            "people": {
                "duplicate_ids": {PERSON_1}
            },
            "bookings": {
                "duplicate_ids": {BOOKING_1},
                "ids_referenced_that_do_not_exist": {MISSING_BOOKING},
                "ids_never_referenced": {EXTRA_BOOKING},
            },
            "arrests": {
                "duplicate_ids": {ARREST_1},
                "ids_referenced_that_do_not_exist": {MISSING_ARREST},
                "ids_never_referenced": {EXTRA_ARREST},
            },
            "charges": {
                "duplicate_ids": {CHARGE_1},
                "ids_referenced_that_do_not_exist": {MISSING_CHARGE},
                "ids_never_referenced": {EXTRA_CHARGE},
            },
            "sentences": {
                "duplicate_ids": {SENTENCE_1},
                "ids_referenced_that_do_not_exist": {MISSING_SENTENCE},
                "ids_never_referenced": {EXTRA_SENTENCE},
            },
            "bonds": {
                "duplicate_ids": {BOND_1},
                "ids_referenced_that_do_not_exist": {MISSING_BOND},
                "ids_never_referenced": {EXTRA_BOND},
            },
        }

        self.assertEqual(result, expected_result)
예제 #6
0
    def test_readPersonAndAllRelationships(self):
        # Arrange
        metadata = IngestMetadata.new_with_defaults(
            region=REGION_1,
            jurisdiction_id=JURISDICTION_ID,
            ingest_time=SCRAPER_START_DATETIME)

        ingest_info = IngestInfo()
        ingest_info.people.add(full_name=FULL_NAME_1,
                               booking_ids=['BOOKING_ID'])
        ingest_info.bookings.add(booking_id='BOOKING_ID',
                                 facility=FACILITY,
                                 custody_status=BOOKING_CUSTODY_STATUS,
                                 arrest_id='ARREST_ID',
                                 charge_ids=['CHARGE_ID_1', 'CHARGE_ID_2'])
        ingest_info.arrests.add(arrest_id='ARREST_ID',
                                officer_name=OFFICER_NAME)

        ingest_info.bonds.add(bond_id='SHARED_BOND_ID',
                              bond_type=BOND_TYPE,
                              status=BOND_STATUS)

        ingest_info.charges.extend([
            Charge(charge_id='CHARGE_ID_1',
                   name=CHARGE_NAME_1,
                   status=CHARGE_STATUS,
                   bond_id='SHARED_BOND_ID',
                   sentence_id='SENTENCE_ID_1'),
            Charge(charge_id='CHARGE_ID_2',
                   name=CHARGE_NAME_2,
                   status=CHARGE_STATUS,
                   bond_id='SHARED_BOND_ID',
                   sentence_id='SENTENCE_ID_2')
        ])

        ingest_info.sentences.extend([
            Sentence(sentence_id='SENTENCE_ID_1',
                     fine_dollars=FINE_1,
                     status=SENTENCE_STATUS),
            Sentence(sentence_id='SENTENCE_ID_2',
                     fine_dollars=FINE_2,
                     status=SENTENCE_STATUS)
        ])

        # Act
        persistence.write(ingest_info, metadata)
        result = county_dao.read_people(
            SessionFactory.for_schema_base(JailsBase))

        # Assert
        assert len(result) == 1
        result_person = result[0]
        assert result_person.full_name == _format_full_name(FULL_NAME_1)

        assert len(result_person.bookings) == 1
        result_booking = result_person.bookings[0]
        assert result_booking.facility == FACILITY
        assert result_booking.last_seen_time == SCRAPER_START_DATETIME

        result_arrest = result_booking.arrest
        assert result_arrest.officer_name == OFFICER_NAME

        result_charges = result_booking.charges
        assert len(result_charges) == 2
        assert result_charges[0].name == CHARGE_NAME_1
        assert result_charges[1].name == CHARGE_NAME_2

        bond_1 = result_charges[0].bond
        bond_2 = result_charges[1].bond
        assert bond_1.bond_type == bond_2.bond_type

        sentence_1 = result_charges[0].sentence
        sentence_2 = result_charges[1].sentence
        assert sentence_1.fine_dollars == FINE_1_INT
        assert sentence_2.fine_dollars == FINE_2_INT