test_env_loader.py
1 import importlib 2 import os 3 import sys 4 from pathlib import Path 5 6 from hermes_cli.env_loader import load_hermes_dotenv 7 8 9 def test_user_env_overrides_stale_shell_values(tmp_path, monkeypatch): 10 home = tmp_path / "hermes" 11 home.mkdir() 12 env_file = home / ".env" 13 env_file.write_text("OPENAI_BASE_URL=https://new.example/v1\n", encoding="utf-8") 14 15 monkeypatch.setenv("OPENAI_BASE_URL", "https://old.example/v1") 16 17 loaded = load_hermes_dotenv(hermes_home=home) 18 19 assert loaded == [env_file] 20 assert os.getenv("OPENAI_BASE_URL") == "https://new.example/v1" 21 22 23 def test_project_env_overrides_stale_shell_values_when_user_env_missing(tmp_path, monkeypatch): 24 home = tmp_path / "hermes" 25 project_env = tmp_path / ".env" 26 project_env.write_text("OPENAI_BASE_URL=https://project.example/v1\n", encoding="utf-8") 27 28 monkeypatch.setenv("OPENAI_BASE_URL", "https://old.example/v1") 29 30 loaded = load_hermes_dotenv(hermes_home=home, project_env=project_env) 31 32 assert loaded == [project_env] 33 assert os.getenv("OPENAI_BASE_URL") == "https://project.example/v1" 34 35 36 def test_project_env_is_sanitized_before_loading(tmp_path, monkeypatch): 37 home = tmp_path / "hermes" 38 project_env = tmp_path / ".env" 39 project_env.write_text( 40 "TELEGRAM_BOT_TOKEN=8356550917:AAGGEkzg06Hrc3Hjb3Sa1jkGVDOdU_lYy2Q" 41 "ANTHROPIC_API_KEY=sk-ant-test123\n", 42 encoding="utf-8", 43 ) 44 45 monkeypatch.delenv("TELEGRAM_BOT_TOKEN", raising=False) 46 monkeypatch.delenv("ANTHROPIC_API_KEY", raising=False) 47 48 loaded = load_hermes_dotenv(hermes_home=home, project_env=project_env) 49 50 assert loaded == [project_env] 51 assert os.getenv("TELEGRAM_BOT_TOKEN") == "8356550917:AAGGEkzg06Hrc3Hjb3Sa1jkGVDOdU_lYy2Q" 52 assert os.getenv("ANTHROPIC_API_KEY") == "sk-ant-test123" 53 54 55 def test_user_env_takes_precedence_over_project_env(tmp_path, monkeypatch): 56 home = tmp_path / "hermes" 57 home.mkdir() 58 user_env = home / ".env" 59 project_env = tmp_path / ".env" 60 user_env.write_text("OPENAI_BASE_URL=https://user.example/v1\n", encoding="utf-8") 61 project_env.write_text("OPENAI_BASE_URL=https://project.example/v1\nOPENAI_API_KEY=project-key\n", encoding="utf-8") 62 63 monkeypatch.setenv("OPENAI_BASE_URL", "https://old.example/v1") 64 monkeypatch.delenv("OPENAI_API_KEY", raising=False) 65 66 loaded = load_hermes_dotenv(hermes_home=home, project_env=project_env) 67 68 assert loaded == [user_env, project_env] 69 assert os.getenv("OPENAI_BASE_URL") == "https://user.example/v1" 70 assert os.getenv("OPENAI_API_KEY") == "project-key" 71 72 73 def test_main_import_applies_user_env_over_shell_values(tmp_path, monkeypatch): 74 home = tmp_path / "hermes" 75 home.mkdir() 76 (home / ".env").write_text( 77 "OPENAI_BASE_URL=https://new.example/v1\nHERMES_INFERENCE_PROVIDER=custom\n", 78 encoding="utf-8", 79 ) 80 81 monkeypatch.setenv("HERMES_HOME", str(home)) 82 monkeypatch.setenv("OPENAI_BASE_URL", "https://old.example/v1") 83 monkeypatch.setenv("HERMES_INFERENCE_PROVIDER", "openrouter") 84 85 sys.modules.pop("hermes_cli.main", None) 86 importlib.import_module("hermes_cli.main") 87 88 assert os.getenv("OPENAI_BASE_URL") == "https://new.example/v1" 89 assert os.getenv("HERMES_INFERENCE_PROVIDER") == "custom"