"""Carga de `.env`. Sin esto, una clave correctamente escrita en el archivo simplemente no existe para el proceso de Python — los SDKs leen variables de entorno, no archivos. El síntoma es un error de autenticación con el `.env` bien configurado. """ from __future__ import annotations import os import pytest from enlace.config.env import load_dotenv @pytest.fixture(autouse=True) def entorno_limpio(monkeypatch): for clave in ("PRUEBA_A", "PRUEBA_B", "PRUEBA_EXPORT", "PRUEBA_COMILLAS"): monkeypatch.delenv(clave, raising=False) def _env(tmp_path, contenido: str): path = tmp_path / ".env" path.write_text(contenido, encoding="utf-8") return path def test_define_las_variables(tmp_path): definidas = load_dotenv(_env(tmp_path, "PRUEBA_A=uno\nPRUEBA_B=dos\n")) assert set(definidas) == {"PRUEBA_A", "PRUEBA_B"} assert os.environ["PRUEBA_A"] == "uno" def test_ignora_comentarios_y_lineas_vacias(tmp_path): contenido = "# PRUEBA_A=comentada\n\n \nPRUEBA_B=real\n" assert load_dotenv(_env(tmp_path, contenido)) == ["PRUEBA_B"] assert "PRUEBA_A" not in os.environ def test_ignora_claves_sin_valor(tmp_path): """`# ANTHROPIC_API_KEY=` descomentada pero vacía no debe definir nada: una variable vacía autentica peor que una ausente, porque parece presente.""" assert load_dotenv(_env(tmp_path, "PRUEBA_A=\n")) == [] assert "PRUEBA_A" not in os.environ def test_el_entorno_existente_gana_por_defecto(tmp_path, monkeypatch): """Una variable exportada en la shell o inyectada por el orquestador debe ganar sobre el archivo: es lo que se espera en producción.""" monkeypatch.setenv("PRUEBA_A", "del-entorno") load_dotenv(_env(tmp_path, "PRUEBA_A=del-archivo\n")) assert os.environ["PRUEBA_A"] == "del-entorno" def test_override_fuerza_el_archivo(tmp_path, monkeypatch): monkeypatch.setenv("PRUEBA_A", "del-entorno") load_dotenv(_env(tmp_path, "PRUEBA_A=del-archivo\n"), override=True) assert os.environ["PRUEBA_A"] == "del-archivo" def test_acepta_la_forma_export(tmp_path): """El mismo archivo lo consume `source .env` desde scripts/remote.sh.""" load_dotenv(_env(tmp_path, "export PRUEBA_EXPORT=valor\n")) assert os.environ["PRUEBA_EXPORT"] == "valor" def test_saca_las_comillas(tmp_path): load_dotenv(_env(tmp_path, 'PRUEBA_COMILLAS="con espacios"\n')) assert os.environ["PRUEBA_COMILLAS"] == "con espacios" def test_archivo_ausente_no_rompe(tmp_path): assert load_dotenv(tmp_path / "no-existe") == [] def test_no_devuelve_valores(tmp_path): """Devuelve solo nombres: estos archivos tienen secretos y no deben terminar en un log.""" definidas = load_dotenv(_env(tmp_path, "PRUEBA_A=secreto-que-no-debe-salir\n")) assert definidas == ["PRUEBA_A"] assert "secreto-que-no-debe-salir" not in str(definidas)