Avnology ID
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 True

Async 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) == 1

Testing 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 == 30

Integration 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

On this page