def test_expunger_invokes_time_analyzer_with_most_recent_charge(self): CrawlerFactory.create( self.crawler, cases={ 'X0001': CaseDetails.case_x( arrest_date=self.FIFTEEN_YEARS_AGO.strftime('%m/%d/%Y'), charge1_name='Aggravated theft in the first degree', charge1_statute='164.057', charge1_level='Felony Class B', dispo_ruling_1='Convicted', dispo_date=self.FIFTEEN_YEARS_AGO.strftime('%m/%d/%Y')), 'X0002': CaseDetails.case_x(), 'X0003': CaseDetails.case_x() }) expunger = Expunger(self.crawler.result.cases) expunger.run() assert len(expunger._type_analyzer.class_b_felonies) == 1 assert expunger._type_analyzer.class_b_felonies[ 0].name == 'Aggravated theft in the first degree' assert expunger._time_analyzer._class_b_felonies[ 0].name == 'Aggravated theft in the first degree' assert expunger._time_analyzer._most_recent_charge.name == 'Aggravated theft in the first degree'
def test_expunger_calls_time_analyzer(self): CrawlerFactory.create( self.crawler, cases={ 'X0001': CaseDetails.case_x( arrest_date=self.FIFTEEN_YEARS_AGO.strftime('%m/%d/%Y'), dispo_ruling_1='Dismissed', dispo_ruling_2='Dismissed', dispo_ruling_3='Acquitted'), 'X0002': CaseDetails.case_x( arrest_date=self.TWO_YEARS_AGO.strftime('%m/%d/%Y'), dispo_ruling_1='Dismissed', dispo_ruling_2='Convicted', dispo_ruling_3='Dismissed'), 'X0003': CaseDetails.case_x( arrest_date=self.ONE_YEAR_AGO.strftime('%m/%d/%Y'), dispo_ruling_1='No Complaint', dispo_ruling_2='Convicted', dispo_ruling_3='No Complaint') }) expunger = Expunger(self.crawler.result.cases) assert expunger.run() is True assert expunger._time_analyzer._most_recent_conviction.date == self.ONE_YEAR_AGO assert expunger._time_analyzer._second_most_recent_conviction.date == self.TWO_YEARS_AGO assert expunger._time_analyzer._most_recent_dismissal.date == self.ONE_YEAR_AGO assert expunger._time_analyzer._num_acquittals == 4
def test_expunger_runs_time_analyzer(self): record = CrawlerFactory.create(self.crawler, cases={'X0001': CaseDetails.case_x(arrest_date=self.FIFTEEN_YEARS_AGO.strftime('%m/%d/%Y'), dispo_date=self.FIFTEEN_YEARS_AGO.strftime('%m/%d/%Y'), dispo_ruling_1='Dismissed', dispo_ruling_2='Convicted', dispo_ruling_3='Acquitted'), 'X0002': CaseDetails.case_x(arrest_date=self.TWO_YEARS_AGO.strftime('%m/%d/%Y'), dispo_ruling_1='Dismissed', dispo_ruling_2='Dismissed', dispo_ruling_3='Dismissed'), 'X0003': CaseDetails.case_x(arrest_date=self.ONE_YEAR_AGO.strftime('%m/%d/%Y'), dispo_ruling_1='No Complaint', dispo_ruling_2='No Complaint', dispo_ruling_3='No Complaint')}) expunger = Expunger(record) assert expunger.run() is True assert expunger.most_recent_conviction is None assert expunger.second_most_recent_conviction is None assert expunger.most_recent_dismissal.disposition.ruling == 'No Complaint' assert len(expunger.acquittals) == 8 assert record.cases[0].charges[0].expungement_result.time_eligibility.status is False assert record.cases[0].charges[1].expungement_result.time_eligibility.status is True assert record.cases[0].charges[2].expungement_result.time_eligibility.status is False assert record.cases[1].charges[0].expungement_result.time_eligibility.status is False assert record.cases[1].charges[1].expungement_result.time_eligibility.status is False assert record.cases[1].charges[2].expungement_result.time_eligibility.status is False assert record.cases[2].charges[0].expungement_result.time_eligibility.status is True assert record.cases[2].charges[1].expungement_result.time_eligibility.status is True assert record.cases[2].charges[2].expungement_result.time_eligibility.status is True
def record_with_specific_dates(crawler): return CrawlerFactory.create( crawler, cases={ "X0001": CaseDetails.case_x( arrest_date=FIFTEEN_YEARS_AGO.strftime("%m/%d/%Y"), dispo_date=FIFTEEN_YEARS_AGO.strftime("%m/%d/%Y"), dispo_ruling_1="Dismissed", dispo_ruling_2="Convicted", dispo_ruling_3="Acquitted", ), "X0002": CaseDetails.case_x( arrest_date=TWO_YEARS_AGO.strftime("%m/%d/%Y"), dispo_ruling_1="Dismissed", dispo_ruling_2="Dismissed", dispo_ruling_3="Dismissed", ), "X0003": CaseDetails.case_x( arrest_date=ONE_YEAR_AGO.strftime("%m/%d/%Y"), dispo_ruling_1="No Complaint", dispo_ruling_2="No Complaint", dispo_ruling_3="No Complaint", ), }, )
def create_ambiguous_record_with_questions( record=JohnDoe.RECORD_WITH_CLOSED_CASES, cases={ "X0001": CaseDetails.case_x(), "X0002": CaseDetails.case_x(), "X0003": CaseDetails.case_x() }, ) -> Tuple[Record, AmbiguousRecord, Dict[str, Question], List[str]]: base_url = "https://publicaccess.courts.oregon.gov/PublicAccessLogin/" with requests_mock.Mocker() as m: m.post(URL.login_url(), text=PostLoginPage.POST_LOGIN_PAGE) m.post("{}{}".format(base_url, "Search.aspx?ID=100"), [{ "text": SearchPageResponse.RESPONSE }, { "text": record }]) for key, value in cases.items(): m.get("{}{}{}".format(base_url, "CaseDetail.aspx?CaseID=", key), text=value) aliases = (Alias(first_name="John", last_name="Doe", middle_name="", birth_date=""), ) return RecordCreator.build_record( RecordCreator.build_search_results.__wrapped__, "username", "password", aliases, {})
def record_with_unrecognized_dispo(): return CrawlerFactory.create(cases={ "X0001": CaseDetails.case_x(dispo_ruling_1="Something unrecognized"), "X0002": CaseDetails.case_x(dispo_ruling_1="Something unrecognized"), "X0003": CaseDetails.case_x(dispo_ruling_1="Something unrecognized"), }, )
def record_with_revoked_probation(): return CrawlerFactory.create(cases={ "X0001": CaseDetails.CASE_WITH_REVOKED_PROBATION, "X0002": CaseDetails.case_x(dispo_ruling_1="Something unrecognized"), "X0003": CaseDetails.case_x(dispo_ruling_1="Something unrecognized"), }, )
def record_with_multiple_disposition_errors(): return CrawlerFactory.create(cases={ "X0001": CaseDetails.case_x(dispo_ruling_1="Something unrecognized"), "X0002": CaseDetails.case_x(dispo_ruling_1="Something else unrecognized"), "X0003": CaseDetails.CASE_WITHOUT_DISPOS, }, )
def create( record=JohnDoe.RECORD_WITH_CLOSED_CASES, cases={ "X0001": CaseDetails.case_x(), "X0002": CaseDetails.case_x(), "X0003": CaseDetails.case_x() }, ) -> Record: return CrawlerFactory.create_ambiguous_record_with_questions( record, cases)[0]
def record_with_various_categories(crawler): return CrawlerFactory.create(crawler, cases={'X0001': CaseDetails.case_x( dispo_ruling_1='Convicted - Failure to show', dispo_ruling_2='Dismissed', dispo_ruling_3='Acquitted'), 'X0002': CaseDetails.case_x( dispo_ruling_1='Dismissed', dispo_ruling_2='Convicted', dispo_ruling_3='Convicted'), 'X0003': CaseDetails.case_x( dispo_ruling_1='No Complaint', dispo_ruling_2='Dismissed', dispo_ruling_3='Convicted')})
def record_with_various_categories(): return CrawlerFactory.create(cases={ "X0001": CaseDetails.case_x(dispo_ruling_1="Convicted - Failure to show", dispo_ruling_2="Dismissed", dispo_ruling_3="Acquitted"), "X0002": CaseDetails.case_x(dispo_ruling_1="Dismissed", dispo_ruling_2="Convicted", dispo_ruling_3="Convicted"), "X0003": CaseDetails.case_x(dispo_ruling_1="No Complaint", dispo_ruling_2="Dismissed", dispo_ruling_3="Convicted"), }, )
def create( crawler, record=JohnDoe.RECORD_WITH_CLOSED_CASES, cases={"X0001": CaseDetails.case_x(), "X0002": CaseDetails.case_x(), "X0003": CaseDetails.case_x()}, ): base_url = "https://publicaccess.courts.oregon.gov/PublicAccessLogin/" with requests_mock.Mocker() as m: m.post( "{}{}".format(base_url, "Search.aspx?ID=100"), [{"text": SearchPageResponse.RESPONSE}, {"text": record}] ) for key, value in cases.items(): m.get("{}{}{}".format(base_url, "CaseDetail.aspx?CaseID=", key), text=value) return crawler.search("John", "Doe")
def test_expunger_categorizes_charges(self): record = CrawlerFactory.create(self.crawler, cases={'X0001': CaseDetails.case_x(dispo_ruling_1='Convicted - Failure to show', dispo_ruling_2='Dismissed', dispo_ruling_3='Acquitted'), 'X0002': CaseDetails.case_x(dispo_ruling_1='Dismissed', dispo_ruling_2='Convicted', dispo_ruling_3='Convicted'), 'X0003': CaseDetails.case_x(dispo_ruling_1='No Complaint', dispo_ruling_2='Dismissed', dispo_ruling_3='Convicted')}) expunger = Expunger(record) assert expunger.run() is True assert len(expunger.acquittals) == 5 assert len(expunger.convictions) == 4
def create(crawler, record=JohnDoe.RECORD_WITH_CLOSED_CASES, cases={'X0001': CaseDetails.case_x(), 'X0002': CaseDetails.case_x(), 'X0003': CaseDetails.case_x()} ): base_url = 'https://publicaccess.courts.oregon.gov/PublicAccessLogin/' with requests_mock.Mocker() as m: m.post("{}{}".format(base_url, 'Search.aspx?ID=100'), [{'text': SearchPageResponse.RESPONSE}, {'text': record}]) for key, value in cases.items(): m.get("{}{}{}".format(base_url, 'CaseDetail.aspx?CaseID=', key), text=value) crawler.search('John', 'Doe')
def record_with_specific_dates(crawler): return CrawlerFactory.create(crawler, cases={'X0001': CaseDetails.case_x( arrest_date=FIFTEEN_YEARS_AGO.strftime( '%m/%d/%Y'), dispo_date=FIFTEEN_YEARS_AGO.strftime( '%m/%d/%Y'), dispo_ruling_1='Dismissed', dispo_ruling_2='Convicted', dispo_ruling_3='Acquitted'), 'X0002': CaseDetails.case_x( arrest_date=TWO_YEARS_AGO.strftime( '%m/%d/%Y'), dispo_ruling_1='Dismissed', dispo_ruling_2='Dismissed', dispo_ruling_3='Dismissed'), 'X0003': CaseDetails.case_x( arrest_date=ONE_YEAR_AGO.strftime( '%m/%d/%Y'), dispo_ruling_1='No Complaint', dispo_ruling_2='No Complaint', dispo_ruling_3='No Complaint')})