| """Tests for .env sanitization during load to prevent token duplication (#8908).""" |
|
|
| import tempfile |
| from pathlib import Path |
| from unittest.mock import patch |
|
|
|
|
| def test_load_env_sanitizes_concatenated_lines(): |
| """Verify load_env() splits concatenated KEY=VALUE pairs. |
| |
| Reproduces the scenario from #8908 where a corrupted .env file |
| contained multiple tokens on a single line, causing the bot token |
| to be duplicated 8 times. |
| """ |
| from hermes_cli.config import load_env |
|
|
| token = "8356550917:AAGGEkzg06Hrc3Hjb3Sa1jkGVDOdU_lYy2Q" |
| |
| corrupted = f"TELEGRAM_BOT_TOKEN={token}ANTHROPIC_API_KEY=sk-ant-test123\n" |
|
|
| with tempfile.NamedTemporaryFile( |
| mode="w", suffix=".env", delete=False, encoding="utf-8" |
| ) as f: |
| f.write(corrupted) |
| env_path = Path(f.name) |
|
|
| try: |
| with patch("hermes_cli.config.get_env_path", return_value=env_path): |
| result = load_env() |
| assert result.get("TELEGRAM_BOT_TOKEN") == token, ( |
| f"Token should be exactly '{token}', got '{result.get('TELEGRAM_BOT_TOKEN')}'" |
| ) |
| assert result.get("ANTHROPIC_API_KEY") == "sk-ant-test123" |
| finally: |
| env_path.unlink(missing_ok=True) |
|
|
|
|
| def test_load_env_normal_file_unchanged(): |
| """A well-formed .env file should be parsed identically.""" |
| from hermes_cli.config import load_env |
|
|
| content = ( |
| "TELEGRAM_BOT_TOKEN=mytoken123\n" |
| "ANTHROPIC_API_KEY=sk-ant-key\n" |
| "# comment\n" |
| "\n" |
| "OPENAI_API_KEY=sk-openai\n" |
| ) |
|
|
| with tempfile.NamedTemporaryFile( |
| mode="w", suffix=".env", delete=False, encoding="utf-8" |
| ) as f: |
| f.write(content) |
| env_path = Path(f.name) |
|
|
| try: |
| with patch("hermes_cli.config.get_env_path", return_value=env_path): |
| result = load_env() |
| assert result["TELEGRAM_BOT_TOKEN"] == "mytoken123" |
| assert result["ANTHROPIC_API_KEY"] == "sk-ant-key" |
| assert result["OPENAI_API_KEY"] == "sk-openai" |
| finally: |
| env_path.unlink(missing_ok=True) |
|
|
|
|
| def test_env_loader_sanitizes_before_dotenv(): |
| """Verify env_loader._sanitize_env_file_if_needed fixes corrupted files.""" |
| from hermes_cli.env_loader import _sanitize_env_file_if_needed |
|
|
| token = "8356550917:AAGGEkzg06Hrc3Hjb3Sa1jkGVDOdU_lYy2Q" |
| corrupted = f"TELEGRAM_BOT_TOKEN={token}ANTHROPIC_API_KEY=sk-ant-test\n" |
|
|
| with tempfile.NamedTemporaryFile( |
| mode="w", suffix=".env", delete=False, encoding="utf-8" |
| ) as f: |
| f.write(corrupted) |
| env_path = Path(f.name) |
|
|
| try: |
| _sanitize_env_file_if_needed(env_path) |
| with open(env_path, encoding="utf-8") as f: |
| lines = f.readlines() |
| |
| assert len(lines) == 2, f"Expected 2 lines, got {len(lines)}: {lines}" |
| assert lines[0].startswith("TELEGRAM_BOT_TOKEN=") |
| assert lines[1].startswith("ANTHROPIC_API_KEY=") |
| |
| parsed_token = lines[0].strip().split("=", 1)[1] |
| assert parsed_token == token |
| finally: |
| env_path.unlink(missing_ok=True) |
|
|