fix(onlyoffice): 修复云端台账保存与备份重开
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
import io
|
||||
import uuid
|
||||
import zipfile
|
||||
from datetime import timezone
|
||||
from datetime import datetime, timezone
|
||||
from pathlib import Path
|
||||
from types import SimpleNamespace
|
||||
from unittest.mock import AsyncMock
|
||||
@@ -44,6 +44,7 @@ async def env(monkeypatch, tmp_path):
|
||||
monkeypatch.setattr(collaboration, "COLLABORATION_ROOT", tmp_path)
|
||||
monkeypatch.setattr(settings, "ONLYOFFICE_JWT_SECRET", "ledger-test-secret-long-enough-for-tests")
|
||||
monkeypatch.setattr(onlyoffice_service, "ensure_onlyoffice_available", AsyncMock())
|
||||
monkeypatch.setattr(office, "_document_server_users", AsyncMock(return_value=["live-user"]))
|
||||
async with AsyncSession(engine, expire_on_commit=False) as db:
|
||||
users = [User(id=uuid.uuid4(), email=f"ledger-{i}@example.com", password_hash="hash",
|
||||
full_name=f"Ledger user {i}", clinical_department="test", is_admin=i == 0,
|
||||
@@ -121,6 +122,76 @@ async def test_failed_ledger_session_recovers_server_backup_under_a_new_document
|
||||
recovery.assert_awaited_once_with(failed.document_key, "cell")
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_closed_ledger_session_starts_a_new_key_instead_of_reopening_server_cache(env, monkeypatch):
|
||||
item = await env.db.get(CollaborationFile, env.initial[0].id)
|
||||
first = await office.build_editor_config(env.db, item, env.admin)
|
||||
closed = await env.db.scalar(select(CollaborationSession).where(
|
||||
CollaborationSession.file_id == item.id,
|
||||
CollaborationSession.generation == item.generation,
|
||||
))
|
||||
await office.process_callback(env.db, closed.id, CollaborationCallbackPayload(
|
||||
key=closed.document_key,
|
||||
status=4,
|
||||
))
|
||||
recovery = AsyncMock(return_value=None)
|
||||
monkeypatch.setattr(office, "_recover_forgotten_content", recovery)
|
||||
|
||||
reopened = await office.build_editor_config(env.db, item, env.admin)
|
||||
await env.db.refresh(item)
|
||||
await env.db.refresh(closed)
|
||||
sessions = (await env.db.scalars(select(CollaborationSession).where(
|
||||
CollaborationSession.file_id == item.id,
|
||||
).order_by(CollaborationSession.generation))).all()
|
||||
|
||||
assert first.config["document"]["key"] != reopened.config["document"]["key"]
|
||||
assert item.generation == 2
|
||||
assert closed.status == "CLOSED"
|
||||
assert [session.generation for session in sessions] == [1, 2]
|
||||
recovery.assert_not_awaited()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_stale_active_ledger_session_starts_a_new_key_when_document_server_has_no_users(
|
||||
env, monkeypatch
|
||||
):
|
||||
item = await env.db.get(CollaborationFile, env.initial[0].id)
|
||||
first = await office.build_editor_config(env.db, item, env.admin)
|
||||
stale = await env.db.scalar(select(CollaborationSession).where(
|
||||
CollaborationSession.file_id == item.id,
|
||||
CollaborationSession.generation == item.generation,
|
||||
))
|
||||
stale.last_callback_at = datetime.now(timezone.utc)
|
||||
await env.db.commit()
|
||||
live_users = AsyncMock(return_value=[])
|
||||
recovery = AsyncMock(return_value=None)
|
||||
monkeypatch.setattr(office, "_document_server_users", live_users)
|
||||
monkeypatch.setattr(office, "_recover_forgotten_content", recovery)
|
||||
|
||||
reopened = await office.build_editor_config(env.db, item, env.admin)
|
||||
await env.db.refresh(item)
|
||||
await env.db.refresh(stale)
|
||||
|
||||
assert first.config["document"]["key"] != reopened.config["document"]["key"]
|
||||
assert item.generation == 2
|
||||
assert stale.status == "CLOSED"
|
||||
live_users.assert_awaited_once_with(stale.document_key)
|
||||
recovery.assert_awaited_once_with(stale.document_key, "cell")
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_new_active_session_is_reused_during_browser_connection_grace(env, monkeypatch):
|
||||
item = await env.db.get(CollaborationFile, env.initial[0].id)
|
||||
first = await office.build_editor_config(env.db, item, env.admin)
|
||||
live_users = AsyncMock(return_value=[])
|
||||
monkeypatch.setattr(office, "_document_server_users", live_users)
|
||||
|
||||
repeated = await office.build_editor_config(env.db, item, env.admin)
|
||||
|
||||
assert first.config["document"]["key"] == repeated.config["document"]["key"]
|
||||
live_users.assert_not_awaited()
|
||||
|
||||
|
||||
@pytest.mark.asyncio
|
||||
async def test_account_grants_are_independent_and_all_file_routes_require_access(env):
|
||||
await grant(env, env.editor, "EDITOR")
|
||||
|
||||
Reference in New Issue
Block a user