add rule test cases

This commit is contained in:
yanyongyu 2022-01-05 18:29:11 +08:00
parent 7f54468868
commit e39539a3be
5 changed files with 586 additions and 484 deletions

View File

@ -446,7 +446,7 @@ class Matcher(metaclass=MatcherMeta):
return return
if matcher.get_receive(id): if matcher.get_receive(id):
return return
raise RejectedException await matcher.reject()
_parameterless = [params.Depends(_receive), *(parameterless or [])] _parameterless = [params.Depends(_receive), *(parameterless or [])]
@ -490,9 +490,7 @@ class Matcher(metaclass=MatcherMeta):
return return
if matcher.get_arg(key): if matcher.get_arg(key):
return return
if prompt is not None: await matcher.reject(prompt)
await matcher.send(prompt)
raise RejectedException
_parameterless = [ _parameterless = [
params.Depends(_key_getter), params.Depends(_key_getter),
@ -579,7 +577,9 @@ class Matcher(metaclass=MatcherMeta):
@classmethod @classmethod
async def reject( async def reject(
cls, prompt: Optional[Union[str, Message, MessageSegment]] = None, **kwargs cls,
prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
**kwargs,
) -> NoReturn: ) -> NoReturn:
""" """
:说明: :说明:
@ -600,7 +600,7 @@ class Matcher(metaclass=MatcherMeta):
async def reject_arg( async def reject_arg(
cls, cls,
key: str, key: str,
prompt: Optional[Union[str, Message, MessageSegment]] = None, prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
**kwargs, **kwargs,
) -> NoReturn: ) -> NoReturn:
""" """
@ -625,7 +625,7 @@ class Matcher(metaclass=MatcherMeta):
async def reject_receive( async def reject_receive(
cls, cls,
id: str = "", id: str = "",
prompt: Optional[Union[str, Message, MessageSegment]] = None, prompt: Optional[Union[str, Message, MessageSegment, MessageTemplate]] = None,
**kwargs, **kwargs,
) -> NoReturn: ) -> NoReturn:
""" """

View File

@ -1,3 +1,3 @@
DEBUG=true LOG_LEVEL=TRACE
NICKNAME=["test"] NICKNAME=["test"]
CONFIG_FROM_ENV= CONFIG_FROM_ENV=

View File

@ -129,3 +129,35 @@ async def test_permission_updater(app: App, load_plugin):
matcher = test_custom_updater() matcher = test_custom_updater()
new_perm = await matcher.update_permission(bot, event) new_perm = await matcher.update_permission(bot, event)
assert new_perm is default_permission assert new_perm is default_permission
@pytest.mark.asyncio
async def test_run(app: App):
from nonebot.matcher import Matcher, matchers
assert not matchers
event = make_fake_event()()
async def reject():
await Matcher.reject()
test_reject = Matcher.new(handlers=[reject])
async with app.test_api() as ctx:
bot = ctx.create_bot()
await test_reject().run(bot, event, {})
assert len(matchers[0]) == 1
assert len(matchers[0][0].handlers) == 1
del matchers[0]
async def pause():
await Matcher.pause()
test_pause = Matcher.new(handlers=[pause])
async with app.test_api() as ctx:
bot = ctx.create_bot()
await test_pause().run(bot, event, {})
assert len(matchers[0]) == 1
assert len(matchers[0][0].handlers) == 0

View File

@ -1,11 +1,81 @@
from typing import Tuple, Union
import pytest import pytest
from nonebug import App from nonebug import App
from utils import make_fake_event, make_fake_message
@pytest.mark.asyncio
@pytest.mark.parametrize(
"msg,ignorecase,type,text,expected",
[
("prefix", False, "message", "prefix_", True),
("prefix", False, "message", "Prefix_", False),
("prefix", True, "message", "prefix_", True),
("prefix", True, "message", "Prefix_", True),
],
)
async def test_startswith(
app: App,
msg: Union[str, Tuple[str, ...]],
ignorecase: bool,
type: str,
text: str,
expected: bool,
):
from nonebot.rule import StartswithRule, startswith
test_startswith = startswith(msg, ignorecase)
dependent = list(test_startswith.checkers)[0]
checker = dependent.call
assert isinstance(checker, StartswithRule)
assert checker.msg == (msg,) if isinstance(msg, str) else msg
assert checker.ignorecase == ignorecase
message = make_fake_message()(text)
event = make_fake_event(_type=type, _message=message)()
assert await dependent(event=event) == expected
@pytest.mark.asyncio
@pytest.mark.parametrize(
"msg,ignorecase,type,text,expected",
[
("suffix", False, "message", "_suffix", True),
("suffix", False, "message", "_Suffix", False),
("suffix", True, "message", "_suffix", True),
("suffix", True, "message", "_Suffix", True),
],
)
async def test_endswith(
app: App,
msg: Union[str, Tuple[str, ...]],
ignorecase: bool,
type: str,
text: str,
expected: bool,
):
from nonebot.rule import EndswithRule, endswith
test_endswith = endswith(msg, ignorecase)
dependent = list(test_endswith.checkers)[0]
checker = dependent.call
assert isinstance(checker, EndswithRule)
assert checker.msg == (msg,) if isinstance(msg, str) else msg
assert checker.ignorecase == ignorecase
message = make_fake_message()(text)
event = make_fake_event(_type=type, _message=message)()
assert await dependent(event=event) == expected
@pytest.mark.asyncio @pytest.mark.asyncio
async def test_command(app: App): async def test_command(app: App):
from nonebot.rule import CommandRule, command
from nonebot.consts import CMD_KEY, PREFIX_KEY from nonebot.consts import CMD_KEY, PREFIX_KEY
from nonebot.rule import Rule, CommandRule, command
test_command = command("help") test_command = command("help")
dependent = list(test_command.checkers)[0] dependent = list(test_command.checkers)[0]

950
yarn.lock

File diff suppressed because it is too large Load Diff