Skip to content

Commit a277af0

Browse files
tests: Test delete raising exceptions
Assisted-by: Codex
1 parent 411b1e2 commit a277af0

2 files changed

Lines changed: 151 additions & 18 deletions

File tree

tests/live/test_live_delete.py

Lines changed: 36 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from __future__ import annotations
22

3+
from secrets import token_urlsafe
4+
35
import pytest
6+
from pydantic import ValidationError
47

5-
from pdfrest import PdfRestApiError, PdfRestClient
6-
from pdfrest.models import PdfRestDeletionResponse
8+
from pdfrest import PdfRestClient, PdfRestDeleteError, PdfRestErrorGroup
9+
from pdfrest.models import PdfRestFileID
710

811
from ..resources import get_test_resource_path
912

@@ -18,10 +21,9 @@ def test_live_delete_files_success(
1821
base_url=pdfrest_live_base_url,
1922
) as client:
2023
uploaded = client.files.create_from_paths([resource])[0]
21-
response = client.files.delete(uploaded)
24+
result = client.files.delete(uploaded)
2225

23-
assert isinstance(response, PdfRestDeletionResponse)
24-
assert response.deletion_responses[str(uploaded.id)] == "Successfully Deleted"
26+
assert result is None
2527

2628

2729
def test_live_delete_files_invalid_id(
@@ -34,8 +36,34 @@ def test_live_delete_files_invalid_id(
3436
base_url=pdfrest_live_base_url,
3537
) as client:
3638
uploaded = client.files.create_from_paths([resource])[0]
37-
with pytest.raises(PdfRestApiError):
39+
with pytest.raises(ValidationError):
40+
client.files.delete(uploaded, extra_body={"ids": token_urlsafe(16)})
41+
42+
43+
def test_live_delete_files_missing_id(
44+
pdfrest_api_key: str,
45+
pdfrest_live_base_url: str,
46+
) -> None:
47+
resource = get_test_resource_path("report.pdf")
48+
with PdfRestClient(
49+
api_key=pdfrest_api_key,
50+
base_url=pdfrest_live_base_url,
51+
) as client:
52+
bad_id_1 = PdfRestFileID.generate()
53+
bad_id_2 = PdfRestFileID.generate()
54+
uploaded = client.files.create_from_paths([resource])[0]
55+
with pytest.RaisesGroup(
56+
pytest.RaisesExc(
57+
PdfRestDeleteError,
58+
match=f"Failed to delete file {bad_id_1}.*does not exist",
59+
),
60+
pytest.RaisesExc(
61+
PdfRestDeleteError,
62+
match=f"Failed to delete file {bad_id_2}.*does not exist",
63+
),
64+
match="Failed to delete one or more files.",
65+
check=lambda eg: isinstance(eg, PdfRestErrorGroup),
66+
):
3867
client.files.delete(
39-
uploaded,
40-
extra_body={"ids": ""},
68+
uploaded, extra_body={"ids": ",".join([bad_id_1, bad_id_2])}
4169
)

tests/test_delete_files.py

Lines changed: 115 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
import pytest
77
from 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
1112
from pdfrest.models._internal import DeletePayload
1213

1314
from .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

6767
def 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
115183
async 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

Comments
 (0)