11import inspect
22from collections .abc import Awaitable
3- from typing import Any , Callable , ClassVar , Optional , Union
3+ from typing import Any , Callable , Generic , Optional , Union
44from typing_extensions import override
55
66from anyio .lowlevel import checkpoint
77
88from alicebot import Adapter , Event , MessageEvent
9+ from alicebot .plugin import Plugin
10+ from alicebot .typing import ConfigT , StateT
11+
12+ EventFactory = Callable [
13+ ["FakeAdapter" ],
14+ Union [
15+ Optional [Event ["FakeAdapter" ]],
16+ Awaitable [Optional [Event ["FakeAdapter" ]]],
17+ ],
18+ ]
919
1020
1121class FakeAdapter (Adapter [Event [Any ], None ]):
1222 """用于测试的适配器。"""
1323
14- EventFactory = Callable [
15- ["FakeAdapter" ],
16- Union [
17- Optional [Event ["FakeAdapter" ]],
18- Awaitable [Optional [Event ["FakeAdapter" ]]],
19- ],
20- ]
21-
2224 name : str = "fake_adapter"
23- event_factories : ClassVar [ tuple [EventFactory , ...] ] = ()
24- handle_get : ClassVar [ bool ] = True
25+ event_factories : tuple [EventFactory , ...] = ()
26+ handle_get : bool = True
2527
2628 @override
2729 async def run (self ) -> None :
@@ -42,10 +44,15 @@ async def run(self) -> None:
4244
4345 self .bot .exit ()
4446
45- @classmethod
46- def set_event_factories (cls , * event_factories : EventFactory ) -> None :
47- """设置适配器运行后将要产生的事件。"""
48- cls .event_factories = event_factories
47+
48+ def fake_adapter_class_factory (
49+ * event_factories : EventFactory , handle_get : bool = True
50+ ) -> type [FakeAdapter ]:
51+ return type (
52+ "FakeAdapter" ,
53+ (FakeAdapter ,),
54+ {"event_factories" : event_factories , "handle_get" : handle_get },
55+ )
4956
5057
5158class FakeMessageEvent (MessageEvent [FakeAdapter ]):
@@ -62,3 +69,22 @@ def get_plain_text(self) -> str:
6269 @override
6370 async def reply (self , message : str ) -> None :
6471 pass
72+
73+
74+ def fake_message_event_factor (
75+ adapter : FakeAdapter , message : str = "test"
76+ ) -> FakeMessageEvent :
77+ return FakeMessageEvent (adapter = adapter , type = "message" , message = message )
78+
79+
80+ class BaseTestPlugin (
81+ Generic [StateT , ConfigT ],
82+ Plugin [FakeMessageEvent , StateT , ConfigT ],
83+ ):
84+ @override
85+ async def handle (self ) -> None :
86+ pass
87+
88+ @override
89+ async def rule (self ) -> bool :
90+ return isinstance (self .event , FakeMessageEvent )
0 commit comments