Files
hermes-agent/tests/honcho_plugin/test_session_ai_peer_prefix.py
teknium1 85cd82f1dd test: purge low-value tests, lane py15 (375 removed)
Change-detectors, tautologies, source-reading tests, redundant duplicates,
mock-echo tests and dead/unrunnable tests. Per-test rationale in the lane
ledger (category + reason for every removal).
2026-09-23 03:15:26 -07:00

134 lines
5.4 KiB
Python

"""Tests for the ``sessionAiPeerPrefix`` config flag.
``sessionPeerPrefix`` prefixes a resolved session name with the *user* peer
(``peerName``). ``sessionAiPeerPrefix`` is the symmetric counterpart for the
*AI* peer (``aiPeer``): when several AI peers share one workspace + peerName +
gateway chat key, the ``gateway_session_key`` branch of
``resolve_session_name`` returns an AI-peer-agnostic name and every peer
collides on the same Honcho session. Setting ``sessionAiPeerPrefix: true``
prefixes the final name with ``{ai_peer}-`` so the sessions stay disjoint.
Tests cover config parsing (``client.py::from_global_config``) and the public
resolver wrapper across every resolution path, including the length cap.
"""
import json
from plugins.memory.honcho.client import HonchoClientConfig
# ---------------------------------------------------------------------------
# Config parsing
# ---------------------------------------------------------------------------
class TestSessionAiPeerPrefixConfigParsing:
def test_root_level_true(self, tmp_path, monkeypatch):
config_file = tmp_path / "honcho.json"
config_file.write_text(json.dumps({
"apiKey": "k",
"peerName": "eli",
"aiPeer": "ivy",
"sessionAiPeerPrefix": True,
}))
monkeypatch.setenv("HERMES_HOME", str(tmp_path / "isolated"))
config = HonchoClientConfig.from_global_config(config_path=config_file)
assert config.session_ai_peer_prefix is True
assert config.ai_peer == "ivy"
def test_host_block_true(self, tmp_path, monkeypatch):
config_file = tmp_path / "honcho.json"
config_file.write_text(json.dumps({
"apiKey": "k",
"peerName": "eli",
"hosts": {
"hermes": {"aiPeer": "ivy", "sessionAiPeerPrefix": True},
},
}))
monkeypatch.setenv("HERMES_HOME", str(tmp_path / "isolated"))
config = HonchoClientConfig.from_global_config(config_path=config_file)
assert config.session_ai_peer_prefix is True
def test_host_block_overrides_root(self, tmp_path, monkeypatch):
"""Host block wins over root — matches every other flag."""
config_file = tmp_path / "honcho.json"
config_file.write_text(json.dumps({
"apiKey": "k",
"peerName": "eli",
"sessionAiPeerPrefix": True,
"hosts": {
"hermes": {"sessionAiPeerPrefix": False},
},
}))
monkeypatch.setenv("HERMES_HOME", str(tmp_path / "isolated"))
config = HonchoClientConfig.from_global_config(config_path=config_file)
assert config.session_ai_peer_prefix is False
# ---------------------------------------------------------------------------
# Resolver behaviour
# ---------------------------------------------------------------------------
class TestSessionAiPeerPrefixResolver:
def _config(self, **overrides):
base = dict(
ai_peer="ivy",
peer_name="eli",
session_ai_peer_prefix=True,
)
base.update(overrides)
return HonchoClientConfig(**base)
def test_gateway_key_gets_ai_peer_prefix(self):
"""The motivating case: gateway_session_key is AI-peer-agnostic."""
cfg = self._config()
name = cfg.resolve_session_name(
gateway_session_key="agent:main:telegram:dm:8055661863",
)
assert name.startswith("ivy-")
assert "telegram-dm-8055661863" in name
def test_disabled_leaves_name_untouched(self):
"""Regression guard — default behaviour is unchanged."""
cfg = self._config(session_ai_peer_prefix=False)
name = cfg.resolve_session_name(
gateway_session_key="agent:main:telegram:dm:8055661863",
)
assert not name.startswith("ivy-")
def test_two_ai_peers_stay_disjoint(self):
"""Same workspace + chat key, different aiPeer -> different sessions."""
key = "agent:main:telegram:dm:8055661863"
ivy = self._config(ai_peer="ivy").resolve_session_name(gateway_session_key=key)
holly = self._config(ai_peer="holly").resolve_session_name(gateway_session_key=key)
assert ivy != holly
assert ivy.startswith("ivy-")
assert holly.startswith("holly-")
def test_applies_across_strategy_paths(self, tmp_path):
"""Prefix is not limited to the gateway-key branch."""
cfg = self._config(session_strategy="per-directory")
name = cfg.resolve_session_name(cwd=str(tmp_path / "myproject"))
assert name == "ivy-myproject"
def test_no_ai_peer_no_prefix(self):
"""An empty aiPeer must not produce a stray leading hyphen."""
cfg = self._config(ai_peer="")
name = cfg.resolve_session_name(gateway_session_key="agent:main:dm:1")
assert not name.startswith("-")
def test_prefix_respects_session_id_length_cap(self):
"""A long base + prefix stays within Honcho's 100-char session-id cap,
and remains disjoint per AI peer (hash incorporates the prefix)."""
long_key = "agent:main:telegram:dm:" + "9" * 200
ivy = self._config(ai_peer="ivy").resolve_session_name(gateway_session_key=long_key)
holly = self._config(ai_peer="holly").resolve_session_name(gateway_session_key=long_key)
assert len(ivy) <= HonchoClientConfig._HONCHO_SESSION_ID_MAX_LEN
assert len(holly) <= HonchoClientConfig._HONCHO_SESSION_ID_MAX_LEN
assert ivy != holly