Files
MoviePilot/tests/test_plugin_settlement_lifecycle.py
T

78 lines
2.4 KiB
Python

import asyncio
from concurrent.futures import Future
from unittest.mock import AsyncMock, MagicMock
import pytest
from app.application.plugin.lifecycle import PluginStartupLease
from app.runtime.config import global_vars
from app.startup import lifecycle
@pytest.mark.asyncio
async def test_runtime_ready_waits_for_scheduler_and_command_refresh(monkeypatch) -> None:
"""插件 ready 只在调度任务和命令注册完成后对外可见。"""
order: list[str] = []
startup_tokens: list[PluginStartupLease] = []
manager = MagicMock()
command_future = Future()
async def sync_plugins(startup_token: PluginStartupLease) -> bool:
startup_tokens.append(startup_token)
order.append("plugins")
return True
async def execute_task(_loop, task_func, _task_name):
task_func()
return []
monkeypatch.setattr(lifecycle.settings, "MOVIEPILOT_SAFE_MODE", False)
monkeypatch.setattr(
global_vars,
"CURRENT_EVENT_LOOP",
asyncio.get_running_loop(),
)
monkeypatch.setattr(lifecycle, "get_plugin_manager", lambda: manager)
monkeypatch.setattr(lifecycle, "sync_plugins", sync_plugins)
monkeypatch.setattr(lifecycle, "execute_task", execute_task)
monkeypatch.setattr(
lifecycle,
"init_plugin_scheduler",
lambda: order.append("scheduler"),
)
monkeypatch.setattr(
lifecycle,
"restart_command",
lambda: (order.append("commands"), command_future)[1],
)
monkeypatch.setattr(lifecycle, "SystemHelper", MagicMock())
monkeypatch.setattr(lifecycle, "SystemChain", MagicMock())
monkeypatch.setattr(
lifecycle.MoviePilotServerHelper,
"async_report_usage",
AsyncMock(),
)
manager.set_plugin_settling.side_effect = lambda value: order.append(
f"settling:{value}"
)
manager.start_monitor.side_effect = lambda: order.append("monitor")
settle_task = asyncio.create_task(lifecycle.init_extra())
await asyncio.sleep(0)
assert order == ["plugins", "scheduler", "commands"]
manager.set_plugin_settling.assert_not_called()
command_future.set_result(None)
await settle_task
assert order == [
"plugins",
"scheduler",
"commands",
"settling:False",
"monitor",
]
assert len(startup_tokens) == 1
assert isinstance(startup_tokens[0], PluginStartupLease)