test
This commit is contained in:
@@ -69,13 +69,22 @@ class _FakeGatewayCapability:
|
|||||||
class _FakeNapCatQueryService:
|
class _FakeNapCatQueryService:
|
||||||
"""用于驱动 NapCat 入站编解码测试的查询服务替身。"""
|
"""用于驱动 NapCat 入站编解码测试的查询服务替身。"""
|
||||||
|
|
||||||
def __init__(self, forward_payloads: Dict[str, Any] | None = None) -> None:
|
def __init__(
|
||||||
|
self,
|
||||||
|
forward_payloads: Dict[str, Any] | None = None,
|
||||||
|
group_member_payloads: Dict[tuple[str, str], Dict[str, Any] | None] | None = None,
|
||||||
|
stranger_payloads: Dict[str, Dict[str, Any] | None] | None = None,
|
||||||
|
) -> None:
|
||||||
"""初始化查询服务替身。
|
"""初始化查询服务替身。
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
forward_payloads: 预置的合并转发响应映射。
|
forward_payloads: 预置的合并转发响应映射。
|
||||||
|
group_member_payloads: 预置的群成员资料映射。
|
||||||
|
stranger_payloads: 预置的陌生人资料映射。
|
||||||
"""
|
"""
|
||||||
self._forward_payloads = forward_payloads or {}
|
self._forward_payloads = forward_payloads or {}
|
||||||
|
self._group_member_payloads = group_member_payloads or {}
|
||||||
|
self._stranger_payloads = stranger_payloads or {}
|
||||||
|
|
||||||
async def download_binary(self, url: str) -> bytes | None:
|
async def download_binary(self, url: str) -> bytes | None:
|
||||||
"""模拟下载远程二进制资源。
|
"""模拟下载远程二进制资源。
|
||||||
@@ -112,6 +121,20 @@ class _FakeNapCatQueryService:
|
|||||||
"""
|
"""
|
||||||
return self._forward_payloads.get(message_id)
|
return self._forward_payloads.get(message_id)
|
||||||
|
|
||||||
|
async def get_group_member_info(
|
||||||
|
self,
|
||||||
|
group_id: str,
|
||||||
|
user_id: str,
|
||||||
|
no_cache: bool = True,
|
||||||
|
) -> Dict[str, Any] | None:
|
||||||
|
"""模拟获取群成员资料。"""
|
||||||
|
del no_cache
|
||||||
|
return self._group_member_payloads.get((group_id, user_id))
|
||||||
|
|
||||||
|
async def get_stranger_info(self, user_id: str) -> Dict[str, Any] | None:
|
||||||
|
"""模拟获取 QQ 昵称资料。"""
|
||||||
|
return self._stranger_payloads.get(user_id)
|
||||||
|
|
||||||
async def get_record_detail(self, file_name: str, file_id: str | None = None) -> Dict[str, Any] | None:
|
async def get_record_detail(self, file_name: str, file_id: str | None = None) -> Dict[str, Any] | None:
|
||||||
"""模拟获取语音详情。
|
"""模拟获取语音详情。
|
||||||
|
|
||||||
@@ -479,6 +502,137 @@ async def test_inbound_codec_parses_nested_inline_forward_content() -> None:
|
|||||||
assert nested_nodes[0]["content"] == [{"type": "text", "data": "内层消息"}]
|
assert nested_nodes[0]["content"] == [{"type": "text", "data": "内层消息"}]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_inbound_codec_resolves_at_to_group_cardname() -> None:
|
||||||
|
"""入站编解码器应优先将 ``at`` 解析为群昵称。"""
|
||||||
|
|
||||||
|
inbound_codec_cls = _load_napcat_inbound_codec_cls()
|
||||||
|
codec = inbound_codec_cls(
|
||||||
|
logger=logging.getLogger("test.napcat_adapter.at_cardname"),
|
||||||
|
query_service=_FakeNapCatQueryService(
|
||||||
|
group_member_payloads={
|
||||||
|
("12345", "1206069534"): {
|
||||||
|
"nickname": "QQ昵称",
|
||||||
|
"card": "群昵称",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
message_dict = await codec.build_message_dict(
|
||||||
|
payload={
|
||||||
|
"message_type": "group",
|
||||||
|
"group_id": "12345",
|
||||||
|
"message_id": "msg-1",
|
||||||
|
"message": [{"type": "at", "data": {"qq": "1206069534"}}],
|
||||||
|
"sender": {"user_id": "10001", "nickname": "发送者"},
|
||||||
|
"time": 1710000000,
|
||||||
|
},
|
||||||
|
self_id="20001",
|
||||||
|
sender_user_id="10001",
|
||||||
|
sender={"user_id": "10001", "nickname": "发送者"},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert message_dict["processed_plain_text"] == "@群昵称"
|
||||||
|
assert message_dict["display_message"] == "@群昵称"
|
||||||
|
assert message_dict["raw_message"] == [
|
||||||
|
{
|
||||||
|
"type": "at",
|
||||||
|
"data": {
|
||||||
|
"target_user_id": "1206069534",
|
||||||
|
"target_user_nickname": "QQ昵称",
|
||||||
|
"target_user_cardname": "群昵称",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_inbound_codec_falls_back_to_qq_nickname_when_group_cardname_is_empty() -> None:
|
||||||
|
"""入站编解码器在群昵称为空时应回退到 QQ 昵称。"""
|
||||||
|
|
||||||
|
inbound_codec_cls = _load_napcat_inbound_codec_cls()
|
||||||
|
codec = inbound_codec_cls(
|
||||||
|
logger=logging.getLogger("test.napcat_adapter.at_nickname"),
|
||||||
|
query_service=_FakeNapCatQueryService(
|
||||||
|
group_member_payloads={
|
||||||
|
("12345", "1206069534"): {
|
||||||
|
"nickname": "QQ昵称",
|
||||||
|
"card": "",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
message_dict = await codec.build_message_dict(
|
||||||
|
payload={
|
||||||
|
"message_type": "group",
|
||||||
|
"group_id": "12345",
|
||||||
|
"message_id": "msg-2",
|
||||||
|
"message": [{"type": "at", "data": {"qq": "1206069534"}}],
|
||||||
|
"sender": {"user_id": "10001", "nickname": "发送者"},
|
||||||
|
"time": 1710000000,
|
||||||
|
},
|
||||||
|
self_id="20001",
|
||||||
|
sender_user_id="10001",
|
||||||
|
sender={"user_id": "10001", "nickname": "发送者"},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert message_dict["processed_plain_text"] == "@QQ昵称"
|
||||||
|
assert message_dict["display_message"] == "@QQ昵称"
|
||||||
|
assert message_dict["raw_message"] == [
|
||||||
|
{
|
||||||
|
"type": "at",
|
||||||
|
"data": {
|
||||||
|
"target_user_id": "1206069534",
|
||||||
|
"target_user_nickname": "QQ昵称",
|
||||||
|
"target_user_cardname": None,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.asyncio
|
||||||
|
async def test_inbound_codec_falls_back_to_stranger_nickname_when_group_profile_is_missing() -> None:
|
||||||
|
"""入站编解码器在群资料缺失时应继续回退到 QQ 昵称。"""
|
||||||
|
|
||||||
|
inbound_codec_cls = _load_napcat_inbound_codec_cls()
|
||||||
|
codec = inbound_codec_cls(
|
||||||
|
logger=logging.getLogger("test.napcat_adapter.at_stranger_nickname"),
|
||||||
|
query_service=_FakeNapCatQueryService(
|
||||||
|
group_member_payloads={("12345", "1206069534"): None},
|
||||||
|
stranger_payloads={"1206069534": {"nickname": "QQ昵称"}},
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
message_dict = await codec.build_message_dict(
|
||||||
|
payload={
|
||||||
|
"message_type": "group",
|
||||||
|
"group_id": "12345",
|
||||||
|
"message_id": "msg-3",
|
||||||
|
"message": [{"type": "at", "data": {"qq": "1206069534"}}],
|
||||||
|
"sender": {"user_id": "10001", "nickname": "发送者"},
|
||||||
|
"time": 1710000000,
|
||||||
|
},
|
||||||
|
self_id="20001",
|
||||||
|
sender_user_id="10001",
|
||||||
|
sender={"user_id": "10001", "nickname": "发送者"},
|
||||||
|
)
|
||||||
|
|
||||||
|
assert message_dict["processed_plain_text"] == "@QQ昵称"
|
||||||
|
assert message_dict["display_message"] == "@QQ昵称"
|
||||||
|
assert message_dict["raw_message"] == [
|
||||||
|
{
|
||||||
|
"type": "at",
|
||||||
|
"data": {
|
||||||
|
"target_user_id": "1206069534",
|
||||||
|
"target_user_nickname": "QQ昵称",
|
||||||
|
"target_user_cardname": None,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.asyncio
|
@pytest.mark.asyncio
|
||||||
async def test_query_service_normalizes_forward_payload_list() -> None:
|
async def test_query_service_normalizes_forward_payload_list() -> None:
|
||||||
"""查询服务应兼容 ``get_forward_msg`` 直接返回节点列表。"""
|
"""查询服务应兼容 ``get_forward_msg`` 直接返回节点列表。"""
|
||||||
|
|||||||
Reference in New Issue
Block a user