| """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 |
|
|