def test_felony_c_conviction():
    charge = ChargeFactory.create(name="Theft in the first degree",
                                  statute="164.055",
                                  level="Felony Class C",
                                  disposition=Dispositions.CONVICTED)

    assert isinstance(charge.charge_type, FelonyClassC)
    assert charge.type_eligibility.status is EligibilityStatus.ELIGIBLE
    assert charge.type_eligibility.reason == "Eligible under 137.225(1)(b)"
def test_felony_c_dismissal():
    charge = ChargeFactory.create(name="Theft in the first degree",
                                  statute="164.055",
                                  level="Felony Class C",
                                  disposition=Dispositions.DISMISSED)

    assert isinstance(charge.charge_type, DismissedCharge)
    assert charge.type_eligibility.status is EligibilityStatus.ELIGIBLE
    assert charge.type_eligibility.reason == "Dismissals are generally eligible under 137.225(1)(d)"
Esempio n. 3
0
def test_arrest_is_unaffected_if_conviction_eligibility_is_older():
    violation_charge = ChargeFactory.create(
        level="Class A Violation",
        date=Time.TEN_YEARS_AGO,
        disposition=Disposition(ruling="Convicted",
                                date=Time.LESS_THAN_THREE_YEARS_AGO),
    )
    arrest = ChargeFactory.create(
        disposition=Disposition(ruling="Dismissed", date=Time.ONE_YEAR_AGO))

    case = CaseFactory.create()
    case.charges = [violation_charge, arrest]
    expunger = Expunger(Record([case]))
    expunger.run()

    assert arrest.expungement_result.time_eligibility.status is EligibilityStatus.ELIGIBLE
    assert arrest.expungement_result.time_eligibility.date_will_be_eligible == arrest.date
    assert arrest.expungement_result.time_eligibility.reason == ""
Esempio n. 4
0
def test_violation_convicted():
    charge = ChargeFactory.create(name="Viol Treatment",
                                  statute="1615662",
                                  level="Violation Unclassified",
                                  disposition=Dispositions.CONVICTED)

    assert isinstance(charge.charge_type, Violation)
    assert charge.type_eligibility.status is EligibilityStatus.ELIGIBLE
    assert charge.type_eligibility.reason == "Eligible under 137.225(5)(d)"
Esempio n. 5
0
def test_no_dispo_violation_is_not_type_eligible():
    charge = ChargeFactory.create(statute="801.000", level="Class C Traffic Violation", disposition=None)

    assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert (
        charge.type_eligibility.reason
        == "Always ineligible under 137.225(7)(a) (for convictions) or by omission from statute (for dismissals)"
    )
    assert not charge.blocks_other_charges()
Esempio n. 6
0
def test_charge_with_unrecognized_disposition_eligibility():
    charge = ChargeFactory.create(level="Felony Class B",
                                  disposition=DispositionCreator.create(
                                      ruling="What am I",
                                      date=date(2001, 1, 1)))
    assert not charge.convicted()
    assert not charge.dismissed()
    assert charge.type_eligibility.status is EligibilityStatus.NEEDS_MORE_ANALYSIS
    assert charge.type_eligibility.reason == "Disposition not recognized. Needs further analysis"
Esempio n. 7
0
def test_misdemeanor_164125():
    charge = ChargeFactory.create(name="Theft of services",
                                  statute="164.125",
                                  level="Misdemeanor Class A",
                                  disposition=Dispositions.CONVICTED)

    assert isinstance(charge, Misdemeanor)
    assert charge.type_eligibility.status is EligibilityStatus.ELIGIBLE
    assert charge.type_eligibility.reason == "Eligible under 137.225(5)(b)"
Esempio n. 8
0
def test_convicted_violation_is_not_type_eligible():
    charge = ChargeFactory.create(
        statute="801.000", level="Class C Traffic Violation", disposition=Dispositions.CONVICTED
    )

    assert isinstance(charge, TrafficViolation)
    assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert charge.type_eligibility.reason == "Ineligible under 137.225(7)(a)"
    assert not charge.blocks_other_charges()
    def test_more_than_ten_year_old_conviction(self):
        charge = ChargeFactory.create(disposition=['Convicted', Time.TEN_YEARS_AGO])

        self.expunger.charges = [charge]
        TimeAnalyzer.evaluate(self.expunger)

        assert charge.expungement_result.time_eligibility.status is True
        assert charge.expungement_result.time_eligibility.reason == ''
        assert charge.expungement_result.time_eligibility.date_will_be_eligible is None
Esempio n. 10
0
    def setUp(self):
        self.case_1 = CaseFactory.create(case_number="1")
        self.case_2 = CaseFactory.create(case_number="2")

        self.recent_dismissal = ChargeFactory.create_dismissed_charge(
            case_number=self.case_1.case_number,
            date=Time.TWO_YEARS_AGO,
            violation_type=self.case_1.violation_type)
        self.case_1.charges = [self.recent_dismissal]
 def setUp(self):
     self.charge_dict = ChargeFactory.build()
     case = CaseFactory.create(type_status=["Municipal Parking", "Closed"])
     self.charge_dict["statute"] = "109"
     self.charge_dict["case"] = case
     self.charge_dict["level"] = "Violation Unclassified"
     last_week = datetime.today() - timedelta(days=7)
     self.convicted = ["Convicted", last_week]
     self.dismissed = ["Dismissed", last_week]
Esempio n. 12
0
def test_marijuana_eligible_hidden_in_summary():
    charge = ChargeFactory.create(
        name="Delivery of Marijuana to Minor",
        statute="4758604A",
        level="Felony Class A",
        disposition=Dispositions.DISMISSED,
    )
    assert isinstance(charge, DismissedCharge)
    assert charge.hidden_in_record_summary() == False
Esempio n. 13
0
    def test_10_yr_old_conviction_with_less_than_3_yr_old_mrc(self):
        ten_yr_charge = ChargeFactory.create(
            disposition=['Convicted', Time.TEN_YEARS_AGO])
        less_than_three_yr_mrc = ChargeFactory.create(
            disposition=['Convicted', Time.LESS_THAN_THREE_YEARS_AGO])

        self.expunger.most_recent_conviction = less_than_three_yr_mrc
        self.expunger.charges = [ten_yr_charge, less_than_three_yr_mrc]
        TimeAnalyzer.evaluate(self.expunger)

        assert ten_yr_charge.expungement_result.time_eligibility.status is False
        assert ten_yr_charge.expungement_result.time_eligibility.reason == 'Time-ineligible under 137.225(7)(b)'
        assert ten_yr_charge.expungement_result.time_eligibility.date_will_be_eligible == less_than_three_yr_mrc.disposition.date + Time.TEN_YEARS

        assert less_than_three_yr_mrc.expungement_result.time_eligibility.status is False
        assert less_than_three_yr_mrc.expungement_result.time_eligibility.reason == 'Most recent conviction is less than three years old'
        assert less_than_three_yr_mrc.expungement_result.time_eligibility.date_will_be_eligible == date.today(
        ) + relativedelta(days=+1)
def test_other_charge_type_true_negatives(
        person_felony_statute_with_other_charge_type):
    charges = ChargeFactory.create_ambiguous_charge(
        name="Generic",
        statute=person_felony_statute_with_other_charge_type,
        level="Felony Class B",
        disposition=Dispositions.CONVICTED,
    )
    assert [not isinstance(charge, PersonFelonyClassB) for charge in charges]
Esempio n. 15
0
    def test_it_does_not_set_2nd_mrc_when_greater_than_10yrs(self):

        self.mrc_charge.disposition = Disposition(Time.LESS_THAN_TEN_YEARS_AGO, 'Convicted')
        second_mrc_charge = ChargeFactory.create()
        second_mrc_charge.disposition = Disposition(Time.TEN_YEARS_AGO, 'Convicted')
        self.case.charges = [self.mrc_charge, second_mrc_charge]
        self.run_expunger([self.case])

        assert self.expunger.second_most_recent_conviction is None
Esempio n. 16
0
def test_sex_crimes(sex_crimes_statute):
    sex_crime_convicted = ChargeFactory.create(
        name="Generic",
        statute=sex_crimes_statute,
        level="Felony Class B",
        disposition=Dispositions.CONVICTED)
    assert isinstance(sex_crime_convicted.charge_type, SexCrime)
    assert sex_crime_convicted.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert sex_crime_convicted.type_eligibility.reason == "Ineligible under 137.225(6)(a)"
Esempio n. 17
0
    def test_it_sets_the_second_most_recent_conviction_within_the_last_10yrs(self):
        self.mrc_charge.disposition = Disposition(Time.TWO_YEARS_AGO, 'Convicted')
        second_mrc_charge = ChargeFactory.create()
        second_mrc_charge.disposition = Disposition(Time.LESS_THAN_TEN_YEARS_AGO, 'Convicted')

        self.case.charges = [second_mrc_charge, self.mrc_charge]
        self.run_expunger([self.case])

        assert self.expunger.second_most_recent_conviction is second_mrc_charge
Esempio n. 18
0
def test_dismissed_violation_is_not_type_eligible():
    charge = ChargeFactory.create(
        statute="801.000", level="Class C Traffic Violation", disposition=Dispositions.DISMISSED
    )

    assert isinstance(charge, TrafficViolation)
    assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert charge.type_eligibility.reason == "Dismissed violations are ineligible by omission from statute"
    assert not charge.blocks_other_charges()
Esempio n. 19
0
def test_charge_provider_returns_valid_charge():
    # GIVEN
    Proxy()
    charge = ChargeFactory(id=1)
    Proxy().load(full=True)
    # WHEN
    provided_charge = ChargeProvider().get_charge(1)
    # THEN
    assert provided_charge == charge
Esempio n. 20
0
    def test_mrc_grouped_within_other_charges(self):
        self.mrc_charge.disposition = Disposition(Time.TWO_YEARS_AGO,
                                                  "Convicted")
        charge = ChargeFactory.create()
        charge.disposition = Disposition(Time.TEN_YEARS_AGO, "Convicted")
        self.case.charges = [charge, charge, self.mrc_charge, charge, charge]
        self.run_expunger([self.case])

        assert self.charges_with_summary.most_recent_conviction is self.mrc_charge
Esempio n. 21
0
def test_violation_dismissed():
    charge = ChargeFactory.create(name="Viol Treatment",
                                  statute="1615662",
                                  level="Violation Unclassified",
                                  disposition=Dispositions.DISMISSED)

    assert isinstance(charge.charge_type, Violation)
    assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert charge.type_eligibility.reason == "Dismissed violations are ineligible by omission from statute"
def test_delivery_4758602():
    marijuana_eligible_charge = ChargeFactory.create(
        name="Delivery of Marijuana for Consideration",
        statute="4758602",
        level="Felony Class B",
        disposition=Dispositions.CONVICTED,
    )

    assert isinstance(marijuana_eligible_charge.charge_type, MarijuanaEligible)
def test_attempt_to_commit_felony_class_b_charge():
    charge = ChargeFactory.create_ambiguous_charge(
        name="Attempt to Commit a Class B Felony",
        statute="161.405(2)(c)",
        level="Felony Class C",
        disposition=Dispositions.CONVICTED,
    )
    assert isinstance(charge[0].charge_type, SexCrime)
    assert isinstance(charge[1].charge_type, FelonyClassC)
Esempio n. 24
0
def test_subsection_6_163145():
    charges = ChargeFactory.create_ambiguous_charge(
        name="Criminally negligent homicide",
        statute="163.145",
        level="Misdemeanor Class A",
        disposition=Dispositions.CONVICTED,
    )

    assert isinstance(charges[0].charge_type, Misdemeanor)
def test_felony_b_person_felony_with_missing_subsection(person_felony_statute):
    person_felony_class_b_convicted = ChargeFactory.create(
        name="Generic",
        statute=person_felony_statute[:6],
        level="Felony Class B",
        disposition=Dispositions.CONVICTED)
    assert isinstance(person_felony_class_b_convicted, PersonFelonyClassB)
    assert person_felony_class_b_convicted.type_eligibility.status is EligibilityStatus.INELIGIBLE
    assert person_felony_class_b_convicted.type_eligibility.reason == "Ineligible under 137.225(5)(a)"
Esempio n. 26
0
def create_class_b_felony_charge(case_number, date, ruling="Convicted"):
    return ChargeFactory.create(
        case_number=case_number,
        name="Aggravated theft in the first degree",
        statute="164.057",
        level="Felony Class B",
        date=date,
        disposition=DispositionCreator.create(ruling=ruling, date=date),
    )
Esempio n. 27
0
def test_arrest_is_unaffected_if_conviction_eligibility_is_older():
    violation_charge = ChargeFactory.create(
        level="Class A Violation",
        date=Time.TEN_YEARS_AGO,
        disposition=DispositionCreator.create(
            ruling="Convicted", date=Time.LESS_THAN_THREE_YEARS_AGO),
    )
    arrest = ChargeFactory.create(disposition=DispositionCreator.create(
        ruling="Dismissed", date=Time.ONE_YEAR_AGO))

    case = CaseFactory.create(charges=tuple([violation_charge, arrest]))
    expunger_result = Expunger.run(Record(tuple([case])))

    assert expunger_result[
        arrest.ambiguous_charge_id].status is EligibilityStatus.ELIGIBLE
    assert expunger_result[
        arrest.ambiguous_charge_id].date_will_be_eligible == arrest.date
    assert expunger_result[arrest.ambiguous_charge_id].reason == "Eligible now"
Esempio n. 28
0
def test_3_violations_are_time_restricted():
    violation_charge_1 = ChargeFactory.create(
        level="Class A Violation",
        date=Time.LESS_THAN_THREE_YEARS_AGO,
        disposition=DispositionCreator.create(
            ruling="Convicted", date=Time.LESS_THAN_THREE_YEARS_AGO),
    )
    violation_charge_2 = ChargeFactory.create(
        level="Class A Violation",
        date=Time.TWO_YEARS_AGO,
        disposition=DispositionCreator.create(ruling="Convicted",
                                              date=Time.TWO_YEARS_AGO),
    )
    violation_charge_3 = ChargeFactory.create(
        level="Class A Violation",
        date=Time.ONE_YEAR_AGO,
        disposition=DispositionCreator.create(ruling="Convicted",
                                              date=Time.ONE_YEAR_AGO),
    )
    arrest = ChargeFactory.create(disposition=DispositionCreator.create(
        ruling="Dismissed", date=Time.ONE_YEAR_AGO))

    case = CaseFactory.create(charges=tuple(
        [violation_charge_3, violation_charge_2, violation_charge_1, arrest]))
    expunger_result = Expunger.run(Record(tuple([case])))

    earliest_date_eligible = min(
        expunger_result[
            violation_charge_1.ambiguous_charge_id].date_will_be_eligible,
        expunger_result[
            violation_charge_2.ambiguous_charge_id].date_will_be_eligible,
        expunger_result[
            violation_charge_3.ambiguous_charge_id].date_will_be_eligible,
    )

    assert expunger_result[
        arrest.ambiguous_charge_id].status is EligibilityStatus.INELIGIBLE
    assert (
        expunger_result[arrest.ambiguous_charge_id].reason ==
        'Time eligibility of the arrest matches conviction on the same case (the "friendly" rule)'
    )
    assert expunger_result[
        arrest.
        ambiguous_charge_id].date_will_be_eligible == earliest_date_eligible
Esempio n. 29
0
def test_subsection_6_163205():
    charges = ChargeFactory.create_ambiguous_charge(
        name="Criminal mistreatment in the first degree",
        statute="163.205",
        level="Felony Class C",
        disposition=Dispositions.CONVICTED,
    )

    assert isinstance(charges[0].charge_type, FelonyClassC)
    assert isinstance(charges[1].charge_type, Subsection6)
Esempio n. 30
0
def test_subsection_6_163575():
    charges = ChargeFactory.create_ambiguous_charge(
        name="Endangering the welfare of a minor",
        statute="163.575",
        level="Misdemeanor Class A",
        disposition=Dispositions.CONVICTED,
    )

    assert isinstance(charges[0].charge_type, Subsection6)
    assert isinstance(charges[1].charge_type, Misdemeanor)