Срез 0: скелет ядра — ORM и миграция 0001 по DBML v5.13, seed, auth с dev-эмитентом, обмен через recognition_job #3

Merged
aep merged 97 commits from feat/1-slice-0-skeleton into main 2026-10-04 18:40:48 +03:00
2 changed files with 17 additions and 1 deletions
Showing only changes of commit 048e09f724 - Show all commits

View File

@ -27,7 +27,7 @@ from nats.aio.client import Client as NATS
from starlette.middleware.gzip import GZipMiddleware
from uvicorn.middleware.proxy_headers import ProxyHeadersMiddleware
from src.api.router import router
from src.api.router import API_PREFIX, router
from src.core.clients import S3Storage
from src.core.config import NATSSettings, get_settings
from src.core.exception_handlers import register_exception_handlers
@ -211,8 +211,15 @@ def sep_static(path: str, stat_dir: str) -> str:
return "/".join(sep_path[index:])
API_STATIC_PATH = API_PREFIX.strip("/")
class SPAStaticFiles(StaticFiles):
async def get_response(self, path: str, scope):
# Несуществующий маршрут API — честный 404 (в т.ч. для POST), а не index.html SPA и не 405 от StaticFiles:
# иначе dev-маршруты, которых при выключенных флагах нет, выглядели бы как «существующие»
if path == API_STATIC_PATH or path.startswith(API_STATIC_PATH + "/"):
raise HTTPException(status_code=HTTPStatus.NOT_FOUND)
try:
return await super().get_response(path, scope)
except (HTTPException, StarletteHTTPException) as ex:

View File

@ -362,3 +362,12 @@ def test_module_router_matches_settings() -> None:
"""Модульный `router` собран по настройкам процесса (`.env.test`: DEBUG и AUTH_DEV_ISSUER включены)."""
paths = {getattr(r, "path", None) for r in router.routes}
assert {"/api/v1/me", "/api/v1/dev/token"} <= paths
@pytest.mark.parametrize("method", ["GET", "POST"])
async def test_unknown_api_path_is_404_not_spa(method: str) -> None:
"""Под `/api/v1` SPA-заглушка не отвечает: выключенный dev-маршрут — 404 (не 405, не index.html)."""
app_module = importlib.import_module("src.app")
async with _client(app_module.app) as client:
response = await client.request(method, "/api/v1/dev/no-such-route", json={})
assert response.status_code == HTTP_NOT_FOUND