from __future__ import annotations from unittest.mock import MagicMock import pytest from yuxi.channels.adapters.wechat.session import ( build_session_route, get_session_metadata, resolve_chat_type, ) from yuxi.channels.models import ( ChannelIdentity, ChannelMessage, ChannelType, ChatType, EventType, MessageType, ) def _make_message(chat_type="direct", wechat_mode="personal", channel_user_id="u1", channel_chat_id="") -> ChannelMessage: return ChannelMessage( identity=ChannelIdentity( channel_id="wechat_test", channel_type=ChannelType.WECHAT, channel_user_id=channel_user_id, channel_chat_id=channel_chat_id, ), content="test", chat_type=ChatType.DIRECT if chat_type == "direct" else ChatType.GROUP, metadata={"wechat_mode": wechat_mode, "chat_type": chat_type}, ) class TestBuildSessionRoute: def test_direct_personal_route(self): msg = _make_message(chat_type="direct", wechat_mode="personal", channel_user_id="user001") route = build_session_route(msg, "1") assert route == "agent:1:wechat:personal:direct:user001" def test_direct_wecom_route(self): msg = _make_message(chat_type="direct", wechat_mode="wecom", channel_user_id="u_wecom") route = build_session_route(msg, "5") assert route == "agent:5:wechat:wecom:direct:u_wecom" def test_group_personal_route(self): msg = _make_message(chat_type="group", wechat_mode="personal", channel_chat_id="group789") route = build_session_route(msg, "2") assert route == "agent:2:wechat:personal:group:group789" def test_group_wecom_route(self): msg = _make_message(chat_type="group", wechat_mode="wecom", channel_chat_id="ww_group") route = build_session_route(msg, "3") assert route == "agent:3:wechat:wecom:group:ww_group" def test_custom_default_agent(self): msg = _make_message(channel_user_id="test_user") route = build_session_route(msg, "42") assert route.startswith("agent:42:") def test_mp_mode_route(self): msg = _make_message(chat_type="direct", wechat_mode="mp", channel_user_id="openid_123") route = build_session_route(msg, "1") assert route == "agent:1:wechat:mp:direct:openid_123" class TestGetSessionMetadata: def test_basic_metadata(self): msg = _make_message( chat_type="direct", wechat_mode="personal", channel_user_id="u1", channel_chat_id="c1", ) meta = get_session_metadata(msg) assert meta["chat_type"] == "direct" assert meta["wechat_mode"] == "personal" assert meta["channel_user_id"] == "u1" assert meta["channel_chat_id"] == "c1" def test_group_metadata(self): msg = _make_message( chat_type="group", wechat_mode="wecom", channel_user_id="u2", channel_chat_id="g999", ) meta = get_session_metadata(msg) assert meta["chat_type"] == "group" assert meta["wechat_mode"] == "wecom" def test_metadata_defaults(self): msg = ChannelMessage( identity=ChannelIdentity( channel_id="wechat_test", channel_type=ChannelType.WECHAT, channel_user_id="u", channel_chat_id="", ), content="test", metadata={}, ) meta = get_session_metadata(msg) assert meta["chat_type"] == "direct" assert meta["wechat_mode"] == "personal" class TestResolveChatType: def test_direct_chat_type(self): msg = _make_message(chat_type="direct") assert resolve_chat_type(msg) == ChatType.DIRECT def test_group_chat_type(self): msg = _make_message(chat_type="group") assert resolve_chat_type(msg) == ChatType.GROUP def test_unknown_defaults_to_direct(self): msg = ChannelMessage( identity=ChannelIdentity( channel_id="wechat_test", channel_type=ChannelType.WECHAT, channel_user_id="u", channel_chat_id="", ), content="test", metadata={}, ) assert resolve_chat_type(msg) == ChatType.DIRECT