SDKsPython SDKGuides
Testing
Test Python applications that use the Python SDK with mocks and pytest.
Testing
Mock client with unittest.mock
from unittest.mock import AsyncMock, MagicMock, patch
from avnology_id.types import User, UserName, Session, Identity
# Create mock user
mock_user = User(
id="usr_test",
email="[email protected]",
email_verified=True,
phone=None,
phone_verified=False,
name=UserName(first="Test", last="User"),
avatar_url=None,
status="active",
organization_id="org_test",
locale="en-US",
timezone="America/New_York",
mfa_enabled=False,
mfa_methods=[],
metadata={"public": {}, "admin": {}},
created_at=datetime.now(),
updated_at=datetime.now(),
last_login_at=None,
verified_at=datetime.now(),
)Pytest fixtures
import pytest
from unittest.mock import MagicMock
from avnology_id import AvnologyId
@pytest.fixture
def mock_avnology():
client = MagicMock(spec=AvnologyId)
# Mock admin.list_users
client.admin.list_users.return_value = MagicMock(
users=[mock_user],
next_page_token=None,
total_size=1,
)
# Mock permissions.check
client.permissions.check.return_value = True
# Mock oauth.introspect_token
client.oauth.introspect_token.return_value = MagicMock(
active=True,
sub="usr_test",
scope="openid profile email",
org_id="org_test",
)
return client
def test_list_users(mock_avnology):
result = mock_avnology.admin.list_users(page_size=50)
assert len(result.users) == 1
assert result.users[0].email == "[email protected]"
def test_permission_check(mock_avnology):
allowed = mock_avnology.permissions.check(
subject="user:usr_test",
relation="editor",
object="project:proj_test",
)
assert allowed is TrueAsync fixtures
import pytest
from unittest.mock import AsyncMock
@pytest.fixture
def mock_async_avnology():
client = AsyncMock()
client.admin.list_users.return_value = MagicMock(
users=[mock_user],
next_page_token=None,
total_size=1,
)
return client
@pytest.mark.asyncio
async def test_async_list_users(mock_async_avnology):
result = await mock_async_avnology.admin.list_users(page_size=50)
assert len(result.users) == 1Testing error handling
from avnology_id.errors import InvalidCredentialsError, RateLimitError
def test_invalid_credentials(mock_avnology):
mock_avnology.login.side_effect = InvalidCredentialsError(
code="AVNOLOGY_AUTH_001",
message="Invalid email or password",
)
with pytest.raises(InvalidCredentialsError):
mock_avnology.login(email="[email protected]", password="wrong")
def test_rate_limit(mock_avnology):
mock_avnology.admin.list_users.side_effect = RateLimitError(
code="AVNOLOGY_API_429",
message="Too many requests",
retry_after=30,
limit=100,
remaining=0,
)
with pytest.raises(RateLimitError) as exc_info:
mock_avnology.admin.list_users()
assert exc_info.value.retry_after == 30Integration testing
import pytest
import os
@pytest.fixture
def avnology_client():
"""Real client for integration tests."""
return AvnologyId(
base_url=os.environ.get("AVNOLOGY_TEST_BASE_URL", "http://localhost:4455"),
api_key=os.environ["AVNOLOGY_TEST_API_KEY"],
)
@pytest.mark.integration
def test_create_and_delete_user(avnology_client):
user = avnology_client.admin.create_user(
email=f"test-{int(time.time())}@example.com",
password="TestPassword123!",
verified=True,
)
assert user.status == "active"
# Cleanup
avnology_client.admin.delete_user(user_id=user.id)See also
- FastAPI guide -- FastAPI integration
- Error types -- Exception classes