2025-11-04 08:01:20 +01:00
|
|
|
import json
|
2025-11-04 08:09:12 +01:00
|
|
|
import os
|
|
|
|
|
|
|
|
|
|
import pytest
|
|
|
|
|
|
2025-11-07 18:50:28 +01:00
|
|
|
from rp.core.session import SessionManager
|
2025-11-04 08:01:20 +01:00
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
@pytest.fixture
|
|
|
|
|
def temp_sessions_dir(tmp_path, monkeypatch):
|
2025-11-07 18:50:28 +01:00
|
|
|
from rp.core import session
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
original_dir = session.SESSIONS_DIR
|
2025-11-04 08:09:12 +01:00
|
|
|
monkeypatch.setattr(session, "SESSIONS_DIR", str(tmp_path))
|
2025-11-04 08:01:20 +01:00
|
|
|
# Clean any existing files
|
|
|
|
|
import shutil
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
if os.path.exists(str(tmp_path)):
|
|
|
|
|
shutil.rmtree(str(tmp_path))
|
|
|
|
|
os.makedirs(str(tmp_path), exist_ok=True)
|
|
|
|
|
yield tmp_path
|
2025-11-04 08:09:12 +01:00
|
|
|
monkeypatch.setattr(session, "SESSIONS_DIR", original_dir)
|
|
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
|
|
|
|
|
def test_session_manager_init(temp_sessions_dir):
|
2025-11-04 08:09:12 +01:00
|
|
|
SessionManager()
|
2025-11-04 08:01:20 +01:00
|
|
|
assert os.path.exists(temp_sessions_dir)
|
|
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
def test_save_and_load_session(temp_sessions_dir):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
name = "test_session"
|
|
|
|
|
messages = [{"role": "user", "content": "Hello"}]
|
|
|
|
|
metadata = {"test": True}
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
assert manager.save_session(name, messages, metadata)
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
loaded = manager.load_session(name)
|
|
|
|
|
assert loaded is not None
|
2025-11-04 08:09:12 +01:00
|
|
|
assert loaded["name"] == name
|
|
|
|
|
assert loaded["messages"] == messages
|
|
|
|
|
assert loaded["metadata"] == metadata
|
|
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
|
|
|
|
|
def test_load_nonexistent_session(temp_sessions_dir):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
loaded = manager.load_session("nonexistent")
|
|
|
|
|
assert loaded is None
|
|
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
def test_list_sessions(temp_sessions_dir):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
# Save a session
|
|
|
|
|
manager.save_session("session1", [{"role": "user", "content": "Hi"}])
|
|
|
|
|
manager.save_session("session2", [{"role": "user", "content": "Hello"}])
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
sessions = manager.list_sessions()
|
|
|
|
|
assert len(sessions) == 2
|
2025-11-04 08:09:12 +01:00
|
|
|
assert sessions[0]["name"] == "session2" # sorted by created_at desc
|
|
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
|
|
|
|
|
def test_delete_session(temp_sessions_dir):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
name = "to_delete"
|
|
|
|
|
manager.save_session(name, [{"role": "user", "content": "Test"}])
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
assert manager.delete_session(name)
|
|
|
|
|
assert manager.load_session(name) is None
|
|
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
def test_delete_nonexistent_session(temp_sessions_dir):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
assert not manager.delete_session("nonexistent")
|
|
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
def test_export_session_json(temp_sessions_dir, tmp_path):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
name = "export_test"
|
|
|
|
|
messages = [{"role": "user", "content": "Export me"}]
|
|
|
|
|
manager.save_session(name, messages)
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
output_path = tmp_path / "exported.json"
|
2025-11-04 08:09:12 +01:00
|
|
|
assert manager.export_session(name, str(output_path), "json")
|
2025-11-04 08:01:20 +01:00
|
|
|
assert output_path.exists()
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
with open(output_path) as f:
|
|
|
|
|
data = json.load(f)
|
2025-11-04 08:09:12 +01:00
|
|
|
assert data["name"] == name
|
|
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
|
|
|
|
|
def test_export_session_markdown(temp_sessions_dir, tmp_path):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
name = "export_md"
|
|
|
|
|
messages = [{"role": "user", "content": "Markdown export"}]
|
|
|
|
|
manager.save_session(name, messages)
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
output_path = tmp_path / "exported.md"
|
2025-11-04 08:09:12 +01:00
|
|
|
assert manager.export_session(name, str(output_path), "markdown")
|
2025-11-04 08:01:20 +01:00
|
|
|
assert output_path.exists()
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
content = output_path.read_text()
|
|
|
|
|
assert "# Session: export_md" in content
|
|
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
def test_export_session_txt(temp_sessions_dir, tmp_path):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
name = "export_txt"
|
|
|
|
|
messages = [{"role": "user", "content": "Text export"}]
|
|
|
|
|
manager.save_session(name, messages)
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
output_path = tmp_path / "exported.txt"
|
2025-11-04 08:09:12 +01:00
|
|
|
assert manager.export_session(name, str(output_path), "txt")
|
2025-11-04 08:01:20 +01:00
|
|
|
assert output_path.exists()
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
content = output_path.read_text()
|
|
|
|
|
assert "Session: export_txt" in content
|
|
|
|
|
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
def test_export_nonexistent_session(temp_sessions_dir, tmp_path):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
output_path = tmp_path / "nonexistent.json"
|
2025-11-04 08:09:12 +01:00
|
|
|
assert not manager.export_session("nonexistent", str(output_path), "json")
|
|
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
|
|
|
|
|
def test_export_unsupported_format(temp_sessions_dir, tmp_path):
|
|
|
|
|
manager = SessionManager()
|
|
|
|
|
name = "test"
|
|
|
|
|
manager.save_session(name, [{"role": "user", "content": "Test"}])
|
2025-11-04 08:09:12 +01:00
|
|
|
|
2025-11-04 08:01:20 +01:00
|
|
|
output_path = tmp_path / "test.unsupported"
|
2025-11-04 08:09:12 +01:00
|
|
|
assert not manager.export_session(name, str(output_path), "unsupported")
|