Files
2026-07-13 13:12:33 +08:00

85 lines
3.1 KiB
Python

from opensquilla.gateway.session_streams import SessionStreamRegistry
def test_session_stream_registry_records_monotonic_stream_seq() -> None:
registry = SessionStreamRegistry(max_events_per_session=5)
first = registry.record("agent:main:test", "session.event.text_delta", {"text": "a"})
second = registry.record("agent:main:test", "session.event.done", {"reason": "stop"})
assert first["stream_seq"] == 1
assert second["stream_seq"] == 2
assert second["session_key"] == "agent:main:test"
assert registry.current_seq("agent:main:test") == 2
def test_session_stream_registry_replays_events_after_cursor() -> None:
registry = SessionStreamRegistry(max_events_per_session=5)
registry.record("agent:main:test", "session.event.text_delta", {"text": "a"})
registry.record("agent:main:test", "session.event.text_delta", {"text": "b"})
replay = registry.replay("agent:main:test", 1)
assert replay.current_stream_seq == 2
assert replay.replay_complete is True
assert [event.payload["text"] for event in replay.events] == ["b"]
def test_session_stream_registry_reports_incomplete_replay() -> None:
registry = SessionStreamRegistry(max_events_per_session=2)
registry.record("agent:main:test", "session.event.text_delta", {"text": "a"})
registry.record("agent:main:test", "session.event.text_delta", {"text": "b"})
registry.record("agent:main:test", "session.event.text_delta", {"text": "c"})
replay = registry.replay("agent:main:test", 0)
assert replay.current_stream_seq == 3
assert replay.replay_complete is False
assert [event.stream_seq for event in replay.events] == [2, 3]
def test_session_stream_registry_preserves_meta_step_control_events() -> None:
registry = SessionStreamRegistry(max_events_per_session=5)
registry.record(
"agent:main:test",
"session.event.tool_use_start",
{"tool_name": "meta-step:writing_plan", "tool_use_id": "meta_step_writing_plan"},
)
registry.record(
"agent:main:test",
"session.event.tool_result",
{
"tool_name": "meta-step:writing_plan",
"tool_use_id": "meta_step_writing_plan",
"result": "ok",
},
)
for index in range(10):
registry.record(
"agent:main:test",
"session.event.text_delta",
{"text": f"chunk-{index}"},
)
replay = registry.replay("agent:main:test", 0)
tool_events = [
event for event in replay.events
if event.payload.get("tool_name") == "meta-step:writing_plan"
]
assert [event.event_name for event in tool_events] == [
"session.event.tool_use_start",
"session.event.tool_result",
]
def test_session_stream_registry_reports_reset_when_client_cursor_is_ahead() -> None:
registry = SessionStreamRegistry(max_events_per_session=5)
replay = registry.replay("agent:main:after-restart", 5)
assert replay.current_stream_seq == 0
assert replay.replay_complete is False
assert replay.gap_reason == "stream_buffer_reset"
assert replay.events == []