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)
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))
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)
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