test: add coverage for from_user=None DM fallback

Tests the three cases:
- DM with from_user=None: user_id falls back to chat.id
- Group with from_user=None: user_id stays None (safe default)
- DM with from_user present: user_id uses from_user.id (no regression)
This commit is contained in:
Teknium 2026-04-08 02:41:57 -07:00 committed by Teknium
parent 1a9a2d7fe8
commit aa5f89d3ea

View file

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