Skip to content

Commit d5f602e

Browse files
Live split/merge/summarize/translate: add async variants, missing option tests
Assisted-by: Codex
1 parent 8b5caaf commit d5f602e

3 files changed

Lines changed: 302 additions & 0 deletions

File tree

tests/live/test_live_pdf_split_merge.py

Lines changed: 246 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,65 @@ def test_live_split_pdf_page_groups(
151151
assert str(response.input_id) == str(split_source.id)
152152

153153

154+
@pytest.mark.asyncio
155+
@pytest.mark.parametrize(
156+
("page_groups", "expected_count"),
157+
[
158+
pytest.param(["1-5", "6-last"], 2, id="two-ranges"),
159+
pytest.param([["1", "3", "5"], "2-4"], 2, id="alternating-selection"),
160+
pytest.param(["even"], 1, id="even-only"),
161+
pytest.param(["9-2"], 1, id="descending-single"),
162+
pytest.param(["odd", "even"], 2, id="odd-and-even"),
163+
],
164+
)
165+
async def test_live_async_split_pdf_page_groups(
166+
pdfrest_api_key: str,
167+
pdfrest_live_base_url: str,
168+
uploaded_live_pdfs: tuple[PdfRestFile, PdfRestFile],
169+
page_groups: list[PdfPageSelection],
170+
expected_count: int,
171+
) -> None:
172+
split_source, _ = uploaded_live_pdfs
173+
174+
async with AsyncPdfRestClient(
175+
api_key=pdfrest_api_key,
176+
base_url=pdfrest_live_base_url,
177+
) as client:
178+
total_pages = await _fetch_page_count_async(client, split_source)
179+
180+
response = await client.split_pdf(
181+
split_source,
182+
page_groups=page_groups,
183+
output_prefix="live-async-split",
184+
)
185+
186+
assert len(response.output_files) == expected_count
187+
188+
output_infos = [
189+
await client.query_pdf_info(output_file)
190+
for output_file in response.output_files
191+
]
192+
193+
assert all(
194+
output_file.name.startswith("live-async-split")
195+
and output_file.name.endswith(".pdf")
196+
and output_file.type == "application/pdf"
197+
and output_file.size > 0
198+
for output_file in response.output_files
199+
)
200+
page_counts_optional = [info.page_count for info in output_infos]
201+
assert all(count is not None for count in page_counts_optional)
202+
expected_page_counts = [
203+
len(_expand_page_selection(group, total_pages=total_pages))
204+
for group in page_groups
205+
][: len(page_counts_optional)]
206+
page_counts = [
207+
int(count) for count in page_counts_optional if count is not None
208+
]
209+
assert page_counts == expected_page_counts
210+
assert str(response.input_id) == str(split_source.id)
211+
212+
154213
def test_live_split_pdf_default_outputs(
155214
pdfrest_api_key: str,
156215
pdfrest_live_base_url: str,
@@ -186,6 +245,43 @@ def test_live_split_pdf_default_outputs(
186245
assert str(response.input_id) == str(split_source.id)
187246

188247

248+
@pytest.mark.asyncio
249+
async def test_live_async_split_pdf_default_outputs(
250+
pdfrest_api_key: str,
251+
pdfrest_live_base_url: str,
252+
uploaded_live_pdfs: tuple[PdfRestFile, PdfRestFile],
253+
) -> None:
254+
split_source, _ = uploaded_live_pdfs
255+
256+
async with AsyncPdfRestClient(
257+
api_key=pdfrest_api_key,
258+
base_url=pdfrest_live_base_url,
259+
) as client:
260+
total_pages = await _fetch_page_count_async(client, split_source)
261+
262+
response = await client.split_pdf(
263+
split_source,
264+
output_prefix="live-async-split-default",
265+
)
266+
267+
assert len(response.output_files) == total_pages
268+
269+
output_infos = [
270+
await client.query_pdf_info(output_file)
271+
for output_file in response.output_files
272+
]
273+
assert all(
274+
output_file.name.startswith("live-async-split-default")
275+
and output_file.name.endswith(".pdf")
276+
and output_file.type == "application/pdf"
277+
and output_file.size > 0
278+
for output_file in response.output_files
279+
)
280+
assert all(info.page_count == 1 for info in output_infos)
281+
282+
assert str(response.input_id) == str(split_source.id)
283+
284+
189285
def test_live_split_pdf_invalid_pages(
190286
pdfrest_api_key: str,
191287
pdfrest_live_base_url: str,
@@ -207,6 +303,26 @@ def test_live_split_pdf_invalid_pages(
207303
)
208304

209305

306+
@pytest.mark.asyncio
307+
async def test_live_async_split_pdf_invalid_pages(
308+
pdfrest_api_key: str,
309+
pdfrest_live_base_url: str,
310+
uploaded_live_pdfs: tuple[PdfRestFile, PdfRestFile],
311+
) -> None:
312+
split_source, _ = uploaded_live_pdfs
313+
314+
async with AsyncPdfRestClient(
315+
api_key=pdfrest_api_key,
316+
base_url=pdfrest_live_base_url,
317+
) as client:
318+
with pytest.raises(PdfRestApiError, match=r"(?i)page"):
319+
await client.split_pdf(
320+
split_source,
321+
page_groups=["1-2"],
322+
extra_body={"pages": ["0"]},
323+
)
324+
325+
210326
def test_live_merge_pdfs_success(
211327
pdfrest_api_key: str,
212328
pdfrest_live_base_url: str,
@@ -254,6 +370,30 @@ def test_live_merge_pdfs_success(
254370
assert output_info.page_count == expected_total_pages
255371

256372

373+
@pytest.mark.asyncio
374+
async def test_live_async_merge_pdfs_invalid_pages(
375+
pdfrest_api_key: str,
376+
pdfrest_live_base_url: str,
377+
uploaded_live_pdfs: tuple[PdfRestFile, PdfRestFile],
378+
) -> None:
379+
split_source, merge_partner = uploaded_live_pdfs
380+
sources: list[PdfMergeInput] = [
381+
{"file": split_source, "pages": "even"},
382+
{"file": merge_partner, "pages": "1"},
383+
]
384+
385+
async with AsyncPdfRestClient(
386+
api_key=pdfrest_api_key,
387+
base_url=pdfrest_live_base_url,
388+
) as client:
389+
with pytest.raises(PdfRestApiError, match=r"(?i)page"):
390+
await client.merge_pdfs(
391+
sources,
392+
output_prefix="live-async-merge-invalid",
393+
extra_body={"pages": ["even", "0"]},
394+
)
395+
396+
257397
def test_live_merge_pdfs_invalid_pages(
258398
pdfrest_api_key: str,
259399
pdfrest_live_base_url: str,
@@ -382,6 +522,52 @@ def test_live_split_pdf_page_range_variants(
382522
)
383523

384524

525+
@pytest.mark.asyncio
526+
@pytest.mark.parametrize(
527+
("selection", "expect_success", "requires_override"), SPLIT_RANGE_CASES
528+
)
529+
async def test_live_async_split_pdf_page_range_variants(
530+
pdfrest_api_key: str,
531+
pdfrest_live_base_url: str,
532+
uploaded_live_pdfs: tuple[PdfRestFile, PdfRestFile],
533+
selection: PdfPageSelection,
534+
expect_success: bool,
535+
requires_override: bool,
536+
request: pytest.FixtureRequest,
537+
) -> None:
538+
split_source, _ = uploaded_live_pdfs
539+
case_id = request.node.callspec.id
540+
async with AsyncPdfRestClient(
541+
api_key=pdfrest_api_key,
542+
base_url=pdfrest_live_base_url,
543+
) as client:
544+
total_pages = await _fetch_page_count_async(client, split_source)
545+
override_body = None
546+
if requires_override:
547+
override_body = {"pages": [str(selection)]}
548+
549+
if expect_success:
550+
response = await client.split_pdf(
551+
split_source,
552+
page_groups=[selection if not requires_override else "1"],
553+
output_prefix=f"live-async-split-range-{case_id}",
554+
extra_body=override_body,
555+
)
556+
expected_pages = _expand_page_selection(selection, total_pages=total_pages)
557+
output_pages = (
558+
await client.query_pdf_info(response.output_files[0])
559+
).page_count
560+
assert output_pages == len(expected_pages)
561+
else:
562+
with pytest.raises(PdfRestApiError, match=r"(?i)page"):
563+
await client.split_pdf(
564+
split_source,
565+
page_groups=[selection if not requires_override else "1"],
566+
output_prefix=f"live-async-split-range-{case_id}",
567+
extra_body=override_body,
568+
)
569+
570+
385571
MERGE_RANGE_CASES = [
386572
pytest.param("3", True, False, id="single-str"),
387573
pytest.param(3, True, False, id="single-int"),
@@ -452,3 +638,63 @@ def test_live_merge_pdf_page_range_variants(
452638
output_prefix=f"live-merge-range-{case_id}",
453639
extra_body=override_body,
454640
)
641+
642+
643+
@pytest.mark.asyncio
644+
@pytest.mark.parametrize(
645+
("selection", "expect_success", "requires_override"), MERGE_RANGE_CASES
646+
)
647+
async def test_live_async_merge_pdf_page_range_variants(
648+
pdfrest_api_key: str,
649+
pdfrest_live_base_url: str,
650+
uploaded_live_pdfs: tuple[PdfRestFile, PdfRestFile],
651+
selection: PdfPageSelection,
652+
expect_success: bool,
653+
requires_override: bool,
654+
request: pytest.FixtureRequest,
655+
) -> None:
656+
split_source, merge_partner = uploaded_live_pdfs
657+
case_id = request.node.callspec.id
658+
async with AsyncPdfRestClient(
659+
api_key=pdfrest_api_key,
660+
base_url=pdfrest_live_base_url,
661+
) as client:
662+
source_page_counts = {
663+
str(split_source.id): await _fetch_page_count_async(client, split_source),
664+
str(merge_partner.id): await _fetch_page_count_async(client, merge_partner),
665+
}
666+
sources: list[PdfMergeInput] = [
667+
{
668+
"file": split_source,
669+
"pages": selection if not requires_override else "1",
670+
},
671+
{"file": merge_partner, "pages": "1"},
672+
]
673+
override_body = {"pages": [str(selection), "1"]} if requires_override else None
674+
675+
if expect_success:
676+
response = await client.merge_pdfs(
677+
sources,
678+
output_prefix=f"live-async-merge-range-{case_id}",
679+
extra_body=override_body,
680+
)
681+
expected_total_pages = sum(
682+
len(
683+
_expand_page_selection(
684+
chosen_selection,
685+
total_pages=source_page_counts[str(file.id)],
686+
)
687+
)
688+
for file, chosen_selection in (
689+
_extract_merge_entry(entry) for entry in sources
690+
)
691+
)
692+
output_info = await client.query_pdf_info(response.output_file)
693+
assert output_info.page_count == expected_total_pages
694+
else:
695+
with pytest.raises(PdfRestApiError, match=r"(?i)page"):
696+
await client.merge_pdfs(
697+
sources,
698+
output_prefix=f"live-async-merge-range-{case_id}",
699+
extra_body=override_body,
700+
)

tests/live/test_live_summarize_pdf_text.py

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,33 @@ def test_live_summarize_text_to_file_success(
5555
assert response.input_id == uploaded.id
5656

5757

58+
@pytest.mark.asyncio
59+
async def test_live_async_summarize_text_to_file_success(
60+
pdfrest_api_key: str,
61+
pdfrest_live_base_url: str,
62+
) -> None:
63+
resource = get_test_resource_path("report.pdf")
64+
async with AsyncPdfRestClient(
65+
api_key=pdfrest_api_key,
66+
base_url=pdfrest_live_base_url,
67+
) as client:
68+
uploaded = (await client.files.create_from_paths([resource]))[0]
69+
response = await client.summarize_text_to_file(
70+
uploaded,
71+
target_word_count=30,
72+
summary_format="overview",
73+
)
74+
75+
assert isinstance(response, PdfRestFileBasedResponse)
76+
assert response.output_files
77+
output_file = response.output_file
78+
assert output_file.name.endswith(".md")
79+
assert output_file.type == "text/markdown"
80+
assert output_file.size > 0
81+
assert response.warning is None
82+
assert response.input_id == uploaded.id
83+
84+
5885
@pytest.mark.asyncio
5986
async def test_live_async_summarize_text_success(
6087
pdfrest_api_key: str,

tests/live/test_live_translate_pdf_text.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -126,3 +126,32 @@ def test_live_translate_pdf_text_file_success(
126126
assert response.output_language == "fr"
127127
assert response.source_languages
128128
assert response.input_id == uploaded.id
129+
130+
131+
@pytest.mark.asyncio
132+
async def test_live_async_translate_pdf_text_file_success(
133+
pdfrest_api_key: str,
134+
pdfrest_live_base_url: str,
135+
) -> None:
136+
resource = get_test_resource_path("report.pdf")
137+
async with AsyncPdfRestClient(
138+
api_key=pdfrest_api_key,
139+
base_url=pdfrest_live_base_url,
140+
) as client:
141+
uploaded = (await client.files.create_from_paths([resource]))[0]
142+
response = await client.translate_pdf_text_to_file(
143+
uploaded,
144+
output_language="de",
145+
output_format="plaintext",
146+
)
147+
148+
assert isinstance(response, TranslatePdfTextFileResponse)
149+
assert response.output_files
150+
output_file = response.output_file
151+
assert output_file.name.endswith(".txt")
152+
assert output_file.type == "text/plain"
153+
assert output_file.size > 0
154+
assert response.warning is None
155+
assert response.output_language == "de"
156+
assert response.source_languages
157+
assert response.input_id == uploaded.id

0 commit comments

Comments
 (0)