diff --git a/tests/gateway/test_dm_topics.py b/tests/gateway/test_dm_topics.py index b9a94c3438..69e9629b23 100644 --- a/tests/gateway/test_dm_topics.py +++ b/tests/gateway/test_dm_topics.py @@ -645,3 +645,54 @@ def test_group_topic_chat_id_int_string_coercion(): assert event.auto_skill == "hermes-agent-dev" assert event.source.chat_topic == "Dev" + + +# ── _build_message_event: from_user=None fallback in DMs ── + + +def test_build_message_event_dm_from_user_none_falls_back_to_chat_id(): + """When from_user is None in a DM, user_id should fall back to chat.id.""" + from gateway.platforms.base import MessageType + + adapter = _make_adapter() + msg = _make_mock_message(chat_id=12345, user_id=42, user_name="Alice") + # Simulate from_user being None (edge case on fresh restart / forwarded msg) + msg.from_user = None + + event = adapter._build_message_event(msg, MessageType.TEXT) + + # Should fall back to chat.id since chat_type is "dm" + assert event.source.user_id == "12345" + assert event.source.user_name == "Alice" # falls back to chat.full_name + + +def test_build_message_event_group_from_user_none_stays_none(): + """When from_user is None in a group, user_id should remain None.""" + from gateway.platforms.base import MessageType + + adapter = _make_adapter() + msg = _make_mock_message( + chat_id=-1001234567890, chat_type=_ChatType.SUPERGROUP, + user_id=42, user_name="Alice" + ) + msg.from_user = None + + event = adapter._build_message_event(msg, MessageType.TEXT) + + # Groups should NOT fall back — anonymous senders stay None + assert event.source.user_id is None + assert event.source.user_name is None + + +def test_build_message_event_dm_from_user_present_uses_user(): + """When from_user is present in a DM, it should be used (no fallback).""" + from gateway.platforms.base import MessageType + + adapter = _make_adapter() + msg = _make_mock_message(chat_id=12345, user_id=99999, user_name="Bob") + + event = adapter._build_message_event(msg, MessageType.TEXT) + + # Normal case — from_user is used directly + assert event.source.user_id == "99999" + assert event.source.user_name == "Bob"