75 lines
2.1 KiB
Python
75 lines
2.1 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""Tests for the conversation-command adapter's scroll-checkpoint handling.
|
|
|
|
Pins ``_resolve_scroll_block`` — the rule that keeps the scroll context
|
|
manager's persisted bookkeeping consistent with what a command did to the live
|
|
window (update on /compact, reset on /clear, preserve otherwise). The prior bug
|
|
was that *every* command silently dropped the scroll block.
|
|
"""
|
|
|
|
from pineagents.agents.command_handler import ConversationCommandHandlerMixin
|
|
from pineagents.runtime.builtin_commands import (
|
|
_collect_conversation_specs,
|
|
_CONVERSATION_COMMANDS,
|
|
_resolve_scroll_block,
|
|
)
|
|
|
|
|
|
def test_runtime_registers_every_command_handler_conversation_command():
|
|
assert _CONVERSATION_COMMANDS == (
|
|
ConversationCommandHandlerMixin.SYSTEM_COMMANDS
|
|
)
|
|
assert "reme_status" in {
|
|
spec.name for spec in _collect_conversation_specs()
|
|
}
|
|
|
|
|
|
def test_compact_saves_the_refreshed_block():
|
|
updated = {"tiers": [["block"]]}
|
|
out = _resolve_scroll_block(
|
|
updated=updated,
|
|
context_empty=False,
|
|
existing={"old": True},
|
|
)
|
|
assert out is updated
|
|
|
|
|
|
def test_cleared_context_resets_the_block():
|
|
# /clear, /new empty the window — a stale eviction index must not survive.
|
|
out = _resolve_scroll_block(
|
|
updated=None,
|
|
context_empty=True,
|
|
existing={"tiers": [["old"]]},
|
|
)
|
|
assert out is None
|
|
|
|
|
|
def test_readonly_command_preserves_existing_block():
|
|
# /history, /message, ... must NOT nuke the scroll checkpoint.
|
|
existing = {"persisted_ids": ["a", "b"]}
|
|
out = _resolve_scroll_block(
|
|
updated=None,
|
|
context_empty=False,
|
|
existing=existing,
|
|
)
|
|
assert out is existing
|
|
|
|
|
|
def test_update_wins_even_if_context_empty():
|
|
updated = {"tiers": []}
|
|
out = _resolve_scroll_block(
|
|
updated=updated,
|
|
context_empty=True,
|
|
existing=None,
|
|
)
|
|
assert out is updated
|
|
|
|
|
|
def test_no_existing_block_native_session():
|
|
out = _resolve_scroll_block(
|
|
updated=None,
|
|
context_empty=False,
|
|
existing=None,
|
|
)
|
|
assert out is None
|