@@ -66,6 +66,37 @@ def test_summarize_payload_invalid_page_range() -> None:
6666 SummarizePdfTextPayload .model_validate ({"files" : [file_repr ], "pages" : ["5-2" ]})
6767
6868
69+ @pytest .mark .asyncio
70+ async def test_async_summarize_payload_rejects_invalid_mime () -> None :
71+ file_id = str (PdfRestFileID .generate ())
72+ image_file = PdfRestFile .model_validate (
73+ {
74+ "id" : file_id ,
75+ "name" : "image.png" ,
76+ "url" : f"https://api.pdfrest.com/resource/{ file_id } " ,
77+ "type" : "image/png" ,
78+ "size" : 10 ,
79+ "modified" : "2024-01-01T00:00:00Z" ,
80+ "scheduledDeletionTimeUtc" : None ,
81+ }
82+ )
83+
84+ with pytest .raises (
85+ ValidationError , match = "Must be a PDF, Markdown, or plain text file"
86+ ):
87+ SummarizePdfTextPayload .model_validate ({"files" : [image_file ]})
88+
89+
90+ @pytest .mark .asyncio
91+ async def test_async_summarize_payload_invalid_page_range () -> None :
92+ file_repr = make_pdf_file (PdfRestFileID .generate (1 ))
93+
94+ with pytest .raises (
95+ ValidationError , match = "The start page must be less than or equal to the end"
96+ ):
97+ SummarizePdfTextPayload .model_validate ({"files" : [file_repr ], "pages" : ["5-2" ]})
98+
99+
69100def test_summarize_text_json_success (monkeypatch : pytest .MonkeyPatch ) -> None :
70101 monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
71102 input_file = _make_text_file (str (PdfRestFileID .generate (1 )))
@@ -245,6 +276,80 @@ def handler(request: httpx.Request) -> httpx.Response:
245276 assert timeout_value == pytest .approx (0.25 )
246277
247278
279+ @pytest .mark .asyncio
280+ async def test_async_summarize_text_to_file_request_customization (
281+ monkeypatch : pytest .MonkeyPatch ,
282+ ) -> None :
283+ monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
284+ input_file = make_pdf_file (PdfRestFileID .generate (2 ))
285+ payload_dump = SummarizePdfTextPayload .model_validate (
286+ {
287+ "files" : [input_file ],
288+ "output_type" : "file" ,
289+ "output_format" : "markdown" ,
290+ "summary_format" : "overview" ,
291+ }
292+ ).model_dump (mode = "json" , by_alias = True , exclude_none = True , exclude_unset = True )
293+ output_id = str (PdfRestFileID .generate ())
294+
295+ captured_timeout : dict [str , float | dict [str , float ] | None ] = {}
296+ seen : dict [str , int ] = {"post" : 0 , "get" : 0 }
297+
298+ def handler (request : httpx .Request ) -> httpx .Response :
299+ if request .method == "POST" and request .url .path == "/summarized-pdf-text" :
300+ seen ["post" ] += 1
301+ assert request .url .params ["trace" ] == "true"
302+ assert request .headers ["X-Debug" ] == "async"
303+ captured_timeout ["value" ] = request .extensions .get ("timeout" )
304+ payload = json .loads (request .content .decode ("utf-8" ))
305+ for key , value in payload_dump .items ():
306+ assert payload [key ] == value
307+ assert payload ["debug" ] is True
308+ return httpx .Response (
309+ 200 ,
310+ json = {
311+ "outputId" : output_id ,
312+ "inputId" : str (input_file .id ),
313+ },
314+ )
315+ if request .method == "GET" and request .url .path == f"/resource/{ output_id } " :
316+ seen ["get" ] += 1
317+ assert request .url .params ["format" ] == "info"
318+ assert request .url .params ["trace" ] == "true"
319+ assert request .headers ["X-Debug" ] == "async"
320+ return httpx .Response (
321+ 200 ,
322+ json = build_file_info_payload (
323+ output_id , "async-summary.txt" , "text/plain"
324+ ),
325+ )
326+ msg = f"Unexpected request { request .method } { request .url } "
327+ raise AssertionError (msg )
328+
329+ transport = httpx .MockTransport (handler )
330+ async with AsyncPdfRestClient (api_key = ASYNC_API_KEY , transport = transport ) as client :
331+ response = await client .summarize_text_to_file (
332+ input_file ,
333+ extra_query = {"trace" : "true" },
334+ extra_headers = {"X-Debug" : "async" },
335+ extra_body = {"debug" : True },
336+ timeout = 0.25 ,
337+ )
338+
339+ assert seen == {"post" : 1 , "get" : 1 }
340+ assert isinstance (response , PdfRestFileBasedResponse )
341+ assert response .output_file .id == output_id
342+ assert response .output_file .name == "async-summary.txt"
343+ timeout_value = captured_timeout ["value" ]
344+ assert timeout_value is not None
345+ if isinstance (timeout_value , dict ):
346+ assert all (
347+ component == pytest .approx (0.25 ) for component in timeout_value .values ()
348+ )
349+ else :
350+ assert timeout_value == pytest .approx (0.25 )
351+
352+
248353def test_summarize_text_success (monkeypatch : pytest .MonkeyPatch ) -> None :
249354 monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
250355 input_file = make_pdf_file (PdfRestFileID .generate (2 ))
0 commit comments