Co-authored-by: Clément Sirieix <clement.sirieix@mistral.ai> Co-authored-by: Guillaume LE GOFF <guillaume.lgf@gmail.com> Co-authored-by: Hdandria <henri.dandria@mistral.ai> Co-authored-by: Ivana Dunisijevic <ivana.dunisijevic@mistral.ai> Co-authored-by: Jean Burellier <sheplu@users.noreply.github.com> Co-authored-by: Mathias Gesbert <mathias.gesbert@mistral.ai> Co-authored-by: Mert Unsal <mert.unsal@mistral.ai> Co-authored-by: Michel Thomazo <51709227+michelTho@users.noreply.github.com> Co-authored-by: Paul VEZIA <166131032+le-codeur-rapide@users.noreply.github.com> Co-authored-by: Pierre Rossinès <pierre.rossines@mistral.ai> Co-authored-by: Val <102326092+vdeva@users.noreply.github.com> Co-authored-by: Vincent G <10739306+VinceOPS@users.noreply.github.com> Co-authored-by: renovate-mistral[bot] <253709520+renovate-mistral[bot]@users.noreply.github.com> Co-authored-by: Mistral Vibe <vibe@mistral.ai>
130 lines
4.4 KiB
Python
130 lines
4.4 KiB
Python
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from tests.conftest import build_test_vibe_app, build_test_vibe_config
|
|
from vibe.cli.textual_ui.widgets.messages import ErrorMessage, UserCommandMessage
|
|
from vibe.core.config import SessionLoggingConfig
|
|
|
|
|
|
def _enabled_session_config(save_dir: Path) -> SessionLoggingConfig:
|
|
return SessionLoggingConfig(enabled=True, save_dir=str(save_dir))
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_rename_command_updates_live_unsaved_session_title(
|
|
tmp_path: Path,
|
|
) -> None:
|
|
config = build_test_vibe_config(session_logging=_enabled_session_config(tmp_path))
|
|
app = build_test_vibe_app(config=config)
|
|
|
|
async with app.run_test() as pilot:
|
|
handled = await app._handle_command("/rename Manual title")
|
|
await pilot.pause()
|
|
messages = app.query(UserCommandMessage)
|
|
assert any(
|
|
message._content == 'Session renamed to "Manual title".'
|
|
for message in messages
|
|
)
|
|
|
|
assert handled is True
|
|
|
|
metadata = app.agent_loop.session_logger.session_metadata
|
|
assert metadata is not None
|
|
assert metadata.title == "Manual title"
|
|
assert metadata.title_source == "manual"
|
|
assert not app.agent_loop.session_logger.metadata_filepath.exists()
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_rename_command_persists_existing_session_metadata(
|
|
tmp_path: Path,
|
|
) -> None:
|
|
config = build_test_vibe_config(session_logging=_enabled_session_config(tmp_path))
|
|
app = build_test_vibe_app(config=config)
|
|
logger = app.agent_loop.session_logger
|
|
assert logger.session_dir is not None
|
|
assert logger.session_metadata is not None
|
|
|
|
logger.session_dir.mkdir(parents=True)
|
|
existing_metadata = {
|
|
**logger.session_metadata.model_dump(),
|
|
"end_time": "2024-01-01T12:05:00Z",
|
|
"extra_field": "preserved",
|
|
}
|
|
logger.metadata_filepath.write_text(json.dumps(existing_metadata), encoding="utf-8")
|
|
|
|
async with app.run_test() as pilot:
|
|
handled = await app._handle_command("/rename Persisted title")
|
|
await pilot.pause()
|
|
|
|
assert handled is True
|
|
|
|
metadata = logger.session_metadata
|
|
assert metadata is not None
|
|
assert metadata.title == "Persisted title"
|
|
assert metadata.title_source == "manual"
|
|
|
|
saved_metadata = json.loads(logger.metadata_filepath.read_text())
|
|
assert saved_metadata["title"] == "Persisted title"
|
|
assert saved_metadata["title_source"] == "manual"
|
|
assert saved_metadata["end_time"] == "2024-01-01T12:05:00Z"
|
|
assert saved_metadata["extra_field"] == "preserved"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_resume_picker_shows_renamed_session_title(
|
|
tmp_path: Path, monkeypatch: pytest.MonkeyPatch
|
|
) -> None:
|
|
config = build_test_vibe_config(
|
|
session_logging=_enabled_session_config(tmp_path), vibe_code_enabled=False
|
|
)
|
|
app = build_test_vibe_app(config=config)
|
|
logger = app.agent_loop.session_logger
|
|
assert logger.session_dir is not None
|
|
assert logger.session_metadata is not None
|
|
|
|
logger.session_dir.mkdir(parents=True)
|
|
existing_metadata = {
|
|
**logger.session_metadata.model_dump(),
|
|
"end_time": "2024-01-01T12:05:00Z",
|
|
"total_messages": 1,
|
|
}
|
|
logger.metadata_filepath.write_text(json.dumps(existing_metadata), encoding="utf-8")
|
|
logger.messages_filepath.write_text(
|
|
'{"role": "user", "content": "Original prompt"}\n', encoding="utf-8"
|
|
)
|
|
|
|
captured_picker = None
|
|
|
|
async def capture_picker(picker):
|
|
nonlocal captured_picker
|
|
captured_picker = picker
|
|
|
|
monkeypatch.setattr(app, "_switch_from_input", capture_picker)
|
|
|
|
async with app.run_test() as pilot:
|
|
handled = await app._handle_command("/rename New title")
|
|
await app._show_session_picker()
|
|
await pilot.pause()
|
|
|
|
assert handled is True
|
|
assert captured_picker is not None
|
|
assert captured_picker._latest_messages[logger.session_id] == "New title"
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
async def test_rename_command_requires_title(tmp_path: Path) -> None:
|
|
config = build_test_vibe_config(session_logging=_enabled_session_config(tmp_path))
|
|
app = build_test_vibe_app(config=config)
|
|
|
|
async with app.run_test() as pilot:
|
|
handled = await app._handle_command("/rename")
|
|
await pilot.pause()
|
|
errors = app.query(ErrorMessage)
|
|
assert any(error._error == "Usage: /rename <title>" for error in errors)
|
|
|
|
assert handled is True
|