from __future__ import annotations import importlib.util import sys import types from pathlib import Path class FakeHermesContext: def __init__(self) -> None: self.registered_tools = [] self.registered_hooks = [] def register_tool(self, name, toolset, schema, handler, **kwargs): self.registered_tools.append((name, toolset, schema, handler, kwargs)) def register_hook(self, hook_name, callback): self.registered_hooks.append((hook_name, callback)) def load_plugin_module(): plugin_dir = Path(__file__).resolve().parents[1] if "hermes_plugins" not in sys.modules: parent = types.ModuleType("hermes_plugins") parent.__path__ = [] sys.modules["hermes_plugins"] = parent spec = importlib.util.spec_from_file_location( "hermes_plugins.memory_gateway_agent_test", plugin_dir / "__init__.py", submodule_search_locations=[str(plugin_dir)], ) module = importlib.util.module_from_spec(spec) module.__package__ = "hermes_plugins.memory_gateway_agent_test" module.__path__ = [str(plugin_dir)] sys.modules["hermes_plugins.memory_gateway_agent_test"] = module assert spec.loader is not None spec.loader.exec_module(module) return module def test_register_registers_five_tools(): module = load_plugin_module() ctx = FakeHermesContext() module.register(ctx) assert [item[0] for item in ctx.registered_tools] == [ "memory_search", "memory_append_episode", "memory_commit_session", "memory_upsert", "memory_feedback", ] assert all(item[1] == "memory_gateway" for item in ctx.registered_tools) def test_registered_handlers_are_callable(): module = load_plugin_module() ctx = FakeHermesContext() module.register(ctx) assert all(callable(item[3]) for item in ctx.registered_tools)