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).
134 lines
5.4 KiB
Python
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
|