feat(sessions): add durable observation archive and replay API
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
from __future__ import annotations
|
||||
|
||||
from pathlib import Path
|
||||
|
||||
from k1link.sessions import ActiveSessionLease, recover_stale_active_session_marker
|
||||
from k1link.sessions.legacy import discover_legacy_viewer_sessions
|
||||
|
||||
|
||||
def test_active_session_lease_hides_live_evidence_until_release(tmp_path: Path) -> None:
|
||||
sessions = tmp_path / "sessions"
|
||||
session = sessions / "20260717T011050Z_viewer_live"
|
||||
|
||||
lease = ActiveSessionLease.acquire(sessions, session)
|
||||
try:
|
||||
session.mkdir()
|
||||
capture = session / "captures" / "mqtt_live"
|
||||
capture.mkdir(parents=True)
|
||||
(capture / "mqtt.raw.k1mqtt").write_bytes(b"K1MQTT\x00unfinished")
|
||||
candidates = discover_legacy_viewer_sessions(sessions)
|
||||
assert candidates == ()
|
||||
assert recover_stale_active_session_marker(sessions) is False
|
||||
finally:
|
||||
lease.release()
|
||||
|
||||
assert not (sessions / ".current_session").exists()
|
||||
candidates = discover_legacy_viewer_sessions(sessions)
|
||||
assert len(candidates) == 1
|
||||
assert candidates[0].session_id == session.name
|
||||
assert candidates[0].replayable is False
|
||||
|
||||
|
||||
def test_startup_recovery_removes_only_an_unlocked_stale_marker(tmp_path: Path) -> None:
|
||||
sessions = tmp_path / "sessions"
|
||||
sessions.mkdir()
|
||||
marker = sessions / ".current_session"
|
||||
marker.write_text("20260717T011050Z_viewer_live\n", encoding="utf-8")
|
||||
|
||||
assert recover_stale_active_session_marker(sessions) is True
|
||||
assert not marker.exists()
|
||||
assert recover_stale_active_session_marker(sessions) is False
|
||||
Reference in New Issue
Block a user