Files
MoviePilot/tests/test_command_dispatch.py
DDSRem 2de976f6b3 Merge pull request #7050 from DDSRem-Dev/codex-comment-migration
docs: 统一全项目中文注释和结构化契约说明
2026-10-17 19:26:29 +08:00

68 lines
2.0 KiB
Python

"""
命令门面与真实注册表的缺省值契约回归。
"""
from unittest.mock import Mock
import pytest
from app.application import commands
from app.command import Command
from app.schemas.types import EventType, NotificationChannel
@pytest.fixture
def command_registry(monkeypatch):
"""
保留真实注册表查询逻辑,跳过单例初始化和外部服务装配。
"""
registry = object.__new__(Command)
registry._commands = {
"/demo": {"description": "示例命令", "pid": "demo-plugin"},
}
monkeypatch.setattr(commands, "_command_class", lambda: registry)
return registry
@pytest.mark.parametrize("command", ["/missing", " missing 参数 "])
def test_missing_command_is_rejected_before_publishing(command_registry, command):
"""
真实注册表用空字典表示缺失,门面应报错且不发送执行事件。
"""
assert command_registry.get("/missing") == {}
publish_event = Mock()
with pytest.raises(ValueError, match="命令 /missing 不存在.*示例命令"):
commands.dispatch_command(command, user_id="1", publish_event=publish_event)
publish_event.assert_not_called()
def test_registered_command_keeps_arguments_and_channel(command_registry):
"""
已注册命令仍传递原参数、用户和渠道,并返回插件描述。
"""
publish_event = Mock()
assert commands.get_commands() is command_registry._commands
result = commands.dispatch_command(
" demo 参数 ",
user_id="7",
channel=NotificationChannel.Wechat,
source="企业微信",
publish_event=publish_event,
)
publish_event.assert_called_once_with(
EventType.CommandExcute,
{
"cmd": "/demo 参数",
"user": "7",
"channel": NotificationChannel.Wechat,
"source": "企业微信",
},
)
assert result["command"] == "/demo 参数"
assert result["command_desc"] == "示例命令"
assert result["plugin_id"] == "demo-plugin"