test: reorganize test structure and add missing unit tests
Reorganize flat tests/ directory to mirror source code structure (tools/, gateway/, hermes_cli/, integration/). Add 11 new test files covering previously untested modules: registry, patch_parser, fuzzy_match, todo_tool, approval, file_tools, gateway session/config/ delivery, and hermes_cli config/models. Total: 147 unit tests passing, 9 integration tests gated behind pytest marker.
This commit is contained in:
parent
3c5bf5b9d8
commit
8fc28c34ce
24 changed files with 1066 additions and 16 deletions
0
tests/hermes_cli/__init__.py
Normal file
0
tests/hermes_cli/__init__.py
Normal file
68
tests/hermes_cli/test_config.py
Normal file
68
tests/hermes_cli/test_config.py
Normal file
|
|
@ -0,0 +1,68 @@
|
|||
"""Tests for hermes_cli configuration management."""
|
||||
|
||||
import os
|
||||
from pathlib import Path
|
||||
from unittest.mock import patch
|
||||
|
||||
from hermes_cli.config import (
|
||||
DEFAULT_CONFIG,
|
||||
get_hermes_home,
|
||||
ensure_hermes_home,
|
||||
load_config,
|
||||
save_config,
|
||||
)
|
||||
|
||||
|
||||
class TestGetHermesHome:
|
||||
def test_default_path(self):
|
||||
with patch.dict(os.environ, {}, clear=False):
|
||||
os.environ.pop("HERMES_HOME", None)
|
||||
home = get_hermes_home()
|
||||
assert home == Path.home() / ".hermes"
|
||||
|
||||
def test_env_override(self):
|
||||
with patch.dict(os.environ, {"HERMES_HOME": "/custom/path"}):
|
||||
home = get_hermes_home()
|
||||
assert home == Path("/custom/path")
|
||||
|
||||
|
||||
class TestEnsureHermesHome:
|
||||
def test_creates_subdirs(self, tmp_path):
|
||||
with patch.dict(os.environ, {"HERMES_HOME": str(tmp_path)}):
|
||||
ensure_hermes_home()
|
||||
assert (tmp_path / "cron").is_dir()
|
||||
assert (tmp_path / "sessions").is_dir()
|
||||
assert (tmp_path / "logs").is_dir()
|
||||
assert (tmp_path / "memories").is_dir()
|
||||
|
||||
|
||||
class TestLoadConfigDefaults:
|
||||
def test_returns_defaults_when_no_file(self, tmp_path):
|
||||
with patch.dict(os.environ, {"HERMES_HOME": str(tmp_path)}):
|
||||
config = load_config()
|
||||
assert config["model"] == DEFAULT_CONFIG["model"]
|
||||
assert config["max_turns"] == DEFAULT_CONFIG["max_turns"]
|
||||
assert "terminal" in config
|
||||
assert config["terminal"]["backend"] == "local"
|
||||
|
||||
|
||||
class TestSaveAndLoadRoundtrip:
|
||||
def test_roundtrip(self, tmp_path):
|
||||
with patch.dict(os.environ, {"HERMES_HOME": str(tmp_path)}):
|
||||
config = load_config()
|
||||
config["model"] = "test/custom-model"
|
||||
config["max_turns"] = 42
|
||||
save_config(config)
|
||||
|
||||
reloaded = load_config()
|
||||
assert reloaded["model"] == "test/custom-model"
|
||||
assert reloaded["max_turns"] == 42
|
||||
|
||||
def test_nested_values_preserved(self, tmp_path):
|
||||
with patch.dict(os.environ, {"HERMES_HOME": str(tmp_path)}):
|
||||
config = load_config()
|
||||
config["terminal"]["timeout"] = 999
|
||||
save_config(config)
|
||||
|
||||
reloaded = load_config()
|
||||
assert reloaded["terminal"]["timeout"] == 999
|
||||
33
tests/hermes_cli/test_models.py
Normal file
33
tests/hermes_cli/test_models.py
Normal file
|
|
@ -0,0 +1,33 @@
|
|||
"""Tests for the hermes_cli models module."""
|
||||
|
||||
from hermes_cli.models import OPENROUTER_MODELS, menu_labels, model_ids
|
||||
|
||||
|
||||
class TestModelIds:
|
||||
def test_returns_strings(self):
|
||||
ids = model_ids()
|
||||
assert isinstance(ids, list)
|
||||
assert len(ids) > 0
|
||||
assert all(isinstance(mid, str) for mid in ids)
|
||||
|
||||
def test_ids_match_models_list(self):
|
||||
ids = model_ids()
|
||||
expected = [mid for mid, _ in OPENROUTER_MODELS]
|
||||
assert ids == expected
|
||||
|
||||
|
||||
class TestMenuLabels:
|
||||
def test_same_length_as_model_ids(self):
|
||||
labels = menu_labels()
|
||||
ids = model_ids()
|
||||
assert len(labels) == len(ids)
|
||||
|
||||
def test_recommended_in_first(self):
|
||||
labels = menu_labels()
|
||||
assert "recommended" in labels[0].lower()
|
||||
|
||||
def test_labels_contain_model_ids(self):
|
||||
labels = menu_labels()
|
||||
ids = model_ids()
|
||||
for label, mid in zip(labels, ids):
|
||||
assert mid in label
|
||||
Loading…
Add table
Add a link
Reference in a new issue