@@ -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+
154213def 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+
189285def 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+
210326def 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+
257397def 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+
385571MERGE_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+ )
0 commit comments