feat(infra): auto-commit con 56 cambios

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-06-21 14:22:55 +02:00
parent c1071a82b3
commit 32c7336bf6
56 changed files with 5307 additions and 100 deletions
@@ -0,0 +1,56 @@
"""Tests para resolve_pg_dsn.
No tocan pass ni el disco salvo via monkeypatch sobre os.environ y un .env
temporal. El fallback a pass se valida indirectamente (proyecto desconocido,
prioridad del env var) sin invocar el subproceso real.
"""
import os
import sys
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", ".."))
sys.path.insert(0, os.path.join(os.path.dirname(__file__), "..", "..", "functions"))
from infra.resolve_pg_dsn import resolve_pg_dsn
def test_env_var_seteada_gana_y_source_es_env(monkeypatch):
"""La env var del proyecto gana sobre .env y pass; source == 'env'."""
expected = "postgresql://captacion:secret@localhost:5433/trends"
monkeypatch.setenv("CAPTACION_DSN", expected)
res = resolve_pg_dsn("captacion")
assert res["status"] == "ok"
assert res["dsn"] == expected
assert res["source"] == "env"
assert res["project"] == "captacion"
def test_proyecto_desconocido_devuelve_error_sin_lanzar():
"""Un proyecto no registrado devuelve {status:'error'} sin excepcion."""
res = resolve_pg_dsn("no_existe_este_proyecto")
assert res["status"] == "error"
assert "unknown project" in res["error"]
def test_alias_largo_resuelve_a_la_clave_canonica(monkeypatch):
"""El alias largo 'seo_analytics' resuelve a la clave canonica 'seo'."""
monkeypatch.setenv("SEO_DSN", "postgresql://captacion:x@localhost:5433/seo")
res = resolve_pg_dsn("seo_analytics")
assert res["status"] == "ok"
assert res["project"] == "seo"
assert res["source"] == "env"
def test_fallback_a_dotenv_cuando_no_hay_env_var(monkeypatch, tmp_path):
"""Sin env var, lee la linea <ENV_VAR>= del .env del proyecto; source == 'dotenv'."""
monkeypatch.delenv("CAPTACION_DSN", raising=False)
# Monta una raiz falsa con el .env del proyecto en la ruta esperada.
proj_dir = tmp_path / "projects" / "captacion_clientes"
proj_dir.mkdir(parents=True)
dsn = "postgresql://captacion:fromdotenv@localhost:5433/trends"
(proj_dir / ".env").write_text(f'CAPTACION_DSN="{dsn}"\n', encoding="utf-8")
monkeypatch.setenv("FN_REGISTRY_ROOT", str(tmp_path))
res = resolve_pg_dsn("captacion_clientes")
assert res["status"] == "ok"
assert res["dsn"] == dsn # comillas envolventes quitadas
assert res["source"] == "dotenv"