"""Verify all expected routes are present in the OpenAPI spec.""" import pytest from httpx import ASGITransport, AsyncClient from cartsnitch_api.main import app EXPECTED_ROUTES = [ # Auth (3 — register/login/refresh are handled by Better-Auth service) ("get", "/auth/me"), ("patch", "/auth/me"), ("delete", "/auth/me"), # Stores (4) ("get", "/api/v1/stores"), ("get", "/api/v1/me/stores"), ("post", "/api/v1/me/stores/{store_slug}/connect"), ("delete", "/api/v1/me/stores/{store_slug}"), # Purchases (3) ("get", "/api/v1/purchases"), ("get", "/api/v1/purchases/stats"), ("get", "/api/v1/purchases/{purchase_id}"), # Products (3) ("get", "/api/v1/products"), ("get", "/api/v1/products/{product_id}"), ("get", "/api/v1/products/{product_id}/prices"), # Prices (3) ("get", "/api/v1/prices/trends"), ("get", "/api/v1/prices/increases"), ("get", "/api/v1/prices/comparison"), # Coupons (2) ("get", "/api/v1/coupons"), ("get", "/api/v1/coupons/relevant"), # Shopping (2) ("post", "/api/v1/shopping/optimize"), ("get", "/api/v1/shopping/lists"), # Alerts (3) ("get", "/api/v1/alerts"), ("get", "/api/v1/alerts/settings"), ("put", "/api/v1/alerts/settings"), # Scraping (2) ("post", "/api/v1/scraping/{store_slug}/sync"), ("get", "/api/v1/scraping/status"), # Public (3) ("get", "/api/v1/public/trends/{product_id}"), ("get", "/api/v1/public/store-comparison"), ("get", "/api/v1/public/inflation"), # Health (1) ("get", "/health"), ] @pytest.mark.asyncio async def test_all_routes_in_openapi(): transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as client: resp = await client.get("/openapi.json") assert resp.status_code == 200 spec = resp.json() paths = spec["paths"] registered = set() for path, methods in paths.items(): for method in methods: if method in ("get", "post", "put", "delete", "patch"): registered.add((method, path)) missing = [] for method, path in EXPECTED_ROUTES: if (method, path) not in registered: missing.append(f"{method.upper()} {path}") assert not missing, "Missing routes in OpenAPI spec:\n" + "\n".join(missing) @pytest.mark.asyncio async def test_route_count(): transport = ASGITransport(app=app) async with AsyncClient(transport=transport, base_url="http://test") as client: resp = await client.get("/openapi.json") spec = resp.json() paths = spec["paths"] count = 0 for _path, methods in paths.items(): for method in methods: if method in ("get", "post", "put", "delete", "patch"): count += 1 assert count == 31, f"Expected 31 routes, found {count}"