/ tests / hermes_cli / test_env_loader.py
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"