mirror of
https://github.com/AstrBotDevs/AstrBot
synced 2026-07-17 17:51:20 +08:00
* feat: 实现kook适配器响应`@`角色(role)的能力 * refactor: kook适配器处理role时,`At`组件保留`@`角色的名称而不是id * fix: kook适配器处理role时,role_id的判断问题 * refactor: 移除kook适配器中的一个# type: ignore * fix: 修复kook适配器 role mention转换成`At`组件时保留不是角色名称的bug; * unittest: 给kook适配器添加带有role mention的事件消息的单测,并添加消息组件转换判断单测 * unittest: 部分重构test_kook_event.py和test_kook_types.py 单测 * unittest: 添加kook适配器的 `user/me` `user/view` 接口响应数据验证单测 * fix: 修复kook适配器接收频道权限更新消息会报错的bug * fix: 不额外处理kook的道具消息 * fix: 使用async with self._http_client.get * refactor: kook适配器转换文本内容为消息组件时,只strip mention之间的空格 * fix: 修复 role_mention_counter 计数不正确的问题 * fix: 修复kook适配器发送卡片失败的问题;区分两类kook 数据类的to_dict to_json行为 * chore: 添加注释 * refactor: 重构kook适配器的角色缓存功能,使其无锁,性能更好且具备良好的重试机制 * refactor: kook适配器的channel_id 改为 guild_id * feat: kook适配器响应频道角色更新事件时不再清空整个角色id缓存,而是只清理特定频道的角色id缓存 * unittest: 添加kook适配器的update_role事件的数据类验证单测 * refactor: 补上了一些打印的日志消息文本 refactor: 补上了一些打印的日志消息文本 refactor: 补上了一些打印的日志消息文本 * refactor: 修复kook适配器潜在可能的类型问题 * refactor: `clean_roles_cache`重命名为`clear_guild_roles_cache`
176 lines
4.3 KiB
Python
176 lines
4.3 KiB
Python
import json
|
|
|
|
import pytest
|
|
from astrbot.api.platform import PlatformMetadata, Unknown
|
|
from astrbot.core.message.components import (
|
|
Image,
|
|
Plain,
|
|
Video,
|
|
At,
|
|
AtAll,
|
|
BaseMessageComponent,
|
|
Json,
|
|
Reply,
|
|
)
|
|
|
|
|
|
from astrbot.core.platform.sources.kook.kook_event import KookEvent
|
|
from astrbot.core.platform.sources.kook.kook_types import KookMessageType, OrderMessage
|
|
from tests.test_kook.shared import (
|
|
mock_astrbot_message,
|
|
mock_file_message,
|
|
mock_kook_client,
|
|
mock_record_message,
|
|
)
|
|
|
|
|
|
@pytest.mark.asyncio
|
|
@pytest.mark.parametrize(
|
|
"input_message,upload_asset_return, expected_output, expected_error",
|
|
[
|
|
(
|
|
Image("test image"),
|
|
"test image",
|
|
OrderMessage(
|
|
index=1,
|
|
text="test image",
|
|
type=KookMessageType.IMAGE,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
Video("test video"),
|
|
"test video",
|
|
OrderMessage(
|
|
index=1,
|
|
text="test video",
|
|
type=KookMessageType.VIDEO,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
mock_file_message("test file"),
|
|
"test file",
|
|
OrderMessage(
|
|
index=1,
|
|
text="test file",
|
|
type=KookMessageType.FILE,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
mock_record_message("./tests/file.wav"),
|
|
"./tests/file.wav",
|
|
OrderMessage(
|
|
index=1,
|
|
text='[{"type": "card", "modules": [{"type": "audio", "src": "./tests/file.wav", "title": "./tests/file.wav"}]}]',
|
|
type=KookMessageType.CARD,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
Plain("test plain"),
|
|
"test plain",
|
|
OrderMessage(
|
|
index=1,
|
|
text="test plain",
|
|
type=KookMessageType.KMARKDOWN,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
At(qq="test at"),
|
|
"test at",
|
|
OrderMessage(
|
|
index=1,
|
|
text="(met)test at(met)",
|
|
type=KookMessageType.KMARKDOWN,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
AtAll(qq="all"),
|
|
"test atAll",
|
|
OrderMessage(
|
|
index=1,
|
|
text="(met)all(met)",
|
|
type=KookMessageType.KMARKDOWN,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
Reply(id="test reply"),
|
|
"test reply",
|
|
OrderMessage(
|
|
index=1,
|
|
text="",
|
|
type=KookMessageType.KMARKDOWN,
|
|
reply_id="test reply",
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
Json(data={"test": "json"}),
|
|
"test json",
|
|
OrderMessage(
|
|
index=1,
|
|
text='[{"test": "json"}]',
|
|
type=KookMessageType.CARD,
|
|
),
|
|
None,
|
|
),
|
|
(
|
|
Unknown(text="test unknown"),
|
|
"test unknown",
|
|
None,
|
|
NotImplementedError,
|
|
),
|
|
],
|
|
)
|
|
async def test_kook_event_warp_message(
|
|
input_message: BaseMessageComponent,
|
|
upload_asset_return: str,
|
|
expected_output: OrderMessage,
|
|
expected_error: type[BaseException] | None,
|
|
):
|
|
client = mock_kook_client(
|
|
upload_asset_return,
|
|
"",
|
|
)
|
|
|
|
event = KookEvent(
|
|
"",
|
|
mock_astrbot_message(),
|
|
PlatformMetadata(
|
|
name="test",
|
|
id="test",
|
|
description="test",
|
|
),
|
|
"",
|
|
client,
|
|
)
|
|
|
|
if expected_error:
|
|
with pytest.raises(expected_error):
|
|
await event._wrap_message(1, input_message)
|
|
return
|
|
|
|
result = await event._wrap_message(1, input_message)
|
|
|
|
expected_output_text: str | list | dict = expected_output.text
|
|
is_json_text = False
|
|
try:
|
|
expected_output_text = json.loads(expected_output_text)
|
|
is_json_text = True
|
|
except:
|
|
pass
|
|
|
|
if is_json_text:
|
|
assert json.loads(result.text) == expected_output_text
|
|
else:
|
|
assert result.text == expected_output_text
|
|
|
|
assert result.index == expected_output.index
|
|
assert result.type == expected_output.type
|
|
assert result.reply_id == expected_output.reply_id
|