mirror of
https://github.com/AstrBotDevs/AstrBot
synced 2026-07-16 01:40:15 +08:00
118 lines
4.1 KiB
Python
118 lines
4.1 KiB
Python
"""真实 v4 示例插件集成测试。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import sys
|
|
from pathlib import Path
|
|
|
|
import pytest
|
|
|
|
from astrbot_sdk.protocol.descriptors import (
|
|
CommandTrigger,
|
|
EventTrigger,
|
|
MessageTrigger,
|
|
ScheduleTrigger,
|
|
)
|
|
from astrbot_sdk.runtime.loader import load_plugin, load_plugin_spec
|
|
|
|
|
|
class TestRealNewTestPlugin:
|
|
"""验证仓库中的真实 v4 示例插件目录。"""
|
|
|
|
def test_load_new_plugin(self):
|
|
project_root = Path(__file__).resolve().parent.parent
|
|
test_plugin_dir = project_root / "test_plugin" / "new"
|
|
|
|
if not test_plugin_dir.exists():
|
|
pytest.skip("test_plugin/new directory not found")
|
|
|
|
spec = load_plugin_spec(test_plugin_dir)
|
|
|
|
paths_to_add = []
|
|
if str(test_plugin_dir) not in sys.path:
|
|
sys.path.insert(0, str(test_plugin_dir))
|
|
paths_to_add.append(str(test_plugin_dir))
|
|
|
|
src_new = project_root / "src-new"
|
|
if str(src_new) not in sys.path:
|
|
sys.path.insert(0, str(src_new))
|
|
paths_to_add.append(str(src_new))
|
|
|
|
try:
|
|
loaded = load_plugin(spec)
|
|
|
|
assert loaded.plugin.name == "astrbot_plugin_v4demo"
|
|
assert len(loaded.instances) == 1
|
|
|
|
command_triggers = [
|
|
handler.descriptor.trigger
|
|
for handler in loaded.handlers
|
|
if isinstance(handler.descriptor.trigger, CommandTrigger)
|
|
]
|
|
message_triggers = [
|
|
handler.descriptor.trigger
|
|
for handler in loaded.handlers
|
|
if isinstance(handler.descriptor.trigger, MessageTrigger)
|
|
]
|
|
event_triggers = [
|
|
handler.descriptor.trigger
|
|
for handler in loaded.handlers
|
|
if isinstance(handler.descriptor.trigger, EventTrigger)
|
|
]
|
|
schedule_triggers = [
|
|
handler.descriptor.trigger
|
|
for handler in loaded.handlers
|
|
if isinstance(handler.descriptor.trigger, ScheduleTrigger)
|
|
]
|
|
handler_map = {
|
|
handler.descriptor.id: handler.descriptor for handler in loaded.handlers
|
|
}
|
|
|
|
assert {trigger.command for trigger in command_triggers} == {
|
|
"announce",
|
|
"hello",
|
|
"platforms",
|
|
"raw",
|
|
"remember",
|
|
"secure",
|
|
}
|
|
hello_trigger = next(
|
|
trigger for trigger in command_triggers if trigger.command == "hello"
|
|
)
|
|
assert "hi" in hello_trigger.aliases
|
|
secure_descriptor = next(
|
|
descriptor
|
|
for descriptor in handler_map.values()
|
|
if getattr(descriptor.trigger, "command", None) == "secure"
|
|
)
|
|
assert secure_descriptor.permissions.require_admin is True
|
|
|
|
assert len(message_triggers) == 1
|
|
assert message_triggers[0].regex == r"^ping$"
|
|
assert message_triggers[0].keywords == ["ping"]
|
|
assert message_triggers[0].platforms == ["test"]
|
|
|
|
assert len(event_triggers) == 1
|
|
assert event_triggers[0].event_type == "group_join"
|
|
|
|
assert len(schedule_triggers) == 1
|
|
assert schedule_triggers[0].interval_seconds == 60
|
|
|
|
capability_names = [item.descriptor.name for item in loaded.capabilities]
|
|
assert capability_names == ["demo.echo", "demo.stream"]
|
|
stream_descriptor = next(
|
|
item.descriptor
|
|
for item in loaded.capabilities
|
|
if item.descriptor.name == "demo.stream"
|
|
)
|
|
assert stream_descriptor.supports_stream is True
|
|
assert stream_descriptor.cancelable is True
|
|
finally:
|
|
for path in paths_to_add:
|
|
if path in sys.path:
|
|
sys.path.remove(path)
|
|
|
|
for module_name in list(sys.modules):
|
|
if module_name == "commands" or module_name.startswith("commands."):
|
|
sys.modules.pop(module_name, None)
|