def setUp(self): self.parser = RecordParser() self.parser.feed(JohnDoe.RECORD) self.case1_date = date(1963, 3, 23) self.case2_date = date(1963, 4, 11) self.case3_date = date(2012, 4, 1) self.base_uri = "https://publicaccess.courts.oregon.gov/PublicAccessLogin/CaseDetail.aspx?CaseID="
def test_add_new_charge(): record, questions = RecordCreator.build_record( search("single_case_two_charges"), "username", "password", (), { "X0001": { "summary": { "edit_status": "UPDATE" }, "charges": { "X0001-3": { "edit_status": "ADD", "charge_type": "MisdemeanorClassA", "level": "Misdemeanor Class A", "date": "1/1/2001", "disposition": { "date": "2/1/2020", "ruling": "Convicted" }, } }, } }, date.today(), LRUCache(4), ) assert isinstance(record.cases[0].charges[2].charge_type, MisdemeanorClassA) assert record.cases[0].charges[2].date == date(2001, 1, 1) assert record.cases[0].charges[2].edit_status == EditStatus.ADD
def test_edit_some_fields_on_case(): record, questions = RecordCreator.build_record( search("two_cases_two_charges_each"), "username", "password", (), { "X0002": { "summary": { "edit_status": "UPDATE", "location": "ocean", "balance_due": "100", "date": "1/1/1981", } } }, date.today(), LRUCache(4), ) assert len(record.cases) == 2 assert record.cases[0].summary.location == "earth" assert record.cases[0].summary.edit_status == EditStatus.UNCHANGED assert record.cases[1].summary.location == "ocean" assert record.cases[1].summary.balance_due_in_cents == 10000 assert record.cases[1].summary.date == date(1981, 1, 1) assert record.cases[1].summary.edit_status == EditStatus.UPDATE
def test_expunger_for_record_with_mj_over_21(record_with_mj_over_21): expunger_result = Expunger.run(record_with_mj_over_21) assert expunger_result == { "CASEJD1-1": TimeEligibility(status=EligibilityStatus.ELIGIBLE, reason="Eligible now", date_will_be_eligible=date(2001, 3, 3)) }
def test_probation_revoked_affects_time_eligibility( record_with_revoked_probation): record = record_with_revoked_probation expunger_result = Expunger.run(record) assert len(expunger_result) == 6 assert expunger_result[record.cases[2].charges[0]. ambiguous_charge_id].date_will_be_eligible == date( 2020, 11, 9)
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"
def test_expunger_for_record_with_mj_under_21(record_with_mj_under_21): assert isinstance(record_with_mj_under_21.charges[0].charge_type, MarijuanaUnder21) expunger_result = Expunger.run(record_with_mj_under_21) assert expunger_result == { "CASEJD1-1": TimeEligibility(status=EligibilityStatus.ELIGIBLE, reason="Eligible now", date_will_be_eligible=date(1999, 3, 3)) }
def test_add_case(): record, questions = RecordCreator.build_record( search("single_case_two_charges"), "username", "password", (), { "5": { "summary": { "case_number": "5", "edit_status": "ADD", "location": "ocean", "balance_due": "100", "date": "1/1/1981", }, "charges": { "5-1": { "edit_status": "ADD", "charge_type": "FelonyClassC", "level": "Felony Class C", "date": "1/1/2001", "disposition": { "date": "2/1/2020", "ruling": "Convicted" }, } }, } }, date.today(), LRUCache(4), ) assert len(record.cases) == 2 assert record.cases[0].summary.location == "earth" assert record.cases[0].summary.edit_status == EditStatus.UNCHANGED assert record.cases[1].summary.location == "ocean" assert record.cases[1].summary.balance_due_in_cents == 10000 assert record.cases[1].summary.date == date(1981, 1, 1) assert record.cases[1].summary.edit_status == EditStatus.ADD assert record.cases[1].charges[0].edit_status == EditStatus.ADD assert record.cases[1].charges[0].charge_type assert isinstance(record.cases[1].charges[0].charge_type, FelonyClassC)
def test_expunger_for_record_with_mj_under_21_blocked_by_blocking_conviction(): record = CrawlerFactory.create( record=YoungDoe.SINGLE_CASE_RECORD, cases={"CASEJD1": CaseDetails.CASE_MJ_AND_FELONY_CONVICTION}) expunger_result = Expunger.run(record) mj_charge = record.charges[0] felony_charge = record.charges[1] assert isinstance(mj_charge.charge_type, MarijuanaUnder21) assert isinstance(felony_charge.charge_type, FelonyClassA) assert expunger_result["CASEJD1-1"] == TimeEligibility( status=EligibilityStatus.ELIGIBLE, reason="Eligible now", date_will_be_eligible=date(1998, 3, 3) + relativedelta(years=10), ) assert expunger_result["CASEJD1-2"] == TimeEligibility( status=EligibilityStatus.INELIGIBLE, reason="Never. Type ineligible charges are always time ineligible.", date_will_be_eligible=date.max(), )
def test_edit_some_fields_on_case(): record, questions = RecordCreator.build_record( search("two_cases_two_charges_each"), "username", "password", (), { "X0002": { "action": "edit", "summary": { "location": "ocean", "balance_due": "100", "date": "1/1/1001", } } }, ) assert len(record.cases) == 2 assert record.cases[0].summary.location == "earth" assert record.cases[1].summary.location == "ocean" assert record.cases[1].summary.balance_due_in_cents == 10000 assert record.cases[1].summary.date == date(1001, 1, 1)
def test_add_new_charge(): record, questions = RecordCreator.build_record( search("single_case_two_charges"), "username", "password", (), { "X0001": { "action": "edit", "charges": { "X0001-3": { "charge_type": "Misdemeanor", "date": "1/1/2001", "disposition": { "date": "2/1/2020", "ruling": "Convicted" }, } }, } }, ) assert isinstance(record.cases[0].charges[2].charge_type, Misdemeanor) assert record.cases[0].charges[2].date == date(2001, 1, 1)
from expungeservice.models.charge_types.felony_class_c import FelonyClassC from expungeservice.models.record import Record from expungeservice.models.disposition import Disposition, DispositionStatus, DispositionCreator from expungeservice.models.expungement_result import ChargeEligibilityStatus, EligibilityStatus from expungeservice.record_creator import RecordCreator case_1 = OeciCase( CaseSummary( name="John Doe", birth_year=1980, case_number="X0001", district_attorney_number="555", sid="OR12345678", citation_number="X0001", location="earth", date=date(2001, 1, 1), violation_type="Something", current_status="CLOSED", case_detail_link="alink", balance_due_in_cents=0, edit_status=EditStatus.UNCHANGED, ), ( OeciCharge( ambiguous_charge_id="X0001-1", name="petty theft", statute="100.000", level="Misdemeanor", date=date(2000, 1, 1), disposition=Disposition( date=date(2001, 1, 1),
def test_record_summarizer_multiple_cases(): case_all_eligible = CaseFactory.create( case_number="1", balance="100.00", date_location=["1/1/1995", "Multnomah"], charges=tuple([ ChargeFactory.create( case_number="1", name="Theft of dignity", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) case_partially_eligible = CaseFactory.create( case_number="2", balance="200.00", date_location=["1/1/1995", "Clackamas"], charges=tuple([ ChargeFactory.create( case_number="2", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ), ChargeFactory.create( case_number="2", level="Felony Class A", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ), ]), ) case_possibly_eligible = CaseFactory.create( case_number="3", balance="300.00", date_location=["1/1/1995", "Baker"], charges=tuple([ ChargeFactory.create( case_number="3", level="Felony Class B", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) case_all_ineligible = CaseFactory.create( case_number="4", balance="400.00", date_location=["1/1/1995", "Baker"], charges=tuple([ ChargeFactory.create( case_number="4", level="Felony Class A", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) case_all_ineligible_2 = CaseFactory.create( case_number="5", date_location=["1/1/1995", "Baker"], charges=tuple([ ChargeFactory.create( case_number="5", level="Felony Class A", disposition=DispositionCreator.create(ruling="Convicted", date=date(2010, 1, 1)), ) ]), ) record = Record( tuple([ case_all_eligible, case_partially_eligible, case_possibly_eligible, case_all_ineligible, case_all_ineligible_2, ])) expunger_result = Expunger.run(record) merged_record = RecordMerger.merge([record], [expunger_result], []) record_summary = RecordSummarizer.summarize(merged_record, {}) assert record_summary.total_fines_due == 1000.00 assert record_summary.total_cases == 5 assert record_summary.total_charges == 6 assert record_summary.eligible_charges_by_date == { "Eligible Jan 1, 2030": [( case_possibly_eligible.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, " "2010", )], "Eligible Now": [ (case_all_eligible.charges[0].ambiguous_charge_id, "Theft of dignity (CONVICTED) Charged Jan 1, 2010"), ( case_partially_eligible.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ], "Ineligible": [ ( case_partially_eligible.charges[1].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ( case_all_ineligible.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ( case_all_ineligible_2.charges[0].ambiguous_charge_id, "Theft of services (CONVICTED) Charged Jan 1, 2010", ), ], } assert len(record_summary.county_filing_fees) == 2 assert record_summary.total_filing_fees_due == 722 assert (next(county.total_fines_due for county in record_summary.county_fines if county.county_name == "Multnomah") == 100) assert (next(county.total_fines_due for county in record_summary.county_fines if county.county_name == "Clackamas") == 200) assert (next(county.total_fines_due for county in record_summary.county_fines if county.county_name == "Baker") == 700)
from expungeservice.models.charge_types.parking_ticket import ParkingTicket from tests.factories.charge_factory import ChargeFactory from tests.factories.case_factory import CaseSummaryFactory from tests.models.test_charge import Dispositions def test_parking_ticket_conviction(): case = CaseSummaryFactory.create( type_status=["Municipal Parking", "Closed"]) charge = ChargeFactory.create( case_number=case.case_number, name="Unknown", statute="109", level="Violation Unclassified", date=date(1901, 1, 1), disposition=Dispositions.CONVICTED, violation_type=case.violation_type, ) assert isinstance(charge.charge_type, ParkingTicket) assert not charge.charge_type.blocks_other_charges assert charge.type_eligibility.status is EligibilityStatus.INELIGIBLE assert charge.type_eligibility.reason == "Ineligible under 137.225(7)(a)" def test_parking_ticket_dismissal(): case = CaseSummaryFactory.create( type_status=["Municipal Parking", "Closed"]) charge = ChargeFactory.create( case_number=case.case_number,
from expungeservice.models.case import OeciCase, CaseSummary from expungeservice.models.charge import OeciCharge from expungeservice.models.charge_types.misdemeanor import Misdemeanor from expungeservice.models.record import Record from expungeservice.models.disposition import Disposition, DispositionStatus, DispositionCreator from expungeservice.record_creator import RecordCreator case_1 = OeciCase( CaseSummary( name="John Doe", birth_year=1980, case_number="X0001", citation_number="X0001", location="earth", date=date(2001, 1, 1), violation_type="Something", current_status="CLOSED", case_detail_link="alink", balance_due_in_cents=0, ), ( OeciCharge( ambiguous_charge_id="X0001-1", name="manufacturing", statute="100.000", level="Felony Class B", date=date(2000, 1, 1), disposition=Disposition( date=date(2001, 1, 1), ruling="Convicted",