fix(tests): resolve 10 CI failures across hooks, tiktoken, plugins (#3848)

test_hooks.py (7 failures): Built-in boot-md hook was always loaded
by _register_builtin_hooks(), adding +1 to every expected hook count.
Mock out built-in registration in TestDiscoverAndLoad so tests isolate
user-hook discovery logic.

test_tool_token_estimation.py (2 failures): tiktoken is not in
core/[all] dependencies. The estimation function gracefully returns {}
when tiktoken is missing, but tests expected non-empty results. Added
skipif markers for tests that need tiktoken.

test_plugins_cmd.py (1 failure): bare 'hermes plugins' now dispatches
to cmd_toggle() (interactive curses UI) instead of cmd_list(). Updated
test to match the new behavior.
This commit is contained in:
Teknium
2026-03-29 20:05:59 -07:00
committed by GitHub
parent 3e2c8c529b
commit 2d264a4562
3 changed files with 27 additions and 10 deletions

View File

@@ -29,13 +29,18 @@ class TestHookRegistryInit:
assert reg._handlers == {}
def _patch_no_builtins(reg):
"""Suppress built-in hook registration so tests only exercise user-hook discovery."""
return patch.object(reg, "_register_builtin_hooks")
class TestDiscoverAndLoad:
def test_loads_valid_hook(self, tmp_path):
_create_hook(tmp_path, "my-hook", '["agent:start"]',
"def handle(event_type, context):\n pass\n")
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path):
with patch("gateway.hooks.HOOKS_DIR", tmp_path), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 1
@@ -48,7 +53,7 @@ class TestDiscoverAndLoad:
(hook_dir / "handler.py").write_text("def handle(e, c): pass\n")
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path):
with patch("gateway.hooks.HOOKS_DIR", tmp_path), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 0
@@ -59,7 +64,7 @@ class TestDiscoverAndLoad:
(hook_dir / "HOOK.yaml").write_text("name: bad\nevents: ['agent:start']\n")
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path):
with patch("gateway.hooks.HOOKS_DIR", tmp_path), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 0
@@ -71,7 +76,7 @@ class TestDiscoverAndLoad:
(hook_dir / "handler.py").write_text("def handle(e, c): pass\n")
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path):
with patch("gateway.hooks.HOOKS_DIR", tmp_path), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 0
@@ -83,14 +88,14 @@ class TestDiscoverAndLoad:
(hook_dir / "handler.py").write_text("def something_else(): pass\n")
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path):
with patch("gateway.hooks.HOOKS_DIR", tmp_path), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 0
def test_nonexistent_hooks_dir(self, tmp_path):
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path / "nonexistent"):
with patch("gateway.hooks.HOOKS_DIR", tmp_path / "nonexistent"), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 0
@@ -102,7 +107,7 @@ class TestDiscoverAndLoad:
"def handle(e, c): pass\n")
reg = HookRegistry()
with patch("gateway.hooks.HOOKS_DIR", tmp_path):
with patch("gateway.hooks.HOOKS_DIR", tmp_path), _patch_no_builtins(reg):
reg.discover_and_load()
assert len(reg.loaded_hooks) == 2