feat(backend): verifie l extension TimescaleDB sur la sonde de disponibilite

/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.
This commit is contained in:
Johan LEROY
2026-09-14 14:19:25 +02:00
parent 351e928309
commit 20e7374d90
8 changed files with 130 additions and 8 deletions
@@ -0,0 +1,37 @@
"""socle garde extension timescaledb
Revision ID: 5353c0e4f094
Revises:
Create Date: 2026-09-14 14:17:17.556764
Premiere revision du schema applicatif. Elle ne cree aucune table : elle etablit
alembic_version et refuse de s'appliquer sur une base ou l'extension TimescaleDB
manque, cas qui se produit quand db/init n'a pas ete joue.
"""
from collections.abc import Sequence
from alembic import op
revision: str = "5353c0e4f094"
down_revision: str | Sequence[str] | None = None
branch_labels: str | Sequence[str] | None = None
depends_on: str | Sequence[str] | None = None
GARDE_EXTENSION = """
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_extension WHERE extname = 'timescaledb') THEN
RAISE EXCEPTION 'extension timescaledb absente, voir db/init et db/README.md';
END IF;
END
$$;
"""
def upgrade() -> None:
op.execute(GARDE_EXTENSION)
def downgrade() -> None:
pass