"""Tests for the OpenAPI spec and API docs routes.""" import pytest import pytest_asyncio import yaml from aiohttp import web from app.api_docs import add_api_docs_routes pytestmark = pytest.mark.asyncio @pytest_asyncio.fixture async def client(aiohttp_client): app = web.Application() routes = web.RouteTableDef() add_api_docs_routes(routes) app.add_routes(routes) return await aiohttp_client(app) async def test_get_spec(client): resp = await client.get("/openapi.yaml") assert resp.status == 200 assert resp.headers["Content-Type"] == "application/yaml" assert resp.headers["Cache-Control"] == "no-cache" spec = yaml.safe_load(await resp.text()) assert spec["openapi"].startswith("3.") assert spec["paths"] async def test_missing_spec_returns_404(client, monkeypatch): monkeypatch.setattr("app.api_docs.SPEC_PATH", "/nonexistent/openapi.yaml") resp = await client.get("/openapi.yaml") assert resp.status == 404 async def test_docs_page(client): resp = await client.get("/api-docs") assert resp.status == 200 assert resp.content_type == "text/html" body = await resp.text() # Redoc has no request execution; Swagger UI's "Try it out" would give # one-click access to destructive endpoints on an unauthenticated server. assert "