Skip to content

Commit 0e861aa

Browse files
import-form-data: Test all data file types
Assisted-by: Codex
1 parent e03c1a2 commit 0e861aa

9 files changed

Lines changed: 1130 additions & 20 deletions

tests/live/test_live_import_form_data.py

Lines changed: 131 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,93 @@
77

88
from ..resources import get_test_resource_path
99

10+
IMPORT_FORM_DATA_SUCCESS_CASES = (
11+
pytest.param(
12+
("acroform.pdf", "test-data-acro.xml", None),
13+
id="acro-xml",
14+
),
15+
pytest.param(
16+
("acroform.pdf", "test-data-acro.xfdf", None),
17+
id="acro-xfdf",
18+
),
19+
pytest.param(
20+
("xfa.pdf", "test-data-xfa.xml", None),
21+
id="xfa-xml",
22+
),
23+
pytest.param(
24+
("xfa.pdf", "test-data-xfa.xdp", None),
25+
id="xfa-xdp",
26+
),
27+
pytest.param(
28+
(
29+
"xfa.pdf",
30+
"test-data-xfa.xfd",
31+
"application/vnd.adobe.xfd+xml",
32+
),
33+
id="xfa-xfd",
34+
),
35+
)
36+
37+
38+
@pytest.fixture(scope="module", params=IMPORT_FORM_DATA_SUCCESS_CASES)
39+
def uploaded_success_import_form_data_case(
40+
pdfrest_api_key: str,
41+
pdfrest_live_base_url: str,
42+
request: pytest.FixtureRequest,
43+
) -> tuple[PdfRestFile, PdfRestFile]:
44+
pdf_resource_name, data_resource_name, forced_data_mime = request.param
45+
pdf_resource = get_test_resource_path(pdf_resource_name)
46+
data_resource = get_test_resource_path(data_resource_name)
47+
48+
with PdfRestClient(
49+
api_key=pdfrest_api_key,
50+
base_url=pdfrest_live_base_url,
51+
) as client:
52+
input_file = client.files.create_from_paths([pdf_resource])[0]
53+
data_file = client.files.create_from_paths([data_resource])[0]
54+
55+
# pdfRest currently reports .xfd uploads as application/octet-stream.
56+
# Override the local MIME metadata so the request can exercise xfd imports.
57+
if forced_data_mime is not None:
58+
data_file = data_file.model_copy(update={"type": forced_data_mime})
59+
60+
return input_file, data_file
61+
1062

1163
@pytest.fixture(scope="module")
12-
def uploaded_pdf_with_forms(
64+
def uploaded_acro_import_pair(
1365
pdfrest_api_key: str,
1466
pdfrest_live_base_url: str,
15-
) -> PdfRestFile:
16-
resource = get_test_resource_path("form_with_data.pdf")
67+
) -> tuple[PdfRestFile, PdfRestFile]:
68+
acro_pdf = get_test_resource_path("acroform.pdf")
69+
acro_data = get_test_resource_path("test-data-acro.xml")
70+
1771
with PdfRestClient(
1872
api_key=pdfrest_api_key,
1973
base_url=pdfrest_live_base_url,
2074
) as client:
21-
return client.files.create_from_paths([resource])[0]
75+
input_file = client.files.create_from_paths([acro_pdf])[0]
76+
data_file = client.files.create_from_paths([acro_data])[0]
77+
78+
return input_file, data_file
2279

2380

2481
@pytest.fixture(scope="module")
25-
def uploaded_form_data_file(
82+
def uploaded_acro_fdf_import_pair(
2683
pdfrest_api_key: str,
2784
pdfrest_live_base_url: str,
28-
) -> PdfRestFile:
29-
resource = get_test_resource_path("form_data.xml")
85+
) -> tuple[PdfRestFile, PdfRestFile]:
86+
acro_pdf = get_test_resource_path("acroform.pdf")
87+
acro_fdf = get_test_resource_path("test-data-acro.fdf")
88+
3089
with PdfRestClient(
3190
api_key=pdfrest_api_key,
3291
base_url=pdfrest_live_base_url,
3392
) as client:
34-
return client.files.create_from_paths([resource])[0]
93+
input_file = client.files.create_from_paths([acro_pdf])[0]
94+
data_file = client.files.create_from_paths([acro_fdf])[0]
95+
96+
return input_file, data_file
3597

3698

3799
@pytest.mark.parametrize(
@@ -44,14 +106,17 @@ def uploaded_form_data_file(
44106
def test_live_import_form_data(
45107
pdfrest_api_key: str,
46108
pdfrest_live_base_url: str,
47-
uploaded_pdf_with_forms: PdfRestFile,
48-
uploaded_form_data_file: PdfRestFile,
109+
uploaded_success_import_form_data_case: tuple[PdfRestFile, PdfRestFile],
49110
output_name: str | None,
50111
) -> None:
51112
kwargs: dict[str, str] = {}
52113
if output_name is not None:
53114
kwargs["output"] = output_name
54115

116+
uploaded_pdf_with_forms, uploaded_form_data_file = (
117+
uploaded_success_import_form_data_case
118+
)
119+
55120
with PdfRestClient(
56121
api_key=pdfrest_api_key,
57122
base_url=pdfrest_live_base_url,
@@ -65,6 +130,8 @@ def test_live_import_form_data(
65130
assert response.output_files
66131
output_file = response.output_file
67132
assert output_file.type == "application/pdf"
133+
assert output_file.size > 0
134+
assert response.warning is None
68135
assert str(uploaded_pdf_with_forms.id) in {
69136
str(file_id) for file_id in response.input_ids
70137
}
@@ -81,9 +148,12 @@ def test_live_import_form_data(
81148
async def test_live_async_import_form_data_success(
82149
pdfrest_api_key: str,
83150
pdfrest_live_base_url: str,
84-
uploaded_pdf_with_forms: PdfRestFile,
85-
uploaded_form_data_file: PdfRestFile,
151+
uploaded_success_import_form_data_case: tuple[PdfRestFile, PdfRestFile],
86152
) -> None:
153+
uploaded_pdf_with_forms, uploaded_form_data_file = (
154+
uploaded_success_import_form_data_case
155+
)
156+
87157
async with AsyncPdfRestClient(
88158
api_key=pdfrest_api_key,
89159
base_url=pdfrest_live_base_url,
@@ -98,6 +168,8 @@ async def test_live_async_import_form_data_success(
98168
output_file = response.output_file
99169
assert output_file.name.startswith("async-imported")
100170
assert output_file.type == "application/pdf"
171+
assert output_file.size > 0
172+
assert response.warning is None
101173
assert str(uploaded_pdf_with_forms.id) in {
102174
str(file_id) for file_id in response.input_ids
103175
}
@@ -106,12 +178,54 @@ async def test_live_async_import_form_data_success(
106178
}
107179

108180

181+
def test_live_import_form_data_fdf_server_error(
182+
pdfrest_api_key: str,
183+
pdfrest_live_base_url: str,
184+
uploaded_acro_fdf_import_pair: tuple[PdfRestFile, PdfRestFile],
185+
) -> None:
186+
uploaded_pdf_with_forms, uploaded_form_data_file = uploaded_acro_fdf_import_pair
187+
188+
with (
189+
PdfRestClient(
190+
api_key=pdfrest_api_key,
191+
base_url=pdfrest_live_base_url,
192+
) as client,
193+
pytest.raises(
194+
PdfRestApiError,
195+
match=r"(?i)(issue processing|filled correctly|corrupted)",
196+
),
197+
):
198+
client.import_form_data(uploaded_pdf_with_forms, uploaded_form_data_file)
199+
200+
201+
@pytest.mark.asyncio
202+
async def test_live_async_import_form_data_fdf_server_error(
203+
pdfrest_api_key: str,
204+
pdfrest_live_base_url: str,
205+
uploaded_acro_fdf_import_pair: tuple[PdfRestFile, PdfRestFile],
206+
) -> None:
207+
uploaded_pdf_with_forms, uploaded_form_data_file = uploaded_acro_fdf_import_pair
208+
209+
async with AsyncPdfRestClient(
210+
api_key=pdfrest_api_key,
211+
base_url=pdfrest_live_base_url,
212+
) as client:
213+
with pytest.raises(
214+
PdfRestApiError,
215+
match=r"(?i)(issue processing|filled correctly|corrupted)",
216+
):
217+
await client.import_form_data(
218+
uploaded_pdf_with_forms, uploaded_form_data_file
219+
)
220+
221+
109222
def test_live_import_form_data_invalid_data_file_id(
110223
pdfrest_api_key: str,
111224
pdfrest_live_base_url: str,
112-
uploaded_pdf_with_forms: PdfRestFile,
113-
uploaded_form_data_file: PdfRestFile,
225+
uploaded_acro_import_pair: tuple[PdfRestFile, PdfRestFile],
114226
) -> None:
227+
uploaded_pdf_with_forms, uploaded_form_data_file = uploaded_acro_import_pair
228+
115229
with (
116230
PdfRestClient(
117231
api_key=pdfrest_api_key,
@@ -130,9 +244,10 @@ def test_live_import_form_data_invalid_data_file_id(
130244
async def test_live_async_import_form_data_invalid_data_file_id(
131245
pdfrest_api_key: str,
132246
pdfrest_live_base_url: str,
133-
uploaded_pdf_with_forms: PdfRestFile,
134-
uploaded_form_data_file: PdfRestFile,
247+
uploaded_acro_import_pair: tuple[PdfRestFile, PdfRestFile],
135248
) -> None:
249+
uploaded_pdf_with_forms, uploaded_form_data_file = uploaded_acro_import_pair
250+
136251
async with AsyncPdfRestClient(
137252
api_key=pdfrest_api_key,
138253
base_url=pdfrest_live_base_url,

tests/resources/acroform.pdf

9.74 KB
Binary file not shown.

tests/resources/test-data-acro.fdf

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
%FDF-1.2
2+
%����
3+
1 0 obj
4+
<<
5+
/F (minimal_contact_form_acroform.pdf)
6+
/Fields [
7+
<< /T (Name) /V (Alice Example) >>
8+
<< /T (Email) /V (alice@example.com) >>
9+
<< /T (Phone) /V (+1 312 555 0100) >>
10+
<< /T (Message) /V (Hello!\nThis is a sample message populated via FDF.) >>
11+
<< /T (Subscribe) /V /Yes >>
12+
]
13+
>>
14+
endobj
15+
trailer
16+
<<
17+
/Root 1 0 R
18+
>>
19+
%%EOF
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
3+
<fields>
4+
<field name="Name"><value>Alice Example</value></field>
5+
<field name="Email"><value>alice@example.com</value></field>
6+
<field name="Phone"><value>+1 312 555 0100</value></field>
7+
<field name="Message"><value>Hello!
8+
This is a sample message populated via XFDF.</value></field>
9+
<field name="Subscribe"><value>Yes</value></field>
10+
</fields>
11+
</xfdf>

tests/resources/test-data-acro.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<ContactForm>
3+
<Name>Alice Example</Name>
4+
<Email>alice@example.com</Email>
5+
<Phone>+1 312 555 0100</Phone>
6+
<Message>Hello!
7+
This is a sample message populated via XML (convert to FDF/XFDF as needed).</Message>
8+
<Subscribe>true</Subscribe>
9+
</ContactForm>

0 commit comments

Comments
 (0)