Skip to content

Commit 809b2e2

Browse files
committed
test(recap): Adds test for fetching attachment pages from ACMS
This test verifies that ACMS attachment pages are correctly processed using the `ACMSAttachmentPage` class and that no district or appellate parsers are called. It also ensures the fetch is marked successful and the expected number of RECAP documents are created.
1 parent f92e20b commit 809b2e2

File tree

2 files changed

+126
-0
lines changed

2 files changed

+126
-0
lines changed

cl/recap/tests/tests.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3490,6 +3490,30 @@ def setUp(self) -> None:
34903490
recap_document_id=self.rd_appellate.pk,
34913491
)
34923492

3493+
self.acms_court = CourtFactory(
3494+
id="ca9", jurisdiction=Court.FEDERAL_APPELLATE
3495+
)
3496+
self.acms_docket = DocketFactory(
3497+
source=Docket.RECAP,
3498+
court=self.acms_court,
3499+
pacer_case_id="5d8e355d-b229-4b16-b00f-7552d2f79d4f",
3500+
)
3501+
self.rd_acms = RECAPDocumentFactory(
3502+
docket_entry=DocketEntryWithParentsFactory(
3503+
docket=self.acms_docket, entry_number=9
3504+
),
3505+
document_number=9,
3506+
pacer_doc_id="4e108d6c-ad5b-f011-bec2-001dd80b194b",
3507+
is_available=False,
3508+
document_type=RECAPDocument.PACER_DOCUMENT,
3509+
)
3510+
3511+
self.fq_acms = PacerFetchQueue.objects.create(
3512+
user=User.objects.get(username="recap"),
3513+
request_type=REQUEST_TYPE.ATTACHMENT_PAGE,
3514+
recap_document_id=self.rd_acms.pk,
3515+
)
3516+
34933517
def test_fetch_attachment_page_no_pacer_doc_id(
34943518
self, mock_court_accessible
34953519
) -> None:
@@ -3596,6 +3620,60 @@ def test_fetch_att_page_from_appellate(
35963620
"Successfully completed fetch", self.fq_appellate.message
35973621
)
35983622

3623+
@mock.patch(
3624+
"cl.recap.tasks.get_pacer_cookie_from_cache",
3625+
)
3626+
@mock.patch(
3627+
"cl.corpus_importer.tasks.ACMSAttachmentPage",
3628+
new=fakes.FakeAcmsAttachmentPage,
3629+
)
3630+
@mock.patch(
3631+
"cl.corpus_importer.tasks.AppellateAttachmentPage",
3632+
)
3633+
@mock.patch(
3634+
"cl.corpus_importer.tasks.AttachmentPage",
3635+
)
3636+
@mock.patch(
3637+
"cl.corpus_importer.tasks.is_appellate_court", wraps=is_appellate_court
3638+
)
3639+
@mock.patch("cl.recap.tasks.is_appellate_court", wraps=is_appellate_court)
3640+
def test_fetch_att_page_from_acms(
3641+
self,
3642+
mock_court_check_task,
3643+
mock_court_check_parser,
3644+
mock_district_report_parser,
3645+
mock_appellate_report_parser,
3646+
mock_get_cookies,
3647+
mock_court_accessible,
3648+
):
3649+
# Trigger the fetch operation for an ACMS attachment page
3650+
result = do_pacer_fetch(self.fq_appellate)
3651+
result.get()
3652+
3653+
self.fq_appellate.refresh_from_db()
3654+
3655+
docket_entry = self.rd_appellate.docket_entry
3656+
amcs_court_id = docket_entry.docket.court_id
3657+
# Verify court validation calls with expected court ID
3658+
mock_court_check_task.assert_called_with(amcs_court_id)
3659+
mock_court_check_parser.assert_called_with(amcs_court_id)
3660+
3661+
# Ensure that only the ACMS parser was used
3662+
mock_district_report_parser.assert_not_called()
3663+
mock_appellate_report_parser.assert_not_called()
3664+
3665+
# Assert successful fetch status and expected message
3666+
self.assertEqual(
3667+
self.fq_appellate.status, PROCESSING_STATUS.SUCCESSFUL
3668+
)
3669+
self.assertIn(
3670+
"Successfully completed fetch", self.fq_appellate.message
3671+
)
3672+
3673+
# Verify that 3 RECAPDocument objects were created for the docket entry
3674+
docket_entry.refresh_from_db()
3675+
self.assertEqual(docket_entry.recap_documents.count(), 3)
3676+
35993677

36003678
class ProcessingQueueApiFilterTest(TestCase):
36013679
def setUp(self) -> None:

cl/tests/fakes.py

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,6 +170,54 @@ def data(self, *args, **kwargs):
170170
}
171171

172172

173+
class FakeAcmsAttachmentPage(FakeAppellateAttachmentPage):
174+
@property
175+
def data(self, *args, **kwargs):
176+
return {
177+
"pacer_doc_id": "4e108d6c-ad5b-f011-bec2-001dd80b194b",
178+
"pacer_case_id": "5d8e355d-b229-4b16-b00f-7552d2f79d4f",
179+
"entry_number": 9,
180+
"description": "MOTION [Entered: 07/07/2025 08:41 PM]",
181+
"date_filed": date(2025, 7, 8),
182+
"date_end": date(2025, 7, 7),
183+
"attachments": [
184+
{
185+
"attachment_number": 1,
186+
"description": "Motion",
187+
"page_count": 30,
188+
"pacer_doc_id": "4e108d6c-ad5b-f011-bec2-001dd80b194b",
189+
"acms_document_guid": "d1358903-ad5b-f011-a2da-001dd80b00cb",
190+
"cost": 3.0,
191+
"date_filed": date(2025, 7, 8),
192+
"permission": "Public",
193+
"file_size": 864.0,
194+
},
195+
{
196+
"attachment_number": 2,
197+
"description": "Declaration",
198+
"page_count": 4,
199+
"pacer_doc_id": "4e108d6c-ad5b-f011-bec2-001dd80b194b",
200+
"acms_document_guid": "2f373c0f-ad5b-f011-a2da-001dd80b00cb",
201+
"cost": 0.4,
202+
"date_filed": date(2025, 7, 8),
203+
"permission": "Public",
204+
"file_size": 288.0,
205+
},
206+
{
207+
"attachment_number": 3,
208+
"description": "Declaration",
209+
"page_count": 30,
210+
"pacer_doc_id": "4e108d6c-ad5b-f011-bec2-001dd80b194b",
211+
"acms_document_guid": "c6aae921-ad5b-f011-a2da-001dd80b00cb",
212+
"cost": 3.0,
213+
"date_filed": date(2025, 7, 8),
214+
"permission": "Public",
215+
"file_size": 11264.0,
216+
},
217+
],
218+
}
219+
220+
173221
class FakeFreeOpinionReport:
174222
def __init__(self, *args, **kwargs):
175223
pass

0 commit comments

Comments
 (0)