def test_message_add(): Message = make_fake_message() MessageSegment = Message.get_segment_class() assert (Message([MessageSegment.text("text")]) + MessageSegment.text("text")) == Message( [MessageSegment.text("text"), MessageSegment.text("text")]) assert Message([MessageSegment.text("text")]) + "text" == Message( [MessageSegment.text("text"), MessageSegment.text("text")]) assert (Message([MessageSegment.text("text")]) + Message([MessageSegment.text("text")])) == Message( [MessageSegment.text("text"), MessageSegment.text("text")]) assert "text" + Message([MessageSegment.text("text")]) == Message( [MessageSegment.text("text"), MessageSegment.text("text")]) msg = Message([MessageSegment.text("text")]) msg += MessageSegment.text("text") assert msg == Message( [MessageSegment.text("text"), MessageSegment.text("text")])
def test_message_injection(): Message = make_fake_message() template = Message.template("{name}Is Bad") message = template.format(name="[fake:image]") assert message.extract_plain_text() == escape_text("[fake:image]Is Bad")
def test_message_getitem(): Message = make_fake_message() MessageSegment = Message.get_segment_class() message = Message([ MessageSegment.text("test"), MessageSegment.image("test2"), MessageSegment.image("test3"), MessageSegment.text("test4"), ]) assert message[0] == MessageSegment.text("test") assert message[0:2] == Message( [MessageSegment.text("test"), MessageSegment.image("test2")]) assert message["image"] == Message( [MessageSegment.image("test2"), MessageSegment.image("test3")]) assert message["image", 0] == MessageSegment.image("test2") assert message["image", 0:2] == message["image"] assert message.index(message[0]) == 0 assert message.index("image") == 1 assert message.get("image") == message["image"] assert message.get("image", 114514) == message["image"] assert message.get("image", 1) == Message([message["image", 0]]) assert message.count("image") == 2
async def test_weather(app: App): from examples.weather import weather from utils import make_fake_event, make_fake_message # 将此处的 make_fake_message() 替换为你要发送的平台消息 Message 类型 Message = make_fake_message() async with app.test_matcher(weather) as ctx: bot = ctx.create_bot() msg = Message("/天气 上海") # 将此处的 make_fake_event() 替换为你要发送的平台事件 Event 类型 event = make_fake_event(_message=msg, _to_me=True)() ctx.receive_event(bot, event) ctx.should_call_send(event, "上海的天气是...", True) ctx.should_finished() async with app.test_matcher(weather) as ctx: bot = ctx.create_bot() msg = Message("/天气 南京") # 将此处的 make_fake_event() 替换为你要发送的平台事件 Event 类型 event = make_fake_event(_message=msg, _to_me=True)() ctx.receive_event(bot, event) ctx.should_call_send(event, Message("你想查询的城市 南京 暂不支持,请重新输入!"), True) ctx.should_rejected() msg = Message("北京") event = make_fake_event(_message=msg)() ctx.receive_event(bot, event) ctx.should_call_send(event, "北京的天气是...", True) ctx.should_finished() async with app.test_matcher(weather) as ctx: bot = ctx.create_bot() msg = Message("/天气") # 将此处的 make_fake_event() 替换为你要发送的平台事件 Event 类型 event = make_fake_event(_message=msg, _to_me=True)() ctx.receive_event(bot, event) ctx.should_call_send(event, "你想查询哪个城市的天气呢?", True) msg = Message("杭州") event = make_fake_event(_message=msg)() ctx.receive_event(bot, event) ctx.should_call_send(event, Message("你想查询的城市 杭州 暂不支持,请重新输入!"), True) ctx.should_rejected() msg = Message("北京") event = make_fake_event(_message=msg)() ctx.receive_event(bot, event) ctx.should_call_send(event, "北京的天气是...", True) ctx.should_finished()
def test_message_validate(): Message = make_fake_message() MessageSegment = Message.get_segment_class() Message_ = make_fake_message() assert parse_obj_as(Message, Message([])) == Message([]) try: parse_obj_as(Message, Message_([])) assert False except ValidationError: assert True assert parse_obj_as(Message, "text") == Message([MessageSegment.text("text")]) assert parse_obj_as(Message, { "type": "text", "data": { "text": "text" } }) == Message([MessageSegment.text("text")]) assert parse_obj_as( Message, [ MessageSegment.text("text"), { "type": "text", "data": { "text": "text" } } ], ) == Message([MessageSegment.text("text"), MessageSegment.text("text")]) try: parse_obj_as(Message, object()) assert False except ValidationError: assert True
def test_dataclass_encoder(): from nonebot.utils import DataclassEncoder simple = json.dumps("123", cls=DataclassEncoder) assert simple == '"123"' Message = make_fake_message() MessageSegment = Message.get_segment_class() ms = MessageSegment.nested(Message(MessageSegment.text("text"))) s = json.dumps(ms, cls=DataclassEncoder) assert ( s == '{"type": "node", "data": {"content": [{"type": "text", "data": {"text": "text"}}]}}' )
def test_segment_validate(): Message = make_fake_message() MessageSegment = Message.get_segment_class() assert parse_obj_as(MessageSegment, { "type": "text", "data": { "text": "text" } }) == MessageSegment.text("text") try: parse_obj_as(MessageSegment, "some str") assert False except ValidationError: assert True
def test_message_template(): from nonebot.adapters import MessageTemplate Message = make_fake_message() template = MessageTemplate("{a:custom}{b:text}{c:image}", Message) @template.add_format_spec def custom(input: str) -> str: return input + "-custom!" formatted = template.format(a="test", b="test", c="https://example.com/test") assert formatted.extract_plain_text() == "test-custom!test" assert str(formatted) == "test-custom!test[fake:image]"
def test_rich_template_message(): Message = make_fake_message() MS = Message.get_segment_class() pic1, pic2, pic3 = ( MS.image("file:///pic1.jpg"), MS.image("file:///pic2.jpg"), MS.image("file:///pic3.jpg"), ) template = Message.template("{}{}" + pic2 + "{}") result = template.format(pic1, "[fake:image]", pic3) assert result["image"] == Message([pic1, pic2, pic3]) assert str(result) == ("[fake:image]" + escape_text("[fake:image]") + "[fake:image]" + "[fake:image]")
async def test_keyword( app: App, kws: Tuple[str, ...], type: str, text: str, expected: bool, ): from nonebot.rule import KeywordsRule, keyword test_keyword = keyword(*kws) dependent = list(test_keyword.checkers)[0] checker = dependent.call assert isinstance(checker, KeywordsRule) assert checker.keywords == kws message = make_fake_message()(text) event = make_fake_event(_type=type, _message=message)() assert await dependent(event=event) == expected
async def test_event(app: App, load_plugin): from nonebot.params import EventParam, DependParam from plugins.param.param_event import ( event, event_type, event_to_me, event_message, event_plain_text, ) fake_message = make_fake_message()("text") fake_event = make_fake_event(_message=fake_message)() async with app.test_dependent(event, allow_types=[EventParam]) as ctx: ctx.pass_params(event=fake_event) ctx.should_return(fake_event) async with app.test_dependent(event_type, allow_types=[EventParam, DependParam]) as ctx: ctx.pass_params(event=fake_event) ctx.should_return(fake_event.get_type()) async with app.test_dependent(event_message, allow_types=[EventParam, DependParam]) as ctx: ctx.pass_params(event=fake_event) ctx.should_return(fake_event.get_message()) async with app.test_dependent(event_plain_text, allow_types=[EventParam, DependParam]) as ctx: ctx.pass_params(event=fake_event) ctx.should_return(fake_event.get_plaintext()) async with app.test_dependent(event_to_me, allow_types=[EventParam, DependParam]) as ctx: ctx.pass_params(event=fake_event) ctx.should_return(fake_event.is_tome())
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
async def test_arg(app: App, load_plugin): from nonebot.matcher import Matcher from nonebot.params import ArgParam from plugins.param.param_arg import arg, arg_str, arg_plain_text matcher = Matcher() message = make_fake_message()("text") matcher.set_arg("key", message) async with app.test_dependent(arg, allow_types=[ArgParam]) as ctx: ctx.pass_params(matcher=matcher) ctx.should_return(message) async with app.test_dependent(arg_str, allow_types=[ArgParam]) as ctx: ctx.pass_params(matcher=matcher) ctx.should_return(str(message)) async with app.test_dependent(arg_plain_text, allow_types=[ArgParam]) as ctx: ctx.pass_params(matcher=matcher) ctx.should_return(message.extract_plain_text())
def test_template_message(): Message = make_fake_message() template = Message.template("{a:custom}{b:text}{c:image}") @template.add_format_spec def custom(input: str) -> str: return input + "-custom!" try: template.add_format_spec(custom) except ValueError: pass else: raise AssertionError("Should raise ValueError") format_args = {"a": "custom", "b": "text", "c": "https://example.com/test"} formatted = template.format(**format_args) assert template.format_map(format_args) == formatted assert formatted.extract_plain_text() == "custom-custom!text" assert str(formatted) == "custom-custom!text[fake:image]"
def test_segment(): Message = make_fake_message() MessageSegment = Message.get_segment_class() assert len(MessageSegment.text("text")) == 4 assert MessageSegment.text("text") != MessageSegment.text("other") assert MessageSegment.text("text").get("data") == {"text": "text"} assert list(MessageSegment.text("text").keys()) == ["type", "data"] assert list( MessageSegment.text("text").values()) == ["text", { "text": "text" }] assert list(MessageSegment.text("text").items()) == [ ("type", "text"), ("data", { "text": "text" }), ] origin = MessageSegment.text("text") copy = origin.copy() assert origin is not copy assert origin == copy
async def test_matcher(app: App, load_plugin): from plugins.matcher.matcher_process import ( test_got, test_handle, test_preset, test_combine, test_receive, test_overload, ) message = make_fake_message()("text") event = make_fake_event(_message=message)() message_next = make_fake_message()("text_next") event_next = make_fake_event(_message=message_next)() assert len(test_handle.handlers) == 1 async with app.test_matcher(test_handle) as ctx: bot = ctx.create_bot() ctx.receive_event(bot, event) ctx.should_call_send(event, "send", "result", at_sender=True) ctx.should_finished() assert len(test_got.handlers) == 1 async with app.test_matcher(test_got) as ctx: bot = ctx.create_bot() ctx.receive_event(bot, event) ctx.should_call_send(event, "prompt key1", "result1") ctx.receive_event(bot, event) ctx.should_call_send(event, "prompt key2", "result2") ctx.receive_event(bot, event) ctx.should_call_send(event, "reject", "result3", at_sender=True) ctx.should_rejected() ctx.receive_event(bot, event_next) assert len(test_receive.handlers) == 1 async with app.test_matcher(test_receive) as ctx: bot = ctx.create_bot() ctx.receive_event(bot, event) ctx.receive_event(bot, event) ctx.receive_event(bot, event) ctx.should_call_send(event, "pause", "result", at_sender=True) ctx.should_paused() assert len(test_receive.handlers) == 1 async with app.test_matcher(test_combine) as ctx: bot = ctx.create_bot() ctx.receive_event(bot, event) ctx.receive_event(bot, event) ctx.receive_event(bot, event) ctx.should_rejected() ctx.receive_event(bot, event_next) ctx.should_rejected() ctx.receive_event(bot, event_next) ctx.should_rejected() ctx.receive_event(bot, event_next) assert len(test_preset.handlers) == 2 async with app.test_matcher(test_preset) as ctx: bot = ctx.create_bot() ctx.receive_event(bot, event) ctx.receive_event(bot, event) ctx.should_rejected() ctx.receive_event(bot, event_next) assert len(test_overload.handlers) == 2 async with app.test_matcher(test_overload) as ctx: bot = ctx.create_bot() ctx.receive_event(bot, event) ctx.should_finished()
async def test_state(app: App, load_plugin): from nonebot.params import StateParam, DependParam from nonebot.consts import ( CMD_KEY, PREFIX_KEY, REGEX_DICT, SHELL_ARGS, SHELL_ARGV, CMD_ARG_KEY, RAW_CMD_KEY, REGEX_GROUP, REGEX_MATCHED, ) from plugins.param.param_state import ( state, command, regex_dict, command_arg, raw_command, regex_group, regex_matched, shell_command_args, shell_command_argv, ) fake_message = make_fake_message()("text") fake_state = { PREFIX_KEY: { CMD_KEY: ("cmd", ), RAW_CMD_KEY: "/cmd", CMD_ARG_KEY: fake_message }, SHELL_ARGV: ["-h"], SHELL_ARGS: { "help": True }, REGEX_MATCHED: "[cq:test,arg=value]", REGEX_GROUP: ("test", "arg=value"), REGEX_DICT: { "type": "test", "arg": "value" }, } async with app.test_dependent(state, allow_types=[StateParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state) async with app.test_dependent(command, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[PREFIX_KEY][CMD_KEY]) async with app.test_dependent(raw_command, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[PREFIX_KEY][RAW_CMD_KEY]) async with app.test_dependent(command_arg, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[PREFIX_KEY][CMD_ARG_KEY]) async with app.test_dependent(shell_command_argv, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[SHELL_ARGV]) async with app.test_dependent(shell_command_args, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[SHELL_ARGS]) async with app.test_dependent(regex_matched, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[REGEX_MATCHED]) async with app.test_dependent(regex_group, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[REGEX_GROUP]) async with app.test_dependent(regex_dict, allow_types=[StateParam, DependParam]) as ctx: ctx.pass_params(state=fake_state) ctx.should_return(fake_state[REGEX_DICT])