Fix canvas markdown rename before save

Route Office canvas renames through the document store so dirty or missing-on-disk Markdown sessions can be materialized at the new path without hitting the generic workdir filesystem rename endpoint. Add regression coverage for missing draft materialization, dirty markdown rename, and the custom rename hook contract.
This commit is contained in:
Alessandro 2026-05-02 20:51:58 +02:00
parent 5f2ef4f1da
commit dd696732c8
6 changed files with 181 additions and 18 deletions

View file

@ -40,6 +40,8 @@ def test_document_canvas_uses_markdown_editor_and_official_libreoffice_desktop_f
assert "desktop_save" in store
assert "openRenameModal" in store
assert 'callOffice("renamed"' in store
assert "performRename" in store
assert "payload.text" in store
assert "handleActiveFileRenamed" in store
assert "--office-zoom" not in panel
assert "zoom: 1" not in store
@ -147,8 +149,10 @@ def test_office_surface_filters_tabs_to_desktop_and_markdown_without_dashboard()
).read_text(encoding="utf-8")
assert "renameAfterConfirm" in file_browser_store
assert "renamePerformAction" in file_browser_store
assert "renameValidateName" in file_browser_store
assert "options.onRenamed" in file_browser_store
assert "options.performRename" in file_browser_store
assert "options.validateName" in file_browser_store

View file

@ -277,6 +277,40 @@ def test_document_path_update_preserves_file_id_after_rename(office_state):
assert document_store.get_document(doc["file_id"])["path"] == str(renamed)
def test_document_rename_materializes_missing_markdown_with_editor_text(office_state):
doc = document_store.create_document("document", "Unsaved Draft", "md", "Seed")
original = Path(doc["path"])
original.unlink()
renamed = original.with_name("Renamed Draft.md")
updated = document_store.rename_document(
doc["file_id"],
renamed,
content="# Renamed Draft\n\nCanvas text",
)
assert updated["file_id"] == doc["file_id"]
assert updated["basename"] == "Renamed Draft.md"
assert updated["path"] == str(renamed)
assert renamed.read_text(encoding="utf-8") == "# Renamed Draft\n\nCanvas text"
def test_document_rename_saves_dirty_markdown_and_removes_original(office_state):
doc = document_store.create_document("document", "Dirty Rename", "md", "Old")
original = Path(doc["path"])
renamed = original.with_name("Clean Rename.md")
updated = document_store.rename_document(
doc["file_id"],
renamed,
content="# Clean Rename\n\nFresh text",
)
assert updated["version"] == 2
assert not original.exists()
assert renamed.read_text(encoding="utf-8") == "# Clean Rename\n\nFresh text"
def test_direct_markdown_edits_refresh_open_canvas_session(office_state, monkeypatch):
manager = markdown_sessions.MarkdownSessionManager()
monkeypatch.setattr(markdown_sessions, "_manager", manager, raising=False)