66import pytest
77from pydantic import ValidationError
88
9- from pdfrest import AsyncPdfRestClient , PdfRestClient
10- from pdfrest .models import PdfRestDeletionResponse , PdfRestFileID
9+ from pdfrest import AsyncPdfRestClient , PdfRestClient , PdfRestErrorGroup
10+ from pdfrest .exceptions import PdfRestDeleteError
11+ from pdfrest .models import PdfRestFileID
1112from pdfrest .models ._internal import DeletePayload
1213
1314from .graphics_test_helpers import ASYNC_API_KEY , VALID_API_KEY , make_pdf_file
@@ -57,11 +58,10 @@ def handler(request: httpx.Request) -> httpx.Response:
5758
5859 transport = httpx .MockTransport (handler )
5960 with PdfRestClient (api_key = VALID_API_KEY , transport = transport ) as client :
60- response = client .files .delete (file_repr )
61+ result = client .files .delete (file_repr )
6162
6263 assert seen == {"post" : 1 }
63- assert isinstance (response , PdfRestDeletionResponse )
64- assert response .deletion_responses [str (file_repr .id )] == "Successfully Deleted"
64+ assert result is None
6565
6666
6767def test_delete_files_request_customization (
@@ -92,15 +92,15 @@ def handler(request: httpx.Request) -> httpx.Response:
9292
9393 transport = httpx .MockTransport (handler )
9494 with PdfRestClient (api_key = VALID_API_KEY , transport = transport ) as client :
95- response = client .files .delete (
95+ result = client .files .delete (
9696 file_repr ,
9797 extra_query = {"trace" : "true" },
9898 extra_headers = {"X-Debug" : "sync" },
9999 extra_body = {"debug" : True },
100100 timeout = 0.3 ,
101101 )
102102
103- assert isinstance ( response , PdfRestDeletionResponse )
103+ assert result is None
104104 timeout_value = captured_timeout ["value" ]
105105 assert timeout_value is not None
106106 if isinstance (timeout_value , dict ):
@@ -111,6 +111,74 @@ def handler(request: httpx.Request) -> httpx.Response:
111111 assert timeout_value == pytest .approx (0.3 )
112112
113113
114+ def test_delete_files_raises_error_for_failed_status (
115+ monkeypatch : pytest .MonkeyPatch ,
116+ ) -> None :
117+ monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
118+ file_repr = make_pdf_file (PdfRestFileID .generate (1 ))
119+
120+ def handler (request : httpx .Request ) -> httpx .Response :
121+ if request .method == "POST" and request .url .path == "/delete" :
122+ return httpx .Response (
123+ 200 ,
124+ json = {
125+ "deletionResponses" : {
126+ str (file_repr .id ): "File could not be deleted" ,
127+ }
128+ },
129+ )
130+ msg = f"Unexpected request { request .method } { request .url } "
131+ raise AssertionError (msg )
132+
133+ transport = httpx .MockTransport (handler )
134+ with (
135+ PdfRestClient (api_key = VALID_API_KEY , transport = transport ) as client ,
136+ pytest .raises (PdfRestErrorGroup ) as exc_info ,
137+ ):
138+ client .files .delete (file_repr )
139+
140+ assert len (exc_info .value .exceptions ) == 1
141+ inner = exc_info .value .exceptions [0 ]
142+ assert isinstance (inner , PdfRestDeleteError )
143+ assert inner .file_id == str (file_repr .id )
144+ assert "File could not be deleted" in str (inner )
145+
146+
147+ def test_delete_files_aggregates_multiple_failures (
148+ monkeypatch : pytest .MonkeyPatch ,
149+ ) -> None :
150+ monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
151+ first = make_pdf_file (PdfRestFileID .generate (1 ))
152+ second = make_pdf_file (PdfRestFileID .generate (2 ))
153+
154+ def handler (request : httpx .Request ) -> httpx .Response :
155+ if request .method == "POST" and request .url .path == "/delete" :
156+ return httpx .Response (
157+ 200 ,
158+ json = {
159+ "deletionResponses" : {
160+ str (first .id ): "Successfully Deleted" ,
161+ str (second .id ): "Permission denied" ,
162+ }
163+ },
164+ )
165+ msg = f"Unexpected request { request .method } { request .url } "
166+ raise AssertionError (msg )
167+
168+ transport = httpx .MockTransport (handler )
169+ with (
170+ PdfRestClient (api_key = VALID_API_KEY , transport = transport ) as client ,
171+ pytest .raises (PdfRestErrorGroup ) as exc_info ,
172+ ):
173+ client .files .delete ([first , second ])
174+
175+ assert len (exc_info .value .exceptions ) == 1
176+ inner = exc_info .value .exceptions [0 ]
177+ assert isinstance (inner , PdfRestDeleteError )
178+ assert inner .file_id == str (second .id )
179+ assert "Permission denied" in str (inner )
180+
181+
114182@pytest .mark .asyncio
115183async def test_async_delete_files_success (
116184 monkeypatch : pytest .MonkeyPatch ,
@@ -144,8 +212,45 @@ def handler(request: httpx.Request) -> httpx.Response:
144212 api_key = ASYNC_API_KEY ,
145213 transport = transport ,
146214 ) as client :
147- response = await client .files .delete (file_repr )
215+ result = await client .files .delete (file_repr )
148216
149217 assert seen == {"post" : 1 }
150- assert isinstance (response , PdfRestDeletionResponse )
151- assert response .deletion_responses [str (file_repr .id )] == "Successfully Deleted"
218+ assert result is None
219+
220+
221+ @pytest .mark .asyncio
222+ async def test_async_delete_files_raises_error_group (
223+ monkeypatch : pytest .MonkeyPatch ,
224+ ) -> None :
225+ monkeypatch .delenv ("PDFREST_API_KEY" , raising = False )
226+ first = make_pdf_file (PdfRestFileID .generate (1 ))
227+ second = make_pdf_file (PdfRestFileID .generate (2 ))
228+
229+ def handler (request : httpx .Request ) -> httpx .Response :
230+ if request .method == "POST" and request .url .path == "/delete" :
231+ return httpx .Response (
232+ 200 ,
233+ json = {
234+ "deletionResponses" : {
235+ str (first .id ): "Failed dependency" ,
236+ str (second .id ): "Successfully Deleted" ,
237+ }
238+ },
239+ )
240+ msg = f"Unexpected request { request .method } { request .url } "
241+ raise AssertionError (msg )
242+
243+ transport = httpx .MockTransport (handler )
244+ async with AsyncPdfRestClient (
245+ api_key = ASYNC_API_KEY ,
246+ transport = transport ,
247+ ) as client :
248+ with pytest .RaisesGroup (
249+ pytest .RaisesExc (
250+ PdfRestDeleteError ,
251+ match = f"Failed to delete file { first .id } .*Failed dependency" ,
252+ ),
253+ match = "Failed to delete one or more files." ,
254+ check = lambda eg : isinstance (eg , PdfRestErrorGroup ),
255+ ):
256+ await client .files .delete ([first , second ])
0 commit comments