vibe/tests/session/test_session_migration.py
Mathias Gesbert d33db9fff8 2.0.0
Co-Authored-By: Quentin Torroba <quentin.torroba@mistral.ai>
Co-Authored-By: Michel Thomazo <michel.thomazo@mistral.ai>
Co-Authored-By: Clément Drouin <clement.drouin@mistral.ai>
Co-Authored-By: Vincent Guilloux <vincent.guilloux@mistral.ai>
Co-Authored-By: Clément Siriex <clement.sirieix@mistral.ai>
Co-Authored-By: Kim-Adeline Miguel <kimadeline.miguel@mistral.ai>
Co-Authored-By: Thaddee Tyl <thaddee.tyl@gmail.com>
Co-Authored-By: David Brochart <david.brochart@gmail.com>
Co-Authored-By: Joseph Guhlin <joseph.guhlin@gmail.com>
Co-Authored-By: Thomas Kenbeek <thomaskenbeek@gmail.com>
Co-Authored-By: Remenby31 <baptiste.cruvellier31@gmail.com>
2026-01-27 16:44:55 +01:00

177 lines
5.9 KiB
Python

from __future__ import annotations
import json
from pathlib import Path
import pytest
from vibe.core.config import SessionLoggingConfig
from vibe.core.session.session_migration import migrate_sessions
@pytest.fixture
def temp_session_dir(tmp_path: Path) -> Path:
session_dir = tmp_path / "sessions"
session_dir.mkdir()
return session_dir
@pytest.fixture
def session_config(temp_session_dir: Path) -> SessionLoggingConfig:
return SessionLoggingConfig(
save_dir=str(temp_session_dir), session_prefix="test", enabled=True
)
@pytest.fixture
def disabled_session_config() -> SessionLoggingConfig:
return SessionLoggingConfig(
save_dir="/tmp/test", session_prefix="test", enabled=False
)
@pytest.fixture
def old_session_data() -> dict:
return {
"metadata": {
"session_id": "test-session-123",
"start_time": "2023-01-01T00:00:00",
"end_time": "2023-01-01T01:00:00",
"git_commit": "abc123",
"git_branch": "main",
"username": "testuser",
"environment": {"working_directory": "/test"},
},
"messages": [
{"role": "system", "content": "System prompt"},
{"role": "user", "content": "Hello"},
{"role": "assistant", "content": "Hi there!"},
],
}
class TestSessionMigration:
@pytest.mark.asyncio
async def test_migrate_sessions_disabled_config(
self, disabled_session_config: SessionLoggingConfig
) -> None:
"""Test that migration does nothing when config is disabled."""
result = await migrate_sessions(disabled_session_config)
assert result == 0
@pytest.mark.asyncio
async def test_migrate_sessions_no_save_dir(
self, session_config: SessionLoggingConfig
) -> None:
"""Test that migration handles missing save_dir gracefully."""
config = SessionLoggingConfig(save_dir="", session_prefix="test", enabled=True)
result = await migrate_sessions(config)
assert result == 0
@pytest.mark.asyncio
async def test_migrate_sessions_no_old_files(
self, session_config: SessionLoggingConfig
) -> None:
"""Test that migration handles no old session files gracefully."""
session_dir = Path(session_config.save_dir)
session_dir.mkdir(exist_ok=True)
result = await migrate_sessions(session_config)
assert result == 0
@pytest.mark.asyncio
async def test_migrate_sessions_successful_migration(
self, session_config: SessionLoggingConfig, old_session_data: dict
) -> None:
"""Test successful migration of old session files."""
session_dir = Path(session_config.save_dir)
old_session_file = session_dir / "test_session-123.json"
with open(old_session_file, "w") as f:
json.dump(old_session_data, f)
result = await migrate_sessions(session_config)
assert result == 1
assert not old_session_file.exists()
session_subdir = session_dir / "test_session-123"
assert session_subdir.is_dir()
metadata_file = session_subdir / "meta.json"
assert metadata_file.is_file()
with open(metadata_file) as f:
metadata = json.load(f)
assert metadata == old_session_data["metadata"]
messages_file = session_subdir / "messages.jsonl"
assert messages_file.exists()
with open(messages_file) as f:
lines = f.readlines()
assert len(lines) == len(old_session_data["messages"])
for i, line in enumerate(lines):
message = json.loads(line.strip())
assert message == old_session_data["messages"][i]
@pytest.mark.asyncio
async def test_migrate_sessions_multiple_files(
self, session_config: SessionLoggingConfig, old_session_data: dict
) -> None:
"""Test migration of multiple old session files."""
session_dir = Path(session_config.save_dir)
session_files = []
for i in range(3):
session_file = session_dir / f"test_session-{i:03d}.json"
session_files.append(session_file)
modified_data = old_session_data.copy()
modified_data["metadata"]["session_id"] = f"test-session-{i}"
with open(session_file, "w") as f:
json.dump(modified_data, f)
result = await migrate_sessions(session_config)
assert result == 3
for session_file in session_files:
assert not session_file.exists()
for i in range(3):
session_subdir = session_dir / f"test_session-{i:03d}"
assert session_subdir.exists()
assert session_subdir.is_dir()
metadata_file = session_subdir / "meta.json"
messages_file = session_subdir / "messages.jsonl"
assert metadata_file.exists()
assert messages_file.exists()
@pytest.mark.asyncio
async def test_migrate_sessions_error_handling(
self, session_config: SessionLoggingConfig
) -> None:
"""Test that migration handles errors gracefully and continues."""
session_dir = Path(session_config.save_dir)
valid_session_file = session_dir / "test_session-valid.json"
valid_data = {
"metadata": {"session_id": "valid-session"},
"messages": [{"role": "user", "content": "Hello"}],
}
with open(valid_session_file, "w") as f:
json.dump(valid_data, f)
invalid_session_file = session_dir / "test_session-invalid.json"
with open(invalid_session_file, "w") as f:
f.write("{invalid json}")
result = await migrate_sessions(session_config)
assert result == 1
valid_session_subdir = session_dir / "test_session-valid"
assert valid_session_subdir.exists()
assert not valid_session_file.exists()
assert invalid_session_file.exists()