test(sessions): wire sessions_dir through auto-prune + file-cleanup regression tests

- TestAutoMaintenance gains 3 tests: auto-prune deletes transcript files
  when sessions_dir is passed, preserves them when it isn't (backward-
  compat), and never touches active-session files during prune.
- FakeDB helpers in test_sessions_delete.py accept **kwargs so they
  don't break when delete_session signature gains sessions_dir.
This commit is contained in:
Teknium
2026-04-26 18:29:31 -07:00
committed by Teknium
parent 3b60abb6bb
commit cd2aee36ca
2 changed files with 58 additions and 3 deletions

View File

@@ -12,7 +12,7 @@ def test_sessions_delete_accepts_unique_id_prefix(monkeypatch, capsys):
captured["resolved_from"] = session_id
return "20260315_092437_c9a6ff"
def delete_session(self, session_id):
def delete_session(self, session_id, **kwargs):
captured["deleted"] = session_id
return True
@@ -45,7 +45,7 @@ def test_sessions_delete_reports_not_found_when_prefix_is_unknown(monkeypatch, c
def resolve_session_id(self, session_id):
return None
def delete_session(self, session_id):
def delete_session(self, session_id, **kwargs):
raise AssertionError("delete_session should not be called when resolution fails")
def close(self):
@@ -73,7 +73,7 @@ def test_sessions_delete_handles_eoferror_on_confirm(monkeypatch, capsys):
def resolve_session_id(self, session_id):
return "20260315_092437_c9a6ff"
def delete_session(self, session_id):
def delete_session(self, session_id, **kwargs):
raise AssertionError("delete_session should not be called when cancelled")
def close(self):

View File

@@ -1981,3 +1981,58 @@ class TestAutoMaintenance:
# Should parse as a float timestamp close to now.
assert abs(float(marker) - time.time()) < 60
def test_auto_prune_deletes_transcript_files(self, db, tmp_path):
"""Issue #3015: auto-prune must also delete on-disk transcript files."""
sessions_dir = tmp_path / "sessions"
sessions_dir.mkdir()
self._make_old_ended(db, "old1", days_old=100)
self._make_old_ended(db, "old2", days_old=100)
db.create_session(session_id="new", source="cli") # active
# Transcript files mimicking real gateway/CLI layout
(sessions_dir / "old1.json").write_text("{}")
(sessions_dir / "old1.jsonl").write_text("{}\n")
(sessions_dir / "old2.jsonl").write_text("{}\n")
(sessions_dir / "request_dump_old1_001.json").write_text("{}")
(sessions_dir / "new.jsonl").write_text("{}\n") # active, must survive
result = db.maybe_auto_prune_and_vacuum(
retention_days=90, sessions_dir=sessions_dir
)
assert result["pruned"] == 2
# Pruned transcript files are gone
assert not (sessions_dir / "old1.json").exists()
assert not (sessions_dir / "old1.jsonl").exists()
assert not (sessions_dir / "old2.jsonl").exists()
assert not (sessions_dir / "request_dump_old1_001.json").exists()
# Active session's transcript is untouched
assert (sessions_dir / "new.jsonl").exists()
def test_auto_prune_without_sessions_dir_preserves_files(self, db, tmp_path):
"""Backward-compat: no sessions_dir = DB-only cleanup (legacy behavior)."""
sessions_dir = tmp_path / "sessions"
sessions_dir.mkdir()
self._make_old_ended(db, "old", days_old=100)
(sessions_dir / "old.jsonl").write_text("{}\n")
result = db.maybe_auto_prune_and_vacuum(retention_days=90)
assert result["pruned"] == 1
# File stays — caller didn't opt in
assert (sessions_dir / "old.jsonl").exists()
def test_prune_sessions_deletes_files_for_pruned_only(self, db, tmp_path):
"""Active-session transcripts must never be deleted by prune."""
sessions_dir = tmp_path / "sessions"
sessions_dir.mkdir()
self._make_old_ended(db, "old", days_old=100)
db.create_session(session_id="active", source="cli") # not ended
(sessions_dir / "old.jsonl").write_text("{}\n")
(sessions_dir / "active.jsonl").write_text("{}\n")
count = db.prune_sessions(older_than_days=90, sessions_dir=sessions_dir)
assert count == 1
assert not (sessions_dir / "old.jsonl").exists()
assert (sessions_dir / "active.jsonl").exists()