"""Tests of the admin interface.""" from collections.abc import AsyncIterator from contextlib import asynccontextmanager import pytest import httpx class TestAdminAPI: """Tests of the Admin REST API.""" @pytest.mark.asyncio async def test_health_check( self, admin_server: tuple[str, tuple[str, str]] ) -> None: """Test admin login.""" async with self.http_client(admin_server, False) as client: resp = await client.get("/health") assert resp.status_code == 200 @pytest.mark.asyncio async def test_admin_login(self, admin_server: tuple[str, tuple[str, str]]) -> None: """Test admin login.""" async with self.http_client(admin_server, False) as client: resp = await client.get("api/v1/clients/") assert resp.status_code == 401 async with self.http_client(admin_server, True) as client: resp = await client.get("api/v1/clients/") assert resp.status_code == 200 @asynccontextmanager async def http_client( self, admin_server: tuple[str, tuple[str, str]], authenticate: bool = True ) -> AsyncIterator[httpx.AsyncClient]: """Run a client towards the admin rest api.""" admin_url, credentials = admin_server username, password = credentials headers: dict[str, str] | None = None if authenticate: async with httpx.AsyncClient(base_url=admin_url) as client: response = await client.post( "api/v1/token", data={"username": username, "password": password} ) assert response.status_code == 200 data = response.json() assert "access_token" in data token = data["access_token"] headers = {"Authorization": f"Bearer {token}"} async with httpx.AsyncClient(base_url=admin_url, headers=headers) as client: yield client