Files
hermes-agent/tests/tools/test_honcho_tools.py

112 lines
4.0 KiB
Python
Raw Normal View History

"""Regression tests for per-call Honcho tool session routing."""
import json
from unittest.mock import MagicMock, patch
from dataclasses import dataclass
from tools import honcho_tools
class TestCheckHonchoAvailable:
"""Tests for _check_honcho_available (banner + runtime gating)."""
def setup_method(self):
self.orig_manager = honcho_tools._session_manager
self.orig_key = honcho_tools._session_key
def teardown_method(self):
honcho_tools._session_manager = self.orig_manager
honcho_tools._session_key = self.orig_key
def test_returns_true_when_session_active(self):
"""Fast path: session context already injected (mid-conversation)."""
honcho_tools._session_manager = MagicMock()
honcho_tools._session_key = "test-key"
assert honcho_tools._check_honcho_available() is True
def test_returns_true_when_configured_but_no_session(self):
"""Slow path: honcho configured but agent not started yet (banner time)."""
honcho_tools._session_manager = None
honcho_tools._session_key = None
@dataclass
class FakeConfig:
enabled: bool = True
api_key: str = "test-key"
base_url: str = None
with patch("tools.honcho_tools.HonchoClientConfig", create=True):
with patch(
"honcho_integration.client.HonchoClientConfig"
) as mock_cls:
mock_cls.from_global_config.return_value = FakeConfig()
assert honcho_tools._check_honcho_available() is True
def test_returns_false_when_not_configured(self):
"""No session, no config: tool genuinely unavailable."""
honcho_tools._session_manager = None
honcho_tools._session_key = None
@dataclass
class FakeConfig:
enabled: bool = False
api_key: str = None
base_url: str = None
with patch(
"honcho_integration.client.HonchoClientConfig"
) as mock_cls:
mock_cls.from_global_config.return_value = FakeConfig()
assert honcho_tools._check_honcho_available() is False
def test_returns_false_when_import_fails(self):
"""Graceful fallback when honcho_integration not installed."""
import sys
honcho_tools._session_manager = None
honcho_tools._session_key = None
# Hide honcho_integration from the import system to simulate
# an environment where the package is not installed.
hidden = {
k: sys.modules.pop(k)
for k in list(sys.modules)
if k.startswith("honcho_integration")
}
try:
with patch.dict(sys.modules, {"honcho_integration": None,
"honcho_integration.client": None}):
assert honcho_tools._check_honcho_available() is False
finally:
sys.modules.update(hidden)
class TestHonchoToolSessionContext:
def setup_method(self):
self.orig_manager = honcho_tools._session_manager
self.orig_key = honcho_tools._session_key
def teardown_method(self):
honcho_tools._session_manager = self.orig_manager
honcho_tools._session_key = self.orig_key
def test_explicit_call_context_wins_over_module_global_state(self):
global_manager = MagicMock()
global_manager.get_peer_card.return_value = ["global"]
explicit_manager = MagicMock()
explicit_manager.get_peer_card.return_value = ["explicit"]
honcho_tools.set_session_context(global_manager, "global-session")
result = json.loads(
honcho_tools._handle_honcho_profile(
{},
honcho_manager=explicit_manager,
honcho_session_key="explicit-session",
)
)
assert result == {"result": ["explicit"]}
explicit_manager.get_peer_card.assert_called_once_with("explicit-session")
global_manager.get_peer_card.assert_not_called()