From 5766e2421383fbb590dd1e8d6954245cef728958 Mon Sep 17 00:00:00 2001 From: hcornet Date: Thu, 10 Sep 2026 20:58:40 +0200 Subject: [PATCH] Alembic et le point d'entree lisent la configuration de l'application --- docker/entrypoint-web.sh | 4 +++- migrations/env.py | 10 +++++++--- tests/test_services.py | 16 ++++++++++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/docker/entrypoint-web.sh b/docker/entrypoint-web.sh index 85055ce..afc3c93 100644 --- a/docker/entrypoint-web.sh +++ b/docker/entrypoint-web.sh @@ -6,7 +6,9 @@ # qu'une indisponibilite visible. set -eu -if [ -n "${ENCLUME_DATABASE_URL:-}" ]; then +# Deux facons de declarer la base : une URL complete, ou les elements separes. +# Tester une seule des deux sauterait silencieusement les migrations. +if [ -n "${ENCLUME_DATABASE_URL:-}" ] || [ -n "${ENCLUME_DB_HOTE:-}" ]; then echo "enclume : migration de la base" alembic upgrade head else diff --git a/migrations/env.py b/migrations/env.py index a02a928..f805c5f 100644 --- a/migrations/env.py +++ b/migrations/env.py @@ -1,7 +1,8 @@ """Contexte Alembic. -L'URL vient de l'environnement, jamais du fichier ini : la meme image sert en -developpement et en production. +L'URL vient de la configuration de l'application, jamais du fichier ini : la +meme image sert en developpement et en production, et le mot de passe est +encode au meme endroit pour tout le monde. """ from __future__ import annotations @@ -14,10 +15,13 @@ from sqlalchemy import engine_from_config, pool sys.path.insert(0, os.getcwd()) +from enclume.config import Config from enclume.db import Base config = context.config -config.set_main_option("sqlalchemy.url", os.environ.get("ENCLUME_DATABASE_URL", "")) +# Une seule source de verite pour l'URL : celle de l'application, qui sait +# assembler les elements separes et encoder le mot de passe. +config.set_main_option("sqlalchemy.url", Config.SQLALCHEMY_DATABASE_URI) target_metadata = Base.metadata diff --git a/tests/test_services.py b/tests/test_services.py index fc579ac..658bcfa 100644 --- a/tests/test_services.py +++ b/tests/test_services.py @@ -7,6 +7,7 @@ ici, et la CI reste sans service externe. from __future__ import annotations import importlib +from pathlib import Path import pytest @@ -303,3 +304,18 @@ def test_url_de_base_encode_les_caracteres_speciaux(monkeypatch): # L'URL porte la valeur encodee ; c'est le pilote qui la decode. assert morceaux.password == "p%40ss%3Aw0rd%2F%231" assert unquote(morceaux.password) == "p@ss:w0rd/#1" + + +def test_le_point_d_entree_reconnait_les_deux_declarations_de_base(): + """Les migrations doivent partir quelle que soit la facon de declarer la base.""" + script = Path("docker/entrypoint-web.sh").read_text(encoding="utf-8") + condition = next(ligne for ligne in script.splitlines() if ligne.startswith("if [")) + assert "ENCLUME_DATABASE_URL" in condition + assert "ENCLUME_DB_HOTE" in condition + + +def test_alembic_lit_la_configuration_de_l_application(): + """Alembic et l'application doivent viser la meme base, sans divergence possible.""" + env = Path("migrations/env.py").read_text(encoding="utf-8") + assert "Config.SQLALCHEMY_DATABASE_URI" in env + assert 'os.environ.get("ENCLUME_DATABASE_URL"' not in env