"""App-assembly smoke test — DB-free. Uses TestClient WITHOUT its context-manager form on purpose: that skips the lifespan (which opens a DB session + starts the scheduler), so the app object can be built and its OpenAPI schema generated with no database. That alone proves every included router imported and wired cleanly — a broken route registration or import fails right here. Endpoints that actually answer (/healthz, /api/version, the auth/feed/downloads routers) all touch the database, so exercising THEM belongs in a DB-backed integration lane (needs a test Postgres + migrations) — deferred; see siftlode-ops/ROADMAP.md R2 S2b. """ from fastapi.testclient import TestClient from app.main import app client = TestClient(app) # no `with` → lifespan/startup does not run → no DB required def test_app_assembles_and_serves_openapi(): schema = client.get("/openapi.json") assert schema.status_code == 200 paths = schema.json()["paths"] # A handful of endpoints that must always exist — a rename/removal is a real contract change, # and their absence here would mean a router failed to register. for path in ["/healthz", "/api/version", "/api/feed", "/api/me"]: assert path in paths, f"missing route {path} — a router failed to wire up"