5af5ad9e36
* test: add comprehensive tests for message event handling - Add AstrMessageEvent unit tests (688 lines) - Add AstrBotMessage unit tests - Enhance smoke tests with message event scenarios Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com> * fix: improve message type handling and add defensive tests --------- Co-authored-by: whatevertogo <whatevertogo@users.noreply.github.com> Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
269 lines
9.3 KiB
Python
269 lines
9.3 KiB
Python
"""Tests for AstrBotMessage and MessageMember classes."""
|
|
|
|
import time
|
|
from unittest.mock import patch
|
|
|
|
from astrbot.core.message.components import Image, Plain
|
|
from astrbot.core.platform.astrbot_message import AstrBotMessage, Group, MessageMember
|
|
from astrbot.core.platform.message_type import MessageType
|
|
|
|
|
|
class TestMessageMember:
|
|
"""Tests for MessageMember dataclass."""
|
|
|
|
def test_message_member_creation_basic(self):
|
|
"""Test creating a MessageMember with required fields."""
|
|
member = MessageMember(user_id="user123")
|
|
|
|
assert member.user_id == "user123"
|
|
assert member.nickname is None
|
|
|
|
def test_message_member_creation_with_nickname(self):
|
|
"""Test creating a MessageMember with nickname."""
|
|
member = MessageMember(user_id="user123", nickname="TestUser")
|
|
|
|
assert member.user_id == "user123"
|
|
assert member.nickname == "TestUser"
|
|
|
|
def test_message_member_str_with_nickname(self):
|
|
"""Test __str__ method with nickname."""
|
|
member = MessageMember(user_id="user123", nickname="TestUser")
|
|
result = str(member)
|
|
|
|
assert "User ID: user123" in result
|
|
assert "Nickname: TestUser" in result
|
|
|
|
def test_message_member_str_without_nickname(self):
|
|
"""Test __str__ method without nickname."""
|
|
member = MessageMember(user_id="user123")
|
|
result = str(member)
|
|
|
|
assert "User ID: user123" in result
|
|
assert "Nickname: N/A" in result
|
|
|
|
|
|
class TestGroup:
|
|
"""Tests for Group dataclass."""
|
|
|
|
def test_group_creation_basic(self):
|
|
"""Test creating a Group with required fields."""
|
|
group = Group(group_id="group123")
|
|
|
|
assert group.group_id == "group123"
|
|
assert group.group_name is None
|
|
assert group.group_avatar is None
|
|
assert group.group_owner is None
|
|
assert group.group_admins is None
|
|
assert group.members is None
|
|
|
|
def test_group_creation_with_all_fields(self):
|
|
"""Test creating a Group with all fields."""
|
|
members = [MessageMember(user_id="user1"), MessageMember(user_id="user2")]
|
|
group = Group(
|
|
group_id="group123",
|
|
group_name="Test Group",
|
|
group_avatar="http://example.com/avatar.jpg",
|
|
group_owner="owner123",
|
|
group_admins=["admin1", "admin2"],
|
|
members=members,
|
|
)
|
|
|
|
assert group.group_id == "group123"
|
|
assert group.group_name == "Test Group"
|
|
assert group.group_avatar == "http://example.com/avatar.jpg"
|
|
assert group.group_owner == "owner123"
|
|
assert group.group_admins == ["admin1", "admin2"]
|
|
assert group.members == members
|
|
|
|
def test_group_str_with_all_fields(self):
|
|
"""Test __str__ method with all fields."""
|
|
members = [MessageMember(user_id="user1", nickname="User One")]
|
|
group = Group(
|
|
group_id="group123",
|
|
group_name="Test Group",
|
|
group_avatar="http://example.com/avatar.jpg",
|
|
group_owner="owner123",
|
|
group_admins=["admin1"],
|
|
members=members,
|
|
)
|
|
result = str(group)
|
|
|
|
assert "Group ID: group123" in result
|
|
assert "Name: Test Group" in result
|
|
assert "Avatar: http://example.com/avatar.jpg" in result
|
|
assert "Owner ID: owner123" in result
|
|
assert "Admin IDs: ['admin1']" in result
|
|
assert "Members Len: 1" in result
|
|
|
|
def test_group_str_with_minimal_fields(self):
|
|
"""Test __str__ method with minimal fields."""
|
|
group = Group(group_id="group123")
|
|
result = str(group)
|
|
|
|
assert "Group ID: group123" in result
|
|
assert "Name: N/A" in result
|
|
assert "Avatar: N/A" in result
|
|
assert "Owner ID: N/A" in result
|
|
assert "Admin IDs: N/A" in result
|
|
assert "Members Len: 0" in result
|
|
assert "First Member: N/A" in result
|
|
|
|
|
|
class TestAstrBotMessage:
|
|
"""Tests for AstrBotMessage class."""
|
|
|
|
def test_astrbot_message_creation(self):
|
|
"""Test creating an AstrBotMessage."""
|
|
message = AstrBotMessage()
|
|
|
|
assert message.group is None
|
|
assert message.timestamp is not None
|
|
assert isinstance(message.timestamp, int)
|
|
|
|
def test_astrbot_message_timestamp(self):
|
|
"""Test timestamp is set on creation."""
|
|
with patch.object(time, "time", return_value=1234567890):
|
|
message = AstrBotMessage()
|
|
assert message.timestamp == 1234567890
|
|
|
|
def test_astrbot_message_all_attributes(self):
|
|
"""Test setting all attributes on AstrBotMessage."""
|
|
message = AstrBotMessage()
|
|
message.type = MessageType.FRIEND_MESSAGE
|
|
message.self_id = "bot123"
|
|
message.session_id = "session123"
|
|
message.message_id = "msg123"
|
|
message.sender = MessageMember(user_id="user123", nickname="TestUser")
|
|
message.message = [Plain(text="Hello")]
|
|
message.message_str = "Hello"
|
|
message.raw_message = {"raw": "data"}
|
|
|
|
assert message.type == MessageType.FRIEND_MESSAGE
|
|
assert message.self_id == "bot123"
|
|
assert message.session_id == "session123"
|
|
assert message.message_id == "msg123"
|
|
assert message.sender.user_id == "user123"
|
|
assert len(message.message) == 1
|
|
assert message.message_str == "Hello"
|
|
assert message.raw_message == {"raw": "data"}
|
|
|
|
def test_astrbot_message_str(self):
|
|
"""Test __str__ method."""
|
|
message = AstrBotMessage()
|
|
message.type = MessageType.FRIEND_MESSAGE
|
|
message.self_id = "bot123"
|
|
|
|
result = str(message)
|
|
assert "'type'" in result
|
|
assert "'self_id'" in result
|
|
|
|
|
|
class TestAstrBotMessageGroupId:
|
|
"""Tests for AstrBotMessage group_id property."""
|
|
|
|
def test_group_id_returns_empty_when_no_group(self):
|
|
"""Test group_id returns empty string when group is None."""
|
|
message = AstrBotMessage()
|
|
assert message.group_id == ""
|
|
|
|
def test_group_id_returns_group_id_when_group_exists(self):
|
|
"""Test group_id returns the group's id when group exists."""
|
|
message = AstrBotMessage()
|
|
message.group = Group(group_id="group123")
|
|
|
|
assert message.group_id == "group123"
|
|
|
|
def test_group_id_setter_creates_new_group(self):
|
|
"""Test group_id setter creates a new group if none exists."""
|
|
message = AstrBotMessage()
|
|
message.group_id = "new_group123"
|
|
|
|
assert message.group is not None
|
|
assert message.group.group_id == "new_group123"
|
|
|
|
def test_group_id_setter_updates_existing_group(self):
|
|
"""Test group_id setter updates existing group's id."""
|
|
message = AstrBotMessage()
|
|
message.group = Group(group_id="old_group")
|
|
message.group_id = "new_group"
|
|
|
|
assert message.group.group_id == "new_group"
|
|
|
|
def test_group_id_setter_with_none_removes_group(self):
|
|
"""Test group_id setter with None removes the group."""
|
|
message = AstrBotMessage()
|
|
message.group = Group(group_id="group123")
|
|
message.group_id = None
|
|
|
|
assert message.group is None
|
|
|
|
def test_group_id_setter_with_empty_string_removes_group(self):
|
|
"""Test group_id setter with empty string removes the group."""
|
|
message = AstrBotMessage()
|
|
message.group = Group(group_id="group123")
|
|
message.group_id = ""
|
|
|
|
assert message.group is None
|
|
|
|
|
|
class TestAstrBotMessageTypes:
|
|
"""Tests for AstrBotMessage with different message types."""
|
|
|
|
def test_friend_message_type(self):
|
|
"""Test AstrBotMessage with FRIEND_MESSAGE type."""
|
|
message = AstrBotMessage()
|
|
message.type = MessageType.FRIEND_MESSAGE
|
|
|
|
assert message.type == MessageType.FRIEND_MESSAGE
|
|
assert message.type.value == "FriendMessage"
|
|
|
|
def test_group_message_type(self):
|
|
"""Test AstrBotMessage with GROUP_MESSAGE type."""
|
|
message = AstrBotMessage()
|
|
message.type = MessageType.GROUP_MESSAGE
|
|
|
|
assert message.type == MessageType.GROUP_MESSAGE
|
|
assert message.type.value == "GroupMessage"
|
|
|
|
def test_other_message_type(self):
|
|
"""Test AstrBotMessage with OTHER_MESSAGE type."""
|
|
message = AstrBotMessage()
|
|
message.type = MessageType.OTHER_MESSAGE
|
|
|
|
assert message.type == MessageType.OTHER_MESSAGE
|
|
assert message.type.value == "OtherMessage"
|
|
|
|
|
|
class TestAstrBotMessageChain:
|
|
"""Tests for AstrBotMessage message chain."""
|
|
|
|
def test_message_chain_with_plain_text(self):
|
|
"""Test message chain with plain text."""
|
|
message = AstrBotMessage()
|
|
message.message = [Plain(text="Hello world")]
|
|
|
|
assert len(message.message) == 1
|
|
assert isinstance(message.message[0], Plain)
|
|
assert message.message[0].text == "Hello world"
|
|
|
|
def test_message_chain_with_multiple_components(self):
|
|
"""Test message chain with multiple components."""
|
|
message = AstrBotMessage()
|
|
message.message = [
|
|
Plain(text="Hello "),
|
|
Plain(text="world"),
|
|
Image(file="http://example.com/img.jpg"),
|
|
]
|
|
|
|
assert len(message.message) == 3
|
|
assert isinstance(message.message[0], Plain)
|
|
assert isinstance(message.message[1], Plain)
|
|
assert isinstance(message.message[2], Image)
|
|
|
|
def test_message_chain_empty(self):
|
|
"""Test empty message chain."""
|
|
message = AstrBotMessage()
|
|
message.message = []
|
|
|
|
assert len(message.message) == 0
|