Skip to content

Commit 3b60f65

Browse files
committed
Migrate unit tests
* Update calls that don't use PartitionRequest * Instances of shared.Files need to use keyword args * Update request mocks to use httpx
1 parent 9ad58a1 commit 3b60f65

File tree

3 files changed

+73
-42
lines changed

3 files changed

+73
-42
lines changed

_test_unstructured_client/unit/test_custom_hooks.py

Lines changed: 69 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33

44
import pytest
55
import requests
6-
import requests_mock
6+
import httpx
7+
from httpx import Response, ConnectError
8+
79
from _test_unstructured_client.unit_utils import FixtureRequest, Mock, method_mock
810
from unstructured_client import UnstructuredClient
9-
from unstructured_client.models import shared
11+
from unstructured_client.models import shared, operations
1012
from unstructured_client.models.errors import SDKError
1113
from unstructured_client.utils.retries import BackoffStrategy, RetryConfig
1214

@@ -23,23 +25,33 @@ def test_unit_retry_with_backoff_does_retry(caplog):
2325
strategy="backoff", backoff=backoff_strategy, retry_connection_errors=True
2426
)
2527

26-
with requests_mock.Mocker() as mock:
27-
# mock a 502 status code for POST requests to the api
28-
mock.post("https://api.unstructuredapp.io/general/v0/general", status_code=502)
29-
session = UnstructuredClient(api_key_auth=FAKE_KEY)
28+
# List to track the number of requests
29+
# (Use a list so we can pass a reference into mock_post)
30+
request_count = [0]
31+
32+
def mock_post(request):
33+
request_count[0] += 1
34+
if request.url == "https://api.unstructuredapp.io/general/v0/general" and request.method == "POST":
35+
return Response(502, request=request)
36+
37+
transport = httpx.MockTransport(mock_post)
38+
client = httpx.Client(transport=transport)
39+
session = UnstructuredClient(api_key_auth=FAKE_KEY, client=client)
3040

31-
with open(filename, "rb") as f:
32-
files = shared.Files(content=f.read(), file_name=filename)
41+
with open(filename, "rb") as f:
42+
files = shared.Files(content=f.read(), file_name=filename)
3343

34-
req = shared.PartitionParameters(files=files)
44+
req = operations.PartitionRequest(
45+
partition_parameters=shared.PartitionParameters(files=files)
46+
)
3547

36-
with pytest.raises(Exception) as excinfo:
37-
resp = session.general.partition(req, retries=retries)
38-
assert resp.status_code == 502
39-
assert "API error occurred" in str(excinfo.value)
48+
with pytest.raises(Exception) as excinfo:
49+
resp = session.general.partition(request=req, retries=retries)
50+
assert resp.status_code == 502
51+
assert "API error occurred" in str(excinfo.value)
4052

41-
# the number of retries varies
42-
assert len(mock.request_history) > 1
53+
# the number of retries varies
54+
assert request_count[0] > 1
4355

4456

4557
@pytest.mark.parametrize("status_code", [500, 503])
@@ -53,17 +65,23 @@ def test_unit_backoff_strategy_logs_retries_5XX(status_code: int, caplog):
5365
strategy="backoff", backoff=backoff_strategy, retry_connection_errors=True
5466
)
5567

56-
with requests_mock.Mocker() as mock:
57-
# mock a 500/503 status code for POST requests to the api
58-
mock.post("https://api.unstructuredapp.io/general/v0/general", status_code=status_code)
59-
session = UnstructuredClient(api_key_auth=FAKE_KEY)
68+
def mock_post(request):
69+
if request.url == "https://api.unstructuredapp.io/general/v0/general" and request.method == "POST":
70+
return Response(status_code, request=request)
6071

61-
with open(filename, "rb") as f:
62-
files = shared.Files(content=f.read(), file_name=filename)
72+
transport = httpx.MockTransport(mock_post)
73+
client = httpx.Client(transport=transport)
74+
session = UnstructuredClient(api_key_auth=FAKE_KEY, client=client)
75+
76+
with open(filename, "rb") as f:
77+
files = shared.Files(content=f.read(), file_name=filename)
78+
79+
req = operations.PartitionRequest(
80+
partition_parameters=shared.PartitionParameters(files=files)
81+
)
6382

64-
req = shared.PartitionParameters(files=files)
65-
with pytest.raises(Exception):
66-
session.general.partition(req, retries=retries)
83+
with pytest.raises(Exception):
84+
session.general.partition(request=req, retries=retries)
6785

6886
pattern = re.compile(f"Failed to process a request due to API server error with status code {status_code}. "
6987
"Attempting retry number 1 after sleep.")
@@ -79,22 +97,28 @@ def test_unit_backoff_strategy_logs_retries_connection_error(caplog):
7997
retries = RetryConfig(
8098
strategy="backoff", backoff=backoff_strategy, retry_connection_errors=True
8199
)
82-
with requests_mock.Mocker() as mock:
83-
# mock a connection error response to POST request
84-
mock.post("https://api.unstructuredapp.io/general/v0/general", exc=requests.exceptions.ConnectionError)
85-
session = UnstructuredClient(api_key_auth=FAKE_KEY)
86100

87-
with open(filename, "rb") as f:
88-
files = shared.Files(content=f.read(), file_name=filename)
101+
def mock_post(request):
102+
raise ConnectError("Mocked connection error", request=request)
89103

90-
req = shared.PartitionParameters(files=files)
91-
with pytest.raises(Exception):
92-
session.general.partition(req, retries=retries)
104+
transport = httpx.MockTransport(mock_post)
105+
client = httpx.Client(transport=transport)
106+
session = UnstructuredClient(api_key_auth=FAKE_KEY, client=client)
107+
108+
with open(filename, "rb") as f:
109+
files = shared.Files(content=f.read(), file_name=filename)
110+
111+
req = operations.PartitionRequest(
112+
partition_parameters=shared.PartitionParameters(files=files)
113+
)
114+
115+
with pytest.raises(Exception):
116+
session.general.partition(request=req, retries=retries)
93117

94118
pattern = re.compile(f"Failed to process a request due to connection error .*? "
95119
"Attempting retry number 1 after sleep.")
96120
assert bool(pattern.search(caplog.text))
97-
121+
98122

99123
@pytest.mark.parametrize(
100124
"server_url",
@@ -166,17 +190,24 @@ def test_unit_clean_server_url_fixes_malformed_urls_with_positional_arguments(se
166190

167191

168192
def test_unit_issues_warning_on_a_401(caplog, session_: Mock, response_: requests.Session):
169-
client = UnstructuredClient(api_key_auth=FAKE_KEY)
170-
session_.return_value = response_
193+
def mock_post(request):
194+
return Response(401, request=request)
195+
196+
transport = httpx.MockTransport(mock_post)
197+
client = httpx.Client(transport=transport)
198+
session = UnstructuredClient(api_key_auth=FAKE_KEY, client=client)
199+
171200
filename = "_sample_docs/layout-parser-paper-fast.pdf"
172201
with open(filename, "rb") as f:
173202
files = shared.Files(content=f.read(), file_name=filename)
174203

175-
req = shared.PartitionParameters(files=files)
204+
req = operations.PartitionRequest(
205+
partition_parameters=shared.PartitionParameters(files=files)
206+
)
176207

177208
with pytest.raises(SDKError, match="API error occurred: Status 401"):
178209
with caplog.at_level(logging.WARNING):
179-
client.general.partition(req)
210+
session.general.partition(request=req)
180211

181212
assert any(
182213
"This API key is invalid against the paid API. If intending to use the free API, please initialize UnstructuredClient with `server='free-api'`."

_test_unstructured_client/unit/test_split_pdf_hook.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -235,7 +235,7 @@ def test_unit_parse_form_data():
235235

236236
# Expected results
237237
expected_form_data = {
238-
"files": shared.Files(b"file_content", "test_file.pdf"),
238+
"files": shared.Files(content=b"file_content", file_name="test_file.pdf"),
239239
"parameter_1": "value_1",
240240
"parameter_2": "value_2",
241241
"list_parameter": ["value_1", "value_2"],
@@ -310,7 +310,7 @@ def test_unit_is_pdf_valid_pdf():
310310

311311
def test_unit_is_pdf_invalid_extension(caplog):
312312
"""Test is pdf method returns False for file with invalid extension."""
313-
file = shared.Files(b"txt_content", "test_file.txt")
313+
file = shared.Files(content=b"txt_content", file_name="test_file.txt")
314314

315315
with caplog.at_level(logging.INFO):
316316
result = pdf_utils.is_pdf(file)
@@ -321,7 +321,7 @@ def test_unit_is_pdf_invalid_extension(caplog):
321321

322322
def test_unit_is_pdf_invalid_pdf(caplog):
323323
"""Test is pdf method returns False for file with invalid pdf content."""
324-
file = shared.Files(b"invalid_pdf_content", "test_file.pdf")
324+
file = shared.Files(content=b"invalid_pdf_content", file_name="test_file.pdf")
325325

326326
with caplog.at_level(logging.WARNING):
327327
result = pdf_utils.is_pdf(file)

src/unstructured_client/_hooks/custom/form_utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ def parse_form_data(decoded_data: MultipartDecoder) -> FormData:
214214
filename = part_params.get("filename")
215215
if filename is None or not filename.strip():
216216
raise ValueError("Filename can't be an empty string.")
217-
form_data[PARTITION_FORM_FILES_KEY] = shared.Files(part.content, filename)
217+
form_data[PARTITION_FORM_FILES_KEY] = shared.Files(content=part.content, file_name=filename)
218218
else:
219219
content = part.content.decode()
220220
if name in form_data:

0 commit comments

Comments
 (0)