99
1010from pdfrest import AsyncPdfRestClient , PdfRestClient
1111from pdfrest .models import PdfRestFileBasedResponse , PdfRestFileID
12- from pdfrest .models ._internal import PdfAddImagePayload
1312
1413from .graphics_test_helpers import (
1514 ASYNC_API_KEY ,
@@ -28,25 +27,19 @@ def test_add_image_to_pdf_success(monkeypatch: pytest.MonkeyPatch) -> None:
2827 )
2928 output_id = str (PdfRestFileID .generate ())
3029
31- request_payload = PdfAddImagePayload .model_validate (
32- {
33- "files" : [pdf_file ],
34- "image" : [image_file ],
35- "x" : 12 ,
36- "y" : 34 ,
37- "page" : 3 ,
38- "output" : "with-image" ,
39- }
40- ).model_dump (mode = "json" , by_alias = True , exclude_none = True , exclude_unset = True )
41-
4230 seen : dict [str , int ] = {"post" : 0 , "get" : 0 }
4331
4432 def handler (request : httpx .Request ) -> httpx .Response :
4533 if request .method == "POST" and request .url .path == "/pdf-with-added-image" :
4634 seen ["post" ] += 1
4735 assert request .headers ["wsn" ] == "pdfrest-python"
4836 payload = json .loads (request .content .decode ("utf-8" ))
49- assert payload == request_payload
37+ assert payload ["id" ] == str (pdf_file .id )
38+ assert payload ["image_id" ] == str (image_file .id )
39+ assert payload ["x" ] == 12
40+ assert payload ["y" ] == 34
41+ assert payload ["page" ] == 3
42+ assert payload ["output" ] == "with-image"
5043 return httpx .Response (
5144 200 ,
5245 json = {
@@ -222,6 +215,56 @@ def handler(_: httpx.Request) -> httpx.Response:
222215 )
223216
224217
218+ def test_add_image_to_pdf_rejects_multiple_input_files (
219+ monkeypatch : pytest .MonkeyPatch ,
220+ ) -> None :
221+ monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
222+
223+ def handler (_ : httpx .Request ) -> httpx .Response :
224+ pytest .fail ("Request should not be sent when validation fails." )
225+
226+ transport = httpx .MockTransport (handler )
227+ with (
228+ PdfRestClient (api_key = VALID_API_KEY , transport = transport ) as client ,
229+ pytest .raises (ValidationError , match = "at most 1 item" ),
230+ ):
231+ client .add_image_to_pdf (
232+ [
233+ make_pdf_file (PdfRestFileID .generate (1 )),
234+ make_pdf_file (PdfRestFileID .generate (2 )),
235+ ],
236+ image = make_image_file (PdfRestFileID .generate (3 )),
237+ x = 1 ,
238+ y = 1 ,
239+ page = 1 ,
240+ )
241+
242+
243+ def test_add_image_to_pdf_rejects_multiple_images (
244+ monkeypatch : pytest .MonkeyPatch ,
245+ ) -> None :
246+ monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
247+
248+ def handler (_ : httpx .Request ) -> httpx .Response :
249+ pytest .fail ("Request should not be sent when validation fails." )
250+
251+ transport = httpx .MockTransport (handler )
252+ with (
253+ PdfRestClient (api_key = VALID_API_KEY , transport = transport ) as client ,
254+ pytest .raises (ValidationError , match = "at most 1 item" ),
255+ ):
256+ client .add_image_to_pdf (
257+ make_pdf_file (PdfRestFileID .generate (1 )),
258+ image = [
259+ make_image_file (PdfRestFileID .generate (2 )),
260+ make_image_file (PdfRestFileID .generate (3 ), name = "secondary.png" ),
261+ ],
262+ x = 1 ,
263+ y = 1 ,
264+ page = 1 ,
265+ )
266+
267+
225268@pytest .mark .asyncio
226269async def test_async_add_image_to_pdf_success (
227270 monkeypatch : pytest .MonkeyPatch ,
@@ -231,23 +274,17 @@ async def test_async_add_image_to_pdf_success(
231274 image_file = make_image_file (PdfRestFileID .generate (2 ), mime_type = "image/gif" )
232275 output_id = str (PdfRestFileID .generate ())
233276
234- request_payload = PdfAddImagePayload .model_validate (
235- {
236- "files" : [pdf_file ],
237- "image" : [image_file ],
238- "x" : 5 ,
239- "y" : 6 ,
240- "page" : 7 ,
241- }
242- ).model_dump (mode = "json" , by_alias = True , exclude_none = True , exclude_unset = True )
243-
244277 seen : dict [str , int ] = {"post" : 0 , "get" : 0 }
245278
246279 def handler (request : httpx .Request ) -> httpx .Response :
247280 if request .method == "POST" and request .url .path == "/pdf-with-added-image" :
248281 seen ["post" ] += 1
249282 payload = json .loads (request .content .decode ("utf-8" ))
250- assert payload == request_payload
283+ assert payload ["id" ] == str (pdf_file .id )
284+ assert payload ["image_id" ] == str (image_file .id )
285+ assert payload ["x" ] == 5
286+ assert payload ["y" ] == 6
287+ assert payload ["page" ] == 7
251288 return httpx .Response (
252289 200 ,
253290 json = {
@@ -289,6 +326,7 @@ async def test_async_add_image_to_pdf_request_customization(
289326 pdf_file = make_pdf_file (PdfRestFileID .generate (1 ))
290327 image_file = make_image_file (PdfRestFileID .generate (2 ))
291328 output_id = str (PdfRestFileID .generate ())
329+ captured_timeout : dict [str , float | dict [str , float ] | None ] = {}
292330
293331 def handler (request : httpx .Request ) -> httpx .Response :
294332 if request .method == "POST" and request .url .path == "/pdf-with-added-image" :
@@ -297,6 +335,7 @@ def handler(request: httpx.Request) -> httpx.Response:
297335 payload = json .loads (request .content .decode ("utf-8" ))
298336 assert payload ["x" ] == 15
299337 assert payload ["y" ] == 25
338+ captured_timeout ["value" ] = request .extensions .get ("timeout" )
300339 return httpx .Response (
301340 200 ,
302341 json = {
@@ -331,6 +370,14 @@ def handler(request: httpx.Request) -> httpx.Response:
331370 )
332371
333372 assert response .output_files [0 ].name == "async-custom-with-image.pdf"
373+ timeout_value = captured_timeout ["value" ]
374+ assert timeout_value is not None
375+ if isinstance (timeout_value , dict ):
376+ assert all (
377+ component == pytest .approx (1.0 ) for component in timeout_value .values ()
378+ )
379+ else :
380+ assert timeout_value == pytest .approx (1.0 )
334381
335382
336383@pytest .mark .asyncio
0 commit comments