From 86e38956738ba473b93e1591259c56f3b43d661a Mon Sep 17 00:00:00 2001 From: coniferish Date: Mon, 4 Dec 2023 21:03:28 -0600 Subject: [PATCH 1/4] create initial test for retry logic --- tests/test_utils_retries.py | 45 +++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 tests/test_utils_retries.py diff --git a/tests/test_utils_retries.py b/tests/test_utils_retries.py new file mode 100644 index 00000000..4ed7d4f1 --- /dev/null +++ b/tests/test_utils_retries.py @@ -0,0 +1,45 @@ +import os +import pytest + +import requests_mock + +from unstructured_client import UnstructuredClient +from unstructured_client.models import shared +from unstructured_client.utils.retries import BackoffStrategy, RetryConfig + + +def get_api_key(): + api_key = os.getenv("UNS_API_KEY") + if api_key is None: + raise ValueError("UNS_API_KEY environment variable not set") + return api_key + +def test_backoff_strategy(): + filename = "README.md" + backoff_strategy = BackoffStrategy( + initial_interval=100, max_interval=1000, exponent=1.5, max_elapsed_time=3000 + ) + retries = RetryConfig( + strategy="backoff", backoff=backoff_strategy, retry_connection_errors=True + ) + + with requests_mock.Mocker() as mock: + # mock 500 status code for POST requests to the api + mock.post("https://api.unstructured.io/general/v0/general", status_code=500) + session = UnstructuredClient(api_key_auth=get_api_key()) + + with open(filename, "rb") as f: + files=shared.Files( + content=f.read(), + file_name=filename, + ) + + req = shared.PartitionParameters(files=files) + + with pytest.raises(Exception) as excinfo: + resp = session.general.partition(req, retries=retries) + assert resp.status_code == 500 + assert "API error occurred" in str(excinfo.value) + + # the number of retries varies + assert len(mock.request_history) > 1 From 010a3319dab3fe52f637f71d03966bde2e913a7d Mon Sep 17 00:00:00 2001 From: coniferish Date: Tue, 5 Dec 2023 11:23:42 -0600 Subject: [PATCH 2/4] add .genignore file so Speakeasy does not overwrite tests --- .genignore | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .genignore diff --git a/.genignore b/.genignore new file mode 100644 index 00000000..2fe2c2fe --- /dev/null +++ b/.genignore @@ -0,0 +1,4 @@ +# https://www.speakeasyapi.dev/docs/customize-sdks/monkey-patching + +# ignore human-written test files +tests/test_utils_retries.py From 57dda505826bba1ba0ed5ee7856015c05aab03d9 Mon Sep 17 00:00:00 2001 From: coniferish Date: Tue, 5 Dec 2023 11:25:49 -0600 Subject: [PATCH 3/4] add comment to test --- tests/test_utils_retries.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tests/test_utils_retries.py b/tests/test_utils_retries.py index 4ed7d4f1..3e878e6c 100644 --- a/tests/test_utils_retries.py +++ b/tests/test_utils_retries.py @@ -14,6 +14,7 @@ def get_api_key(): raise ValueError("UNS_API_KEY environment variable not set") return api_key +# this test requires UNS_API_KEY be set in your shell session. Ex: `export UNS_API_KEY=` def test_backoff_strategy(): filename = "README.md" backoff_strategy = BackoffStrategy( @@ -24,7 +25,7 @@ def test_backoff_strategy(): ) with requests_mock.Mocker() as mock: - # mock 500 status code for POST requests to the api + # mock a 500 status code for POST requests to the api mock.post("https://api.unstructured.io/general/v0/general", status_code=500) session = UnstructuredClient(api_key_auth=get_api_key()) From 009d5bbb6049fb23d71fd2bf6ca1894a4f0c14d1 Mon Sep 17 00:00:00 2001 From: coniferish Date: Tue, 12 Dec 2023 14:45:55 -0600 Subject: [PATCH 4/4] Create Makefile and update message in test --- .genignore | 3 +++ Makefile | 19 +++++++++++++++++++ tests/test_utils_retries.py | 3 ++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 Makefile diff --git a/.genignore b/.genignore index 2fe2c2fe..ab9191ff 100644 --- a/.genignore +++ b/.genignore @@ -2,3 +2,6 @@ # ignore human-written test files tests/test_utils_retries.py + +# ignore Makefile +Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 00000000..2921f96d --- /dev/null +++ b/Makefile @@ -0,0 +1,19 @@ +PACKAGE_NAME := unstructured-python-client +CURRENT_DIR := $(shell pwd) +ARCH := $(shell uname -m) + +########### +# Install # +########### + +test-install: + pip install requests_mock + +################# +# Test and Lint # +################# + +.PHONY: test +test: + PYTHONPATH=. pytest \ + tests \ No newline at end of file diff --git a/tests/test_utils_retries.py b/tests/test_utils_retries.py index 3e878e6c..4a154c9a 100644 --- a/tests/test_utils_retries.py +++ b/tests/test_utils_retries.py @@ -11,7 +11,8 @@ def get_api_key(): api_key = os.getenv("UNS_API_KEY") if api_key is None: - raise ValueError("UNS_API_KEY environment variable not set") + raise ValueError("""UNS_API_KEY environment variable not set. +Set it in your current shell session with `export UNS_API_KEY=`""") return api_key # this test requires UNS_API_KEY be set in your shell session. Ex: `export UNS_API_KEY=`