import pytest from models.events.factory import EventFactory, EventType from models.events.message import GroupMessageEvent, PrivateMessageEvent from models.events.notice import GroupIncreaseNoticeEvent from models.events.request import FriendRequestEvent from models.events.meta import HeartbeatEvent from models.message import MessageSegment class TestEventFactory: def test_create_group_message_event_list(self): """测试创建群消息事件 (message 为列表格式)""" data = { "post_type": "message", "message_type": "group", "time": 1600000000, "self_id": 123456, "sub_type": "normal", "message_id": 1001, "user_id": 111111, "group_id": 222222, "message": [ {"type": "text", "data": {"text": "Hello"}} ], "raw_message": "Hello", "font": 0, "sender": { "user_id": 111111, "nickname": "User", "role": "member" } } event = EventFactory.create_event(data) assert isinstance(event, GroupMessageEvent) assert event.group_id == 222222 assert len(event.message) == 1 assert event.message[0].type == "text" assert event.message[0].data["text"] == "Hello" def test_create_group_message_event_str(self): """测试创建群消息事件 (message 为字符串格式)""" data = { "post_type": "message", "message_type": "group", "time": 1600000000, "self_id": 123456, "sub_type": "normal", "message_id": 1002, "user_id": 111111, "group_id": 222222, "message": "Hello World", "raw_message": "Hello World", "font": 0, "sender": { "user_id": 111111, "nickname": "User" } } event = EventFactory.create_event(data) assert isinstance(event, GroupMessageEvent) assert len(event.message) == 1 assert event.message[0].type == "text" assert event.message[0].data["text"] == "Hello World" def test_create_private_message_event(self): """测试创建私聊消息事件""" data = { "post_type": "message", "message_type": "private", "time": 1600000000, "self_id": 123456, "sub_type": "friend", "message_id": 2001, "user_id": 333333, "message": "Private Msg", "raw_message": "Private Msg", "font": 0, "sender": { "user_id": 333333, "nickname": "Friend" } } event = EventFactory.create_event(data) assert isinstance(event, PrivateMessageEvent) assert event.user_id == 333333 def test_create_notice_event(self): """测试创建通知事件 (群成员增加)""" data = { "post_type": "notice", "notice_type": "group_increase", "sub_type": "approve", "group_id": 222222, "operator_id": 444444, "user_id": 555555, "time": 1600000000, "self_id": 123456 } event = EventFactory.create_event(data) assert isinstance(event, GroupIncreaseNoticeEvent) assert event.group_id == 222222 assert event.user_id == 555555 def test_create_request_event(self): """测试创建请求事件 (加好友)""" data = { "post_type": "request", "request_type": "friend", "user_id": 666666, "comment": "Add me", "flag": "flag_123", "time": 1600000000, "self_id": 123456 } event = EventFactory.create_event(data) assert isinstance(event, FriendRequestEvent) assert event.user_id == 666666 assert event.comment == "Add me" def test_create_meta_event(self): """测试创建元事件 (心跳)""" data = { "post_type": "meta_event", "meta_event_type": "heartbeat", "time": 1600000000, "self_id": 123456, "status": {"online": True, "good": True}, "interval": 5000 } event = EventFactory.create_event(data) assert isinstance(event, HeartbeatEvent) assert event.interval == 5000 def test_unknown_event_type(self): """测试未知事件类型""" data = { "post_type": "unknown_type", "time": 1600000000, "self_id": 123456 } with pytest.raises(ValueError, match="Unknown event type"): EventFactory.create_event(data)