def test_map_incarceration_combinations_two_stays_same_month_facility( self): person = StatePerson.new_with_defaults( state_code="CA", person_id=12345, birthdate=date(1984, 8, 31), gender=Gender.FEMALE, ) race = StatePersonRace.new_with_defaults(state_code="CA", race=Race.WHITE) person.races = [race] ethnicity = StatePersonEthnicity.new_with_defaults( state_code="CA", ethnicity=Ethnicity.NOT_HISPANIC) person.ethnicities = [ethnicity] incarceration_events = [ IncarcerationStayEvent( state_code="CA", event_date=date(2010, 3, 31), facility="FACILITY 33", county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code=_NCIC_CODE, most_serious_offense_statute=_STATUTE, admission_reason=AdmissionReason.PAROLE_REVOCATION, admission_reason_raw_text="PAROLE_REVOCATION", specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON, ), IncarcerationStayEvent( state_code="CA", event_date=date(2010, 3, 31), facility="FACILITY 18", county_of_residence=_COUNTY_OF_RESIDENCE, admission_reason=AdmissionReason.PAROLE_REVOCATION, admission_reason_raw_text="PAROLE_REVOCATION", specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON, ), ] incarceration_combinations = calculator.map_incarceration_combinations( person=person, incarceration_events=incarceration_events, metric_inclusions=ALL_METRICS_INCLUSIONS_DICT, calculation_end_month=None, calculation_month_count=-1, person_metadata=_DEFAULT_PERSON_METADATA, ) expected_combinations_count = expected_metric_combos_count( incarceration_events) self.assertEqual(expected_combinations_count, len(incarceration_combinations)) assert all(value == 1 for _combination, value in incarceration_combinations)
def test_map_incarceration_combinations_includes_statute_output(self): person = StatePerson.new_with_defaults(person_id=12345, birthdate=date(1984, 8, 31), gender=Gender.FEMALE) race = StatePersonRace.new_with_defaults(state_code='CA', race=Race.WHITE) person.races = [race] ethnicity = StatePersonEthnicity.new_with_defaults( state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC) person.ethnicities = [ethnicity] incarceration_events = [ IncarcerationStayEvent(state_code='CA', event_date=date(2010, 3, 31), facility='FACILITY 33', county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code=_NCIC_CODE, most_serious_offense_statute=_STATUTE), IncarcerationStayEvent(state_code='CA', event_date=date(2010, 4, 30), facility='FACILITY 33', county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code=_NCIC_CODE, most_serious_offense_statute=_STATUTE), IncarcerationStayEvent(state_code='CA', event_date=date(2010, 5, 31), facility='FACILITY 33', county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code=_NCIC_CODE, most_serious_offense_statute=_STATUTE) ] incarceration_combinations = calculator.map_incarceration_combinations( person=person, incarceration_events=incarceration_events, inclusions=ALL_INCLUSIONS_DICT, calculation_month_limit=-1) expected_combinations_count = expected_metric_combos_count( person, incarceration_events, ALL_INCLUSIONS_DICT) self.assertEqual(expected_combinations_count, len(incarceration_combinations)) assert all(value == 1 for _combination, value in incarceration_combinations) assert all( combo.get('most_serious_offense_statute') is not None for combo, value in incarceration_combinations if combo.get('person_id') is not None)
def test_map_incarceration_combinations_two_stays_same_month(self): person = StatePerson.new_with_defaults(person_id=12345, birthdate=date(1984, 8, 31), gender=Gender.FEMALE) race = StatePersonRace.new_with_defaults(state_code='CA', race=Race.WHITE) person.races = [race] ethnicity = StatePersonEthnicity.new_with_defaults( state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC) person.ethnicities = [ethnicity] incarceration_events = [ IncarcerationStayEvent( state_code='CA', event_date=date(2010, 3, 31), facility='FACILITY 33', county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code=_NCIC_CODE, most_serious_offense_statute=_STATUTE, admission_reason=AdmissionReason.PAROLE_REVOCATION, admission_reason_raw_text='PAROLE_REVOCATION', ), IncarcerationStayEvent( state_code='CA', event_date=date(2010, 3, 31), facility='FACILITY 33', county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code=_NCIC_CODE, most_serious_offense_statute=_STATUTE, admission_reason=AdmissionReason.PAROLE_REVOCATION, admission_reason_raw_text='PAROLE_REVOCATION', ) ] incarceration_combinations = calculator.map_incarceration_combinations( person=person, incarceration_events=incarceration_events, inclusions=ALL_INCLUSIONS_DICT, calculation_month_limit=-1) expected_combinations_count = expected_metric_combos_count( person, incarceration_events, ALL_INCLUSIONS_DICT) self.assertEqual(expected_combinations_count, len(incarceration_combinations)) assert all(value == 1 for _combination, value in incarceration_combinations)
def test_map_incarceration_combinations_all_types(self): person = StatePerson.new_with_defaults(person_id=12345, birthdate=date(1984, 8, 31), gender=Gender.FEMALE) race = StatePersonRace.new_with_defaults(state_code='CA', race=Race.WHITE) person.races = [race] ethnicity = StatePersonEthnicity.new_with_defaults( state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC) person.ethnicities = [ethnicity] incarceration_events = [ IncarcerationStayEvent( admission_reason=StateIncarcerationPeriodAdmissionReason. PAROLE_REVOCATION, admission_reason_raw_text='NEW_ADMISSION', supervision_type_at_admission= StateSupervisionPeriodSupervisionType.PAROLE, state_code='CA', event_date=date(2000, 3, 31), facility='SAN QUENTIN', county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_statute=_STATUTE, ), IncarcerationAdmissionEvent( state_code='CA', event_date=date(2000, 3, 12), facility='SAN QUENTIN', county_of_residence=_COUNTY_OF_RESIDENCE, admission_reason=AdmissionReason.PAROLE_REVOCATION, supervision_type_at_admission= StateSupervisionPeriodSupervisionType.PAROLE, admission_reason_raw_text='PAROLE_REVOCATION', specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON), IncarcerationReleaseEvent( state_code='CA', event_date=date(2003, 4, 12), facility='SAN QUENTIN', county_of_residence=_COUNTY_OF_RESIDENCE, ) ] incarceration_combinations = calculator.map_incarceration_combinations( person=person, incarceration_events=incarceration_events, inclusions=ALL_INCLUSIONS_DICT, calculation_month_limit=-1) expected_combinations_count = expected_metric_combos_count( person, incarceration_events, ALL_INCLUSIONS_DICT) self.assertEqual(expected_combinations_count, len(incarceration_combinations)) assert all(value == 1 for _combination, value in incarceration_combinations)
def test_map_incarceration_combinations_multiple_overlapping_stays(self): person = StatePerson.new_with_defaults(person_id=12345, birthdate=date(1984, 8, 31), gender=Gender.FEMALE) race = StatePersonRace.new_with_defaults(state_code='CA', race=Race.WHITE) person.races = [race] ethnicity = StatePersonEthnicity.new_with_defaults( state_code='CA', ethnicity=Ethnicity.NOT_HISPANIC) person.ethnicities = [ethnicity] incarceration_events = [ IncarcerationStayEvent(state_code='US_ND', event_date=date(2019, 11, 30), facility='JRCC', county_of_residence=_COUNTY_OF_RESIDENCE), IncarcerationStayEvent(state_code='US_ND', event_date=date(2019, 11, 30), facility='JRCC', county_of_residence=_COUNTY_OF_RESIDENCE), IncarcerationStayEvent(state_code='US_ND', event_date=date(2019, 11, 30), facility='JRCC', county_of_residence=_COUNTY_OF_RESIDENCE) ] incarceration_combinations = calculator.map_incarceration_combinations( person=person, incarceration_events=incarceration_events, inclusions=ALL_INCLUSIONS_DICT, calculation_month_limit=-1) expected_combinations_count = expected_metric_combos_count( person, incarceration_events, ALL_INCLUSIONS_DICT) self.assertEqual(expected_combinations_count, len(incarceration_combinations)) assert all(value == 1 for _combination, value in incarceration_combinations)
def find_incarceration_stays( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]: """Finds all days for which this person was incarcerated.""" incarceration_stay_events: List[IncarcerationStayEvent] = [] admission_date = incarceration_period.admission_date release_date = incarceration_period.release_date if release_date is None: if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY: # This should not happen after validation. raise ValueError( "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly" " setting missing dates.") # This person is in custody for this period. Set the release date for tomorrow. release_date = date.today() + relativedelta(days=1) if admission_date is None: return incarceration_stay_events supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) sentence_group = _get_sentence_group_for_incarceration_period( incarceration_period) stay_date = admission_date while stay_date < release_date: most_serious_charge = find_most_serious_prior_charge_in_sentence_group( sentence_group, stay_date) most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None incarceration_stay_events.append( IncarcerationStayEvent( state_code=incarceration_period.state_code, event_date=stay_date, facility=incarceration_period.facility, county_of_residence=county_of_residence, most_serious_offense_ncic_code=most_serious_offense_ncic_code, most_serious_offense_statute=most_serious_offense_statute, admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission=supervision_type_at_admission, )) stay_date = stay_date + relativedelta(days=1) return incarceration_stay_events
def find_end_of_month_state_prison_stays( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]: """Finds months for which this person was incarcerated in a state prison on the last day of the month. """ incarceration_stay_events: List[IncarcerationStayEvent] = [] if incarceration_period.incarceration_type != StateIncarcerationType.STATE_PRISON: return incarceration_stay_events admission_date = incarceration_period.admission_date release_date = incarceration_period.release_date if release_date is None: release_date = date.today() if admission_date is None: return incarceration_stay_events supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) sentence_group = _get_sentence_group_for_incarceration_period(incarceration_period) end_of_month = last_day_of_month(admission_date) while end_of_month < release_date: most_serious_charge = find_most_serious_prior_charge_in_sentence_group(sentence_group, end_of_month) most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None incarceration_stay_events.append( IncarcerationStayEvent( state_code=incarceration_period.state_code, event_date=end_of_month, facility=incarceration_period.facility, county_of_residence=county_of_residence, most_serious_offense_ncic_code=most_serious_offense_ncic_code, most_serious_offense_statute=most_serious_offense_statute, admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period.admission_reason_raw_text, supervision_type_at_admission=supervision_type_at_admission, ) ) end_of_month = last_day_of_month(end_of_month + relativedelta(days=1)) return incarceration_stay_events
def find_incarceration_stays( incarceration_sentences: List[StateIncarcerationSentence], supervision_sentences: List[StateSupervisionSentence], incarceration_period: StateIncarcerationPeriod, original_admission_reasons_by_period_id: Dict[int, Tuple[ StateIncarcerationPeriodAdmissionReason, Optional[str]]], incarceration_period_to_judicial_district: Dict[int, Dict[Any, Any]], county_of_residence: Optional[str]) -> List[IncarcerationStayEvent]: """Finds all days for which this person was incarcerated.""" incarceration_stay_events: List[IncarcerationStayEvent] = [] admission_date = incarceration_period.admission_date release_date = incarceration_period.release_date if release_date is None: if incarceration_period.status != StateIncarcerationPeriodStatus.IN_CUSTODY: # This should not happen after validation. raise ValueError( "Unexpected missing release date. _infer_missing_dates_and_statuses is not properly" " setting missing dates.") # This person is in custody for this period. Set the release date for tomorrow. release_date = date.today() + relativedelta(days=1) if admission_date is None: return incarceration_stay_events supervision_type_at_admission = get_pre_incarceration_supervision_type( incarceration_sentences, supervision_sentences, incarceration_period) sentence_group = _get_sentence_group_for_incarceration_period( incarceration_period) judicial_district_code = _get_judicial_district_code( incarceration_period, incarceration_period_to_judicial_district) stay_date = admission_date incarceration_period_id = incarceration_period.incarceration_period_id if not incarceration_period_id: raise ValueError( "Unexpected incarceration period without an incarceration_period_id." ) original_admission_reason, original_admission_reason_raw_text = \ original_admission_reasons_by_period_id[incarceration_period_id] original_admission_reason = state_specific_admission_reason_override( incarceration_period.state_code, original_admission_reason, supervision_type_at_admission) while stay_date < release_date: most_serious_charge = find_most_serious_prior_charge_in_sentence_group( sentence_group, stay_date) most_serious_offense_ncic_code = most_serious_charge.ncic_code if most_serious_charge else None most_serious_offense_statute = most_serious_charge.statute if most_serious_charge else None incarceration_stay_events.append( IncarcerationStayEvent( state_code=incarceration_period.state_code, event_date=stay_date, facility=incarceration_period.facility, county_of_residence=county_of_residence, most_serious_offense_ncic_code=most_serious_offense_ncic_code, most_serious_offense_statute=most_serious_offense_statute, admission_reason=original_admission_reason, admission_reason_raw_text=original_admission_reason_raw_text, supervision_type_at_admission=supervision_type_at_admission, judicial_district_code=judicial_district_code, specialized_purpose_for_incarceration=incarceration_period. specialized_purpose_for_incarceration)) stay_date = stay_date + relativedelta(days=1) return incarceration_stay_events
def testClassifyIncarcerationEvents(self): """Tests the ClassifyIncarcerationEvents DoFn.""" fake_person_id = 12345 fake_person = StatePerson.new_with_defaults( state_code='US_XX', person_id=fake_person_id, gender=Gender.MALE, birthdate=date(1970, 1, 1), residency_status=ResidencyStatus.PERMANENT) incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code='TX', facility='PRISON XX', admission_date=date(2010, 11, 20), admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, release_date=date(2010, 11, 21), release_reason=StateIncarcerationPeriodReleaseReason. SENTENCE_SERVED, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD) incarceration_sentence = StateIncarcerationSentence.new_with_defaults( incarceration_sentence_id=123, incarceration_periods=[incarceration_period], start_date=date(2009, 2, 9), charges=[ StateCharge.new_with_defaults(ncic_code='5699', statute='30A123', offense_date=date(2009, 1, 9)) ]) sentence_group = StateSentenceGroup.new_with_defaults( sentence_group_id=123, incarceration_sentences=[incarceration_sentence]) incarceration_sentence.sentence_group = sentence_group incarceration_period.incarceration_sentences = [incarceration_sentence] fake_person_id_to_county_query_result = [{ 'person_id': fake_person_id, 'county_of_residence': _COUNTY_OF_RESIDENCE }] fake_incarceration_period_judicial_district_association_result = \ {'person_id': fake_person_id, 'incarceration_period_id': 123, 'judicial_district_code': 'NW'} incarceration_events = [ IncarcerationStayEvent( admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission= StateSupervisionPeriodSupervisionType.PROBATION, state_code=incarceration_period.state_code, event_date=incarceration_period.admission_date, facility=incarceration_period.facility, county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code='5699', most_serious_offense_statute='30A123', specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD), IncarcerationAdmissionEvent( state_code=incarceration_period.state_code, event_date=incarceration_period.admission_date, facility=incarceration_period.facility, county_of_residence=_COUNTY_OF_RESIDENCE, admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission= StateSupervisionPeriodSupervisionType.PROBATION, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD), IncarcerationReleaseEvent( state_code=incarceration_period.state_code, event_date=incarceration_period.release_date, facility=incarceration_period.facility, county_of_residence=_COUNTY_OF_RESIDENCE, release_reason=incarceration_period.release_reason, admission_reason=incarceration_period.admission_reason, total_days_incarcerated=( incarceration_period.release_date - incarceration_period.admission_date).days, purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD) ] correct_output = [(fake_person_id, (fake_person, incarceration_events)) ] test_pipeline = TestPipeline() person_id_to_county_kv = ( test_pipeline | "Read person id to county associations from BigQuery" >> beam.Create(fake_person_id_to_county_query_result) | "Convert to KV" >> beam.ParDo(ConvertDictToKVTuple(), 'person_id')) person_entities = { 'person': [fake_person], 'sentence_groups': [sentence_group], 'incarceration_period_judicial_district_association': [fake_incarceration_period_judicial_district_association_result] } output = (test_pipeline | beam.Create([(fake_person_id, person_entities)]) | 'Identify Incarceration Events' >> beam.ParDo( pipeline.ClassifyIncarcerationEvents(), AsDict(person_id_to_county_kv))) assert_that(output, equal_to(correct_output)) test_pipeline.run()
def testClassifyIncarcerationEvents(self): """Tests the ClassifyIncarcerationEvents DoFn.""" fake_person_id = 12345 fake_person = StatePerson.new_with_defaults( state_code="US_XX", person_id=fake_person_id, gender=Gender.MALE, birthdate=date(1970, 1, 1), residency_status=ResidencyStatus.PERMANENT, ) incarceration_period = StateIncarcerationPeriod.new_with_defaults( incarceration_period_id=1111, incarceration_type=StateIncarcerationType.STATE_PRISON, status=StateIncarcerationPeriodStatus.NOT_IN_CUSTODY, state_code="TX", facility="PRISON XX", admission_date=date(2010, 11, 20), admission_reason=StateIncarcerationPeriodAdmissionReason. PROBATION_REVOCATION, release_date=date(2010, 11, 21), release_reason=StateIncarcerationPeriodReleaseReason. SENTENCE_SERVED, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD, ) incarceration_sentence = StateIncarcerationSentence.new_with_defaults( state_code="US_XX", incarceration_sentence_id=123, status=StateSentenceStatus.PRESENT_WITHOUT_INFO, incarceration_periods=[incarceration_period], start_date=date(2009, 2, 9), charges=[ StateCharge.new_with_defaults( state_code="US_XX", status=ChargeStatus.PRESENT_WITHOUT_INFO, ncic_code="5699", statute="30A123", offense_date=date(2009, 1, 9), ) ], ) sentence_group = StateSentenceGroup.new_with_defaults( state_code="US_XX", status=StateSentenceStatus.PRESENT_WITHOUT_INFO, sentence_group_id=123, incarceration_sentences=[incarceration_sentence], ) incarceration_sentence.sentence_group = sentence_group incarceration_period.incarceration_sentences = [incarceration_sentence] fake_person_id_to_county_query_result = { "person_id": fake_person_id, "county_of_residence": _COUNTY_OF_RESIDENCE, } fake_incarceration_period_judicial_district_association_result = { "person_id": fake_person_id, "incarceration_period_id": 123, "judicial_district_code": "NW", } incarceration_events = [ IncarcerationStayEvent( admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission= StateSupervisionPeriodSupervisionType.PROBATION, state_code=incarceration_period.state_code, event_date=incarceration_period.admission_date, facility=incarceration_period.facility, county_of_residence=_COUNTY_OF_RESIDENCE, most_serious_offense_ncic_code="5699", most_serious_offense_statute="30A123", specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD, ), IncarcerationAdmissionEvent( state_code=incarceration_period.state_code, event_date=incarceration_period.admission_date, facility=incarceration_period.facility, county_of_residence=_COUNTY_OF_RESIDENCE, admission_reason=incarceration_period.admission_reason, admission_reason_raw_text=incarceration_period. admission_reason_raw_text, supervision_type_at_admission= StateSupervisionPeriodSupervisionType.PROBATION, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD, ), IncarcerationReleaseEvent( state_code=incarceration_period.state_code, event_date=incarceration_period.release_date, facility=incarceration_period.facility, county_of_residence=_COUNTY_OF_RESIDENCE, release_reason=incarceration_period.release_reason, admission_reason=incarceration_period.admission_reason, total_days_incarcerated=( incarceration_period.release_date - incarceration_period.admission_date).days, purpose_for_incarceration= StateSpecializedPurposeForIncarceration.PAROLE_BOARD_HOLD, ), ] correct_output = [(fake_person_id, (fake_person, incarceration_events)) ] test_pipeline = TestPipeline() person_entities = { "person": [fake_person], "sentence_groups": [sentence_group], "incarceration_period_judicial_district_association": [fake_incarceration_period_judicial_district_association_result], "persons_to_recent_county_of_residence": [fake_person_id_to_county_query_result], } output = (test_pipeline | beam.Create([(fake_person_id, person_entities)]) | "Identify Incarceration Events" >> beam.ParDo( pipeline.ClassifyIncarcerationEvents())) assert_that(output, equal_to(correct_output)) test_pipeline.run()
def test_map_incarceration_combinations_multiple_overlapping_stays(self): person = StatePerson.new_with_defaults( state_code="US_ND", person_id=12345, birthdate=date(1984, 8, 31), gender=Gender.FEMALE, ) race = StatePersonRace.new_with_defaults(state_code="US_ND", race=Race.WHITE) person.races = [race] ethnicity = StatePersonEthnicity.new_with_defaults( state_code="US_ND", ethnicity=Ethnicity.NOT_HISPANIC) person.ethnicities = [ethnicity] incarceration_events = [ IncarcerationStayEvent( state_code="US_ND", event_date=date(2019, 11, 30), facility="JRCC", county_of_residence=_COUNTY_OF_RESIDENCE, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON, ), IncarcerationStayEvent( state_code="US_ND", event_date=date(2019, 11, 30), facility="JRCC", county_of_residence=_COUNTY_OF_RESIDENCE, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON, ), IncarcerationStayEvent( state_code="US_ND", event_date=date(2019, 11, 30), facility="JRCC", county_of_residence=_COUNTY_OF_RESIDENCE, specialized_purpose_for_incarceration= StateSpecializedPurposeForIncarceration.TREATMENT_IN_PRISON, ), ] incarceration_combinations = calculator.map_incarceration_combinations( person=person, incarceration_events=incarceration_events, metric_inclusions=ALL_METRICS_INCLUSIONS_DICT, calculation_end_month=None, calculation_month_count=-1, person_metadata=_DEFAULT_PERSON_METADATA, ) expected_combinations_count = expected_metric_combos_count( incarceration_events) self.assertEqual(expected_combinations_count, len(incarceration_combinations)) assert all(value == 1 for _combination, value in incarceration_combinations)