56 lines
1.9 KiB
Python
56 lines
1.9 KiB
Python
"""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
|