Files
hermes-webui/tests/test_session_discoverability_invariants.py
T
8dc12713ca fix(sidebar): keep multiple messageful imported/CLI sessions discoverable (#4218) (#4232)
* Fix imported lineage sidebar discoverability

* chore(release): stamp v0.51.429 (Release OP) for #4218

---------

Co-authored-by: Dennis Soong <dso2ng@gmail.com>
Co-authored-by: nesquena-hermes <agent@nesquena-hermes>
2026-06-14 23:51:22 -07:00

114 lines
3.6 KiB
Python

"""Regression coverage for session sidebar discoverability invariants."""
def test_messageful_hidden_snapshot_is_preserved_when_no_visible_representative():
from api.models import _preserve_messageful_sidebar_discoverability
hidden_snapshot = {
"session_id": "root_snapshot",
"title": "Long conversation snapshot",
"message_count": 42,
"pre_compression_snapshot": True,
}
result = _preserve_messageful_sidebar_discoverability(
candidates=[hidden_snapshot],
visible=[],
)
assert [row["session_id"] for row in result] == ["root_snapshot"]
assert result[0]["discoverability_warning"] == "rescued_messageful_hidden_session"
def test_messageful_hidden_snapshot_stays_hidden_when_continuation_is_visible():
from api.models import _preserve_messageful_sidebar_discoverability
hidden_snapshot = {
"session_id": "root_snapshot",
"title": "Archived snapshot",
"message_count": 42,
"pre_compression_snapshot": True,
}
visible_tip = {
"session_id": "tip_session",
"parent_session_id": "root_snapshot",
"title": "Visible continuation",
"message_count": 50,
}
result = _preserve_messageful_sidebar_discoverability(
candidates=[hidden_snapshot, visible_tip],
visible=[visible_tip],
)
assert [row["session_id"] for row in result] == ["tip_session"]
def test_intentional_background_sessions_are_not_rescued_into_sidebar():
from api.models import _preserve_messageful_sidebar_discoverability
cron_row = {
"session_id": "cron_digest_001",
"title": "Digest",
"source_tag": "cron",
"message_count": 12,
}
result = _preserve_messageful_sidebar_discoverability(
candidates=[cron_row],
visible=[],
)
assert result == []
def _lineage_row(session_id, *, root="lineage", count=1, ts=1.0, snapshot=False, source="cli"):
return {
"session_id": session_id,
"title": session_id,
"source_tag": source,
"session_source": source,
"_lineage_root_id": root,
"message_count": count,
"user_message_count": 1 if count else 0,
"last_message_at": ts,
"updated_at": ts,
"pre_compression_snapshot": snapshot,
}
def test_fuller_snapshot_does_not_hide_multirow_imported_cli_lineage():
"""Multiple messageful imported/CLI rows in one lineage are user-facing segments."""
from api.models import _prefer_fuller_snapshots_for_sidebar
rows = [
_lineage_row("imported-a", count=3, ts=100.0),
_lineage_row("imported-b", count=4, ts=200.0),
_lineage_row("snapshot", count=20, ts=300.0, snapshot=True),
]
result = _prefer_fuller_snapshots_for_sidebar(rows)
assert [row["session_id"] for row in result] == [
"imported-a",
"imported-b",
"snapshot",
]
snapshot = next(row for row in result if row["session_id"] == "snapshot")
assert snapshot["_show_pre_compression_snapshot"] is True
def test_fuller_snapshot_still_replaces_single_inactive_continuation():
"""The existing single-continuation cleanup stays intact."""
from api.models import _prefer_fuller_snapshots_for_sidebar
rows = [
_lineage_row("continuation", count=3, ts=100.0, source="webui"),
_lineage_row("snapshot", count=20, ts=300.0, snapshot=True, source="webui"),
]
result = _prefer_fuller_snapshots_for_sidebar(rows)
assert [row["session_id"] for row in result] == ["snapshot"]
assert result[0]["_show_pre_compression_snapshot"] is True