Skip to content

Commit 2ec927c

Browse files
authored
test: 重构测试 (#162)
1 parent c269b6b commit 2ec927c

File tree

18 files changed

+333
-526
lines changed

18 files changed

+333
-526
lines changed

alicebot/plugin.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -110,10 +110,7 @@ def __init_subclass__(
110110

111111
if not hasattr(cls, "Config") and config is not None:
112112
cls.Config = config
113-
if (
114-
cls.__init_state__ is cast(Plugin[Any, Any, Any], Plugin).__init_state__ # type: ignore[comparison-overlap]
115-
and init_state is not None
116-
):
113+
if cls.__init_state__ is Plugin.__init_state__ and init_state is not None:
117114
cls.__init_state__ = lambda _: init_state # type: ignore
118115

119116
@final

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
"vue": "^3.5.13"
3232
},
3333
"devDependencies": {
34+
"@eslint/js": "^9.18.0",
3435
"@types/node": "^22.10.7",
3536
"@unocss/eslint-config": "^65.4.2",
3637
"conventional-changelog-cli": "^5.0.0",

pnpm-lock.yaml

Lines changed: 9 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ dev-dependencies = [
6868
"tomlkit>=0.13",
6969
# test
7070
"pytest>=8",
71+
"pytest-mock>=3",
7172
"pytest-xdist>=3",
7273
"pytest-cov>=5",
7374
]

tests/bad_plugins/plugin_error_ext.txt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
from typing import Any
2-
31
from alicebot import Plugin
42

53

6-
class Plugin1(Plugin[Any, None, None]):
4+
class Plugin1(Plugin):
75
async def handle(self) -> None:
86
pass
97

tests/fake_adapter.py

Lines changed: 41 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,29 @@
11
import inspect
22
from collections.abc import Awaitable
3-
from typing import Any, Callable, ClassVar, Optional, Union
3+
from typing import Any, Callable, Generic, Optional, Union
44
from typing_extensions import override
55

66
from anyio.lowlevel import checkpoint
77

88
from 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

1121
class 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

5158
class 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)

tests/plugins/plugin1.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from typing import Any
21
from typing_extensions import override
32

43
from alicebot import Plugin
54

65

7-
class Plugin1(Plugin[Any, None, None]):
6+
class Plugin1(Plugin):
87
@override
98
async def handle(self) -> None:
109
pass

tests/plugins/plugin2/__init__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
1-
from typing import Any
21
from typing_extensions import override
32

43
from alicebot import Plugin
54

65

7-
class Plugin2(Plugin[Any, None, None]):
6+
class Plugin2(Plugin):
87
@override
98
async def handle(self) -> None:
109
pass

tests/test_adapter/test_adapter.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ def test_adapter_raise_error(bot: Bot) -> None:
3030
class TestAdapter(Adapter[Event[Any], None]):
3131
@override
3232
async def run(self) -> None:
33-
"""运行适配器。"""
3433
self.bot.exit()
3534
raise RuntimeError
3635

tests/test_bot.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,20 @@
1+
from pytest_mock import MockerFixture
2+
13
from alicebot import Bot
24

35

4-
def test_bot_restart() -> None:
5-
flag = False
6+
def test_bot_restart(mocker: MockerFixture) -> None:
7+
mock = mocker.AsyncMock()
68

79
async def bot_run_hook(bot: Bot) -> None:
8-
nonlocal flag
9-
if flag:
10+
if mock.called:
1011
bot.exit()
1112
return
13+
await mock()
1214
bot.restart()
13-
flag = True
1415

1516
bot = Bot()
17+
spy = mocker.spy(bot, "restart")
1618
bot.bot_run_hook(bot_run_hook)
1719
bot.run()
18-
assert flag
20+
spy.assert_called_once()

0 commit comments

Comments
 (0)