Files
Stevan Freeborn 6774f42c2f test: add unit and integration test suite for the new SDK
- 268 unit tests covering all sync and async client methods
- 196 integration tests against a real sandbox API
- Mock-based tests using respx for sync and async HTTP mocking
- Paging, error handling, and edge case coverage (400/401/403/404/500/418)
- Integration test utilities and test data files
- .env.example with sandbox environment variables
2026-06-26 17:43:08 -05:00

278 lines
8.6 KiB
Python

import uuid
import pytest
from onspring_api_sdk.models import ListItemRequest
pytestmark = pytest.mark.integration
def _unique_name():
return f"test_list_value_{uuid.uuid4().hex[:8]}"
class TestAddOrUpdateListItem:
_new_item_ids: list[uuid.UUID] = []
@pytest.fixture(autouse=True)
def cleanup(self, client, test_list_id):
yield
for item_id in self._new_item_ids:
client.delete_list_item(list_id=test_list_id, item_id=str(item_id))
self._new_item_ids.clear()
@pytest.mark.flaky(reruns=3)
def test_add(self, client, test_list_id):
request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
numeric_value=1,
color="#000000",
)
response = client.add_or_update_list_item(request)
assert response.status_code == 201
assert response.is_successful
assert response.message is not None
assert response.data is not None
assert response.data.id is not None
self._new_item_ids.append(response.data.id)
@pytest.mark.flaky(reruns=3)
async def test_add_async(self, async_client, test_list_id):
request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
numeric_value=1,
color="#000000",
)
response = await async_client.add_or_update_list_item(request)
assert response.status_code == 201
assert response.is_successful
assert response.data is not None
assert response.data.id is not None
if response.data.id:
import os
from onspring_api_sdk import OnspringClient
sync = OnspringClient(os.environ["API_BASE_URL"], os.environ["SANDBOX_API_KEY"])
sync.delete_list_item(list_id=test_list_id, item_id=str(response.data.id))
@pytest.mark.flaky(reruns=3)
def test_update(self, client, test_list_id):
add_request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
numeric_value=1,
color="#000000",
)
add_response = client.add_or_update_list_item(add_request)
assert add_response.data is not None
item_id = add_response.data.id
self._new_item_ids.append(item_id)
update_request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
id=item_id,
numeric_value=1,
color="#000000",
)
update_response = client.add_or_update_list_item(update_request)
assert update_response.status_code == 200
assert update_response.is_successful
assert update_response.message is not None
assert update_response.data is not None
@pytest.mark.flaky(reruns=3)
async def test_update_async(self, async_client, test_list_id):
add_request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
numeric_value=1,
color="#000000",
)
add_response = await async_client.add_or_update_list_item(add_request)
assert add_response.data is not None
item_id = add_response.data.id
import os
from onspring_api_sdk import OnspringClient
sync = OnspringClient(os.environ["API_BASE_URL"], os.environ["SANDBOX_API_KEY"])
update_request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
id=item_id,
numeric_value=1,
color="#000000",
)
update_response = await async_client.add_or_update_list_item(update_request)
assert update_response.status_code == 200
assert update_response.is_successful
assert update_response.data is not None
sync.delete_list_item(list_id=test_list_id, item_id=str(item_id))
@pytest.mark.flaky(reruns=3)
def test_invalid_api_key_returns_401(self, base_url):
from onspring_api_sdk import OnspringClient
bad = OnspringClient(base_url, "invalid")
request = ListItemRequest(list_id=1, name="test", numeric_value=1, color="#000000")
response = bad.add_or_update_list_item(request)
assert response.status_code == 401
assert not response.is_successful
assert response.message is not None
assert response.data is None
@pytest.mark.flaky(reruns=3)
def test_no_access_returns_403(self, client):
request = ListItemRequest(list_id=1, name="test", numeric_value=1, color="#000000")
response = client.add_or_update_list_item(request)
assert response.status_code == 403
assert not response.is_successful
assert response.message is not None
assert response.data is None
@pytest.mark.flaky(reruns=3)
def test_list_not_found_returns_404(self, client):
request = ListItemRequest(list_id=0, name="test", numeric_value=1, color="#000000")
response = client.add_or_update_list_item(request)
assert response.status_code == 404
assert not response.is_successful
assert response.message is not None
assert response.data is None
@pytest.mark.flaky(reruns=3)
def test_item_not_found_returns_404(self, client, test_list_id):
request = ListItemRequest(
list_id=test_list_id,
id=uuid.UUID("3fa85f64-5717-4562-b3fc-2c963f66afa6"),
name="test",
)
response = client.add_or_update_list_item(request)
assert response.status_code == 404
assert not response.is_successful
assert response.message is not None
assert response.data is None
class TestDeleteListItem:
@pytest.mark.flaky(reruns=3)
def test_sync(self, client, test_list_id):
add_request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
numeric_value=1,
color="#000000",
)
add_response = client.add_or_update_list_item(add_request)
assert add_response.data is not None
item_id = str(add_response.data.id)
response = client.delete_list_item(list_id=test_list_id, item_id=item_id)
assert response.status_code == 204
assert response.is_successful
assert response.message is not None
@pytest.mark.flaky(reruns=3)
async def test_async(self, async_client, test_list_id):
import os
from onspring_api_sdk import OnspringClient
sync = OnspringClient(os.environ["API_BASE_URL"], os.environ["SANDBOX_API_KEY"])
add_request = ListItemRequest(
list_id=test_list_id,
name=_unique_name(),
numeric_value=1,
color="#000000",
)
add_response = sync.add_or_update_list_item(add_request)
assert add_response.data is not None
item_id = str(add_response.data.id)
response = await async_client.delete_list_item(list_id=test_list_id, item_id=item_id)
assert response.status_code == 204
assert response.is_successful
@pytest.mark.flaky(reruns=3)
def test_invalid_api_key_returns_401(self, base_url):
from onspring_api_sdk import OnspringClient
bad = OnspringClient(base_url, "invalid")
response = bad.delete_list_item(list_id=1, item_id="1")
assert response.status_code == 401
assert not response.is_successful
assert response.message is not None
assert response.data is None
@pytest.mark.flaky(reruns=3)
def test_no_access_returns_403(self, client, test_list_id_no_access, test_list_item_id_no_access):
response = client.delete_list_item(list_id=test_list_id_no_access, item_id=test_list_item_id_no_access)
assert response.status_code == 403
assert not response.is_successful
assert response.message is not None
assert response.data is None
@pytest.mark.flaky(reruns=3)
def test_list_not_found_returns_404(self, client):
response = client.delete_list_item(list_id=0, item_id="3fa85f64-5717-4562-b3fc-2c963f66afa6")
assert response.status_code == 404
assert not response.is_successful
assert response.message is not None
assert response.data is None
@pytest.mark.flaky(reruns=3)
def test_item_not_found_returns_404(self, client, test_list_id):
response = client.delete_list_item(
list_id=test_list_id,
item_id="3fa85f64-5717-4562-b3fc-2c963f66afa6",
)
assert response.status_code == 404
assert not response.is_successful
assert response.message is not None
assert response.data is None