mirror of
https://github.com/NousResearch/hermes-agent.git
synced 2026-04-25 00:51:20 +00:00
- Move test file to tests/hermes_cli/ (consistent with test layout) - Remove unused imports (os, pytest) from test file - Update _sanitize_env_lines docstring: now used on read + write paths
91 lines
3.2 KiB
Python
91 lines
3.2 KiB
Python
"""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"
|
|
# Simulate concatenated line: TOKEN=xxx followed immediately by another key
|
|
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()
|
|
# Should be split into two separate lines
|
|
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=")
|
|
# Token should not contain the second key
|
|
parsed_token = lines[0].strip().split("=", 1)[1]
|
|
assert parsed_token == token
|
|
finally:
|
|
env_path.unlink(missing_ok=True)
|