fix max-bot, add tests
This commit is contained in:
parent
7abbaf7e7a
commit
2ad1438e1c
17 changed files with 1621 additions and 494 deletions
154
tests/adapter/max/test_converter.py
Normal file
154
tests/adapter/max/test_converter.py
Normal file
|
|
@ -0,0 +1,154 @@
|
|||
from __future__ import annotations
|
||||
|
||||
import pytest
|
||||
|
||||
from adapter.max.converter import (
|
||||
attachment_from_max_dict,
|
||||
collect_max_attachments,
|
||||
incoming_from_message_callback_payload,
|
||||
incoming_from_text_commands,
|
||||
)
|
||||
from core.protocol import Attachment, IncomingCallback, IncomingCommand, IncomingMessage
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"text,expect_type",
|
||||
[
|
||||
("Hello", IncomingMessage),
|
||||
(" plain ", IncomingMessage),
|
||||
],
|
||||
)
|
||||
def test_plain_text_to_message(text, expect_type):
|
||||
r = incoming_from_text_commands(
|
||||
text=text,
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=[],
|
||||
)
|
||||
assert type(r) is expect_type
|
||||
assert r.text == text
|
||||
|
||||
|
||||
def test_slash_command_split():
|
||||
r = incoming_from_text_commands(
|
||||
text="/new title here",
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=[],
|
||||
)
|
||||
assert isinstance(r, IncomingCommand)
|
||||
assert r.command == "new"
|
||||
assert r.args == ["title", "here"]
|
||||
|
||||
|
||||
def test_slash_command_no_args():
|
||||
r = incoming_from_text_commands(
|
||||
text="/help",
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=[],
|
||||
)
|
||||
assert isinstance(r, IncomingCommand)
|
||||
assert r.command == "help"
|
||||
assert r.args == []
|
||||
|
||||
|
||||
def test_bang_prefix_is_plain_message_not_command():
|
||||
"""MAX: только / считается командой."""
|
||||
r = incoming_from_text_commands(
|
||||
text="!help",
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=[],
|
||||
)
|
||||
assert isinstance(r, IncomingMessage)
|
||||
assert r.text == "!help"
|
||||
|
||||
|
||||
def test_yes_no_callbacks():
|
||||
yes = incoming_from_text_commands(
|
||||
text="/yes",
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=[],
|
||||
)
|
||||
assert isinstance(yes, IncomingCallback)
|
||||
assert yes.action == "confirm"
|
||||
|
||||
no = incoming_from_text_commands(
|
||||
text="/NO",
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=[],
|
||||
)
|
||||
assert isinstance(no, IncomingCallback)
|
||||
assert no.action == "cancel"
|
||||
|
||||
|
||||
def test_incoming_message_keeps_attachments():
|
||||
at = [Attachment(type="document", filename="a.txt")]
|
||||
r = incoming_from_text_commands(
|
||||
text="see file",
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc-1",
|
||||
attachments=at,
|
||||
)
|
||||
assert isinstance(r, IncomingMessage)
|
||||
assert r.attachments == at
|
||||
|
||||
|
||||
def test_message_callback_known_actions():
|
||||
c = incoming_from_message_callback_payload(
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc",
|
||||
payload_raw="confirm",
|
||||
callback_message_id="mid",
|
||||
)
|
||||
assert c is not None
|
||||
assert isinstance(c, IncomingCallback)
|
||||
assert c.action == "confirm"
|
||||
assert c.payload.get("message_id") == "mid"
|
||||
|
||||
|
||||
def test_message_callback_unknown_becomes_max_callback():
|
||||
c = incoming_from_message_callback_payload(
|
||||
max_user_id="10",
|
||||
platform_chat_id="pc",
|
||||
payload_raw="my_payload",
|
||||
callback_message_id=None,
|
||||
)
|
||||
assert c is not None
|
||||
assert c.action == "max_callback"
|
||||
assert c.payload["payload"] == "my_payload"
|
||||
|
||||
|
||||
def test_attachment_from_max_file():
|
||||
parsed = attachment_from_max_dict(
|
||||
{
|
||||
"type": "file",
|
||||
"payload": {
|
||||
"url": "https://cdn.example/f",
|
||||
"filename": "doc.pdf",
|
||||
"token": "tok",
|
||||
},
|
||||
}
|
||||
)
|
||||
assert parsed is not None
|
||||
att, raw = parsed
|
||||
assert att.filename == "doc.pdf"
|
||||
assert att.type == "document"
|
||||
assert att.url == "https://cdn.example/f"
|
||||
assert raw.get("_download_token_hint") == "tok"
|
||||
|
||||
|
||||
def test_collect_max_attachments_skips_unknown():
|
||||
core, raw = collect_max_attachments(
|
||||
{
|
||||
"attachments": [
|
||||
{"type": "file", "payload": {"url": "u", "filename": "x.bin"}},
|
||||
{"type": "sticker", "payload": {}},
|
||||
]
|
||||
}
|
||||
)
|
||||
assert len(core) == len(raw) == 1
|
||||
assert core[0].filename == "x.bin"
|
||||
Loading…
Add table
Add a link
Reference in a new issue