Le français du dépôt s'écrit accentué. Harmonise les commentaires
d'en-tête, les docstrings, le message de démarrage et les deux détails
d'erreur de la sonde de disponibilité, avec leurs assertions.
Les repositories a venir parlent du SQL : les eprouver sur un double ne prouve
rien. La fixture ouvre une vraie connexion, d'ou le marqueur integration.
Le README annonce deja tests/ comme miroir de app/, mais seul tests/api
existait. Les paquets core, db, services et repositories attendent le metier
a venir, pour que personne n'ait a choisir ou poser son premier test.
Chaque test reecrivait sa classe de session et sa fonction d'override, soit
trois fois le meme decor pour un seul endpoint. FakeSession et la fixture
fake_session portent ce decor, make_settings fabrique une Settings dont les
valeurs priment sur l'environnement.
APP_ENV, APP_DEBUG, APP_LOG_LEVEL et APP_CORS_ORIGINS n'etaient poses nulle
part : le .env du developpeur les decidait, alors que les tests assertent en
dur l'environnement et que create_app coupe /openapi.json hors developpement.
Un poste portant APP_ENV=prod faisait tomber deux tests.
Fixe aussi asyncio_default_fixture_loop_scope, que pytest-asyncio 1.4 reclame.
/api/v1/health/ready interrogeait la base par un SELECT 1, qui ne distingue
pas un PostgreSQL nu d'un PostgreSQL avec TimescaleDB. La sonde lit desormais
pg_extension et repond 503 si l'extension manque, cas qui survient quand
db/init n'a pas ete joue.
- Premiere revision Alembic : aucune table, une garde qui refuse de
s'appliquer sans l'extension.
- Tests du chemin nominal et de l'extension absente, plus un test marque
`integration` contre la vraie base. pytest ecarte ce marqueur par defaut
pour que make check reste jouable sans Docker.
- conftest recycle l'engine entre les tests : get_engine est lru_cache alors
que pytest-asyncio ouvre une boucle par test, et les connexions asyncpg
sont liees a leur boucle.
Structure en couches api / services / repositories / models, sens de
dependance unique, une session SQLAlchemy async injectee par dependance.
- Python 3.14, dependances gerees par uv et verrouillees dans uv.lock
- FastAPI expose par une factory : aucune configuration lue a l'import,
ce qui rend tests et migrations independants de l'environnement
- Settings Pydantic, APP_SECRET_KEY et DATABASE_URL sans valeur par defaut
- Sondes /health/live et /health/ready, metriques Prometheus sur /metrics
- Lint et format ruff, mypy strict, pytest avec couverture
- Alembic branche sur DATABASE_URL et non sur alembic.ini
- Image Docker multi-stage, utilisateur non root, sonde de sante integree