129 lines
4.3 KiB
Python
129 lines
4.3 KiB
Python
|
|
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
|