The rename sweep in the base commit missed the sibling-test blast radius (18 red files on CI). Three classes, all fixed: 1. Stale old names in tests (todo/cronjob/process/tour/tip) — updated to todo_list/cronjob_manage/process_manage/gui_tour/show_tip at every registry.get_entry/dispatch/coerce/preview/allowlist call site, plus the coding-brief sentence in agent/coding_context.py now names todo_list (and its gating test). 2. Missed rename in production: AGENT_RUNTIME_POST_HOOK_TOOL_NAMES still held 'tour' — post-hook ownership would have double-emitted for gui_tour via the bridge path. 3. Tests pinning pre-deferral assembly (blank-slate surface, modal sandbox resolution, desktop diet, HUD note) now pin their ACTUAL contract under the legacy defer:[] override, or assert on granted tool names instead of visible schemas. Also fixes a pre-existing ordering flake surfaced by the sweep: test_holds_exactly_the_gui_affordances depended on whether an earlier test had imported apply_layout_tool (registry-registered, not in the static desktop_ui list) — now forces discovery and pins the full set. 649 tests green locally across all touched files, both orderings.
83 lines
3.5 KiB
Python
83 lines
3.5 KiB
Python
"""Tests for hermes-api-server toolset and API server tool availability."""
|
|
from unittest.mock import patch, MagicMock
|
|
|
|
|
|
from toolsets import resolve_toolset, get_toolset, validate_toolset
|
|
|
|
|
|
class TestHermesApiServerToolset:
|
|
"""Tests for the hermes-api-server toolset definition."""
|
|
|
|
|
|
def test_toolset_includes_web_tools(self):
|
|
tools = resolve_toolset("hermes-api-server")
|
|
assert "web_search" in tools
|
|
assert "web_extract" in tools
|
|
|
|
def test_toolset_includes_core_tools(self):
|
|
tools = resolve_toolset("hermes-api-server")
|
|
expected = [
|
|
"terminal", "process_manage",
|
|
"read_file", "write_file", "patch", "search_files",
|
|
"vision_analyze", "image_generate",
|
|
"execute_code", "delegate_task",
|
|
"todo_list", "memory", "session_search", "cronjob_manage",
|
|
]
|
|
for tool in expected:
|
|
assert tool in tools, f"Missing expected tool: {tool}"
|
|
|
|
def test_toolset_includes_browser_tools(self):
|
|
tools = resolve_toolset("hermes-api-server")
|
|
for tool in ["browser_navigate", "browser_snapshot", "browser_click",
|
|
"browser_type", "browser_scroll", "browser_back",
|
|
"browser_press"]:
|
|
assert tool in tools, f"Missing browser tool: {tool}"
|
|
|
|
|
|
class TestApiServerPlatformConfig:
|
|
|
|
def test_default_api_server_includes_terminal_toolset(self):
|
|
"""Regression #49622: desktop-only read_terminal is registered into the
|
|
'terminal' toolset (ships in-repo), so resolve_toolset('terminal') grows
|
|
to include it after discovery. read_terminal is NOT in the
|
|
hermes-api-server composite, so the old all-tools subset test dropped
|
|
'terminal' entirely. Its static membership (terminal, process) IS in the
|
|
composite, so it must stay enabled."""
|
|
from tools.registry import discover_builtin_tools
|
|
from hermes_cli.tools_config import _get_platform_tools
|
|
discover_builtin_tools()
|
|
assert "terminal" in _get_platform_tools({}, "api_server")
|
|
|
|
|
|
class TestApiServerAdapterToolset:
|
|
@patch("gateway.platforms.api_server.AIOHTTP_AVAILABLE", True)
|
|
def test_create_agent_reads_config_toolsets(self):
|
|
"""API server resolves toolsets from config like all other platforms."""
|
|
from gateway.platforms.api_server import APIServerAdapter
|
|
from gateway.config import PlatformConfig
|
|
|
|
adapter = APIServerAdapter(PlatformConfig())
|
|
|
|
with patch("gateway.run._resolve_runtime_agent_kwargs") as mock_kwargs, \
|
|
patch("gateway.run._resolve_gateway_model") as mock_model, \
|
|
patch("gateway.run._load_gateway_config") as mock_config, \
|
|
patch("run_agent.AIAgent") as mock_agent_cls:
|
|
|
|
mock_kwargs.return_value = {"api_key": "test-key", "base_url": None,
|
|
"provider": None, "api_mode": None,
|
|
"command": None, "args": []}
|
|
mock_model.return_value = "test/model"
|
|
# No platform_toolsets override — should fall back to hermes-api-server default
|
|
mock_config.return_value = {}
|
|
mock_agent_cls.return_value = MagicMock()
|
|
|
|
adapter._create_agent()
|
|
|
|
mock_agent_cls.assert_called_once()
|
|
call_kwargs = mock_agent_cls.call_args
|
|
toolsets = call_kwargs.kwargs.get("enabled_toolsets")
|
|
assert isinstance(toolsets, list)
|
|
assert len(toolsets) > 0
|
|
assert call_kwargs.kwargs.get("platform") == "api_server"
|
|
|