Beispiel #1
0
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")])
Beispiel #2
0
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")
Beispiel #3
0
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
Beispiel #4
0
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()
Beispiel #5
0
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
Beispiel #6
0
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"}}]}}'
    )
Beispiel #7
0
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
Beispiel #8
0
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]"
Beispiel #9
0
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]")
Beispiel #10
0
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
Beispiel #11
0
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())
Beispiel #12
0
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
Beispiel #13
0
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())
Beispiel #14
0
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]"
Beispiel #15
0
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
Beispiel #16
0
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()
Beispiel #17
0
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])