From 77edffc0ffb726bcb59eab7974c55bb01f9b52e3 Mon Sep 17 00:00:00 2001 From: molanp <104612722+molanp@users.noreply.github.com> Date: Sat, 2 Aug 2025 18:15:45 +0800 Subject: [PATCH] =?UTF-8?q?test(builtin=5Fplugins):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=8F=92=E4=BB=B6=E5=95=86=E5=BA=97=E7=9B=B8=E5=85=B3=E6=B5=8B?= =?UTF-8?q?=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 移除 jsd 相关测试用例,只保留 gh(GitHub)的测试 - 删除了 test_plugin_store.py 文件,清理了插件商店的测试 - 更新了 test_search_plugin.py 中的插件版本号 - 调整了 test_update_plugin.py 中的已加载插件版本 - 移除了 StoreManager 类中的 is_external 变量 - 更新了 RepoFileManager 类中的文件获取逻辑,优先使用 GitHub --- .../plugin_store/test_add_plugin.py | 30 +--- .../plugin_store/test_plugin_store.py | 140 ------------------ .../plugin_store/test_search_plugin.py | 8 +- .../plugin_store/test_update_plugin.py | 2 +- .../plugin_store/data_source.py | 1 - zhenxun/utils/repo_utils/file_manager.py | 21 +-- 6 files changed, 24 insertions(+), 178 deletions(-) delete mode 100644 tests/builtin_plugins/plugin_store/test_plugin_store.py diff --git a/tests/builtin_plugins/plugin_store/test_add_plugin.py b/tests/builtin_plugins/plugin_store/test_add_plugin.py index a36d504b..1e30f3b1 100644 --- a/tests/builtin_plugins/plugin_store/test_add_plugin.py +++ b/tests/builtin_plugins/plugin_store/test_add_plugin.py @@ -15,7 +15,7 @@ from tests.config import BotId, GroupId, MessageId, UserId from tests.utils import _v11_group_message_event -@pytest.mark.parametrize("package_api", ["jsd", "gh"]) +@pytest.mark.parametrize("package_api", ["gh"]) @pytest.mark.parametrize("is_commit", [True, False]) async def test_add_plugin_basic( package_api: str, @@ -37,11 +37,7 @@ async def test_add_plugin_basic( new=tmp_path / "zhenxun", ) - if package_api != "jsd": - mocked_api["zhenxun_bot_plugins_metadata"].respond(404) - if package_api != "gh": - mocked_api["zhenxun_bot_plugins_tree"].respond(404) - + mocked_api["zhenxun_bot_plugins_metadata"].respond(404) if not is_commit: mocked_api["zhenxun_bot_plugins_commit"].respond(404) mocked_api["zhenxun_bot_plugins_commit_proxy"].respond(404) @@ -86,7 +82,7 @@ async def test_add_plugin_basic( assert (mock_base_path / "plugins" / "search_image" / "__init__.py").is_file() -@pytest.mark.parametrize("package_api", ["jsd", "gh"]) +@pytest.mark.parametrize("package_api", ["gh"]) @pytest.mark.parametrize("is_commit", [True, False]) async def test_add_plugin_basic_commit_version( package_api: str, @@ -108,11 +104,7 @@ async def test_add_plugin_basic_commit_version( new=tmp_path / "zhenxun", ) - if package_api != "jsd": - mocked_api["zhenxun_bot_plugins_metadata_commit"].respond(404) - if package_api != "gh": - mocked_api["zhenxun_bot_plugins_tree_commit"].respond(404) - + mocked_api["zhenxun_bot_plugins_metadata_commit"].respond(404) if not is_commit: mocked_api["zhenxun_bot_plugins_commit"].respond(404) mocked_api["zhenxun_bot_plugins_commit_proxy"].respond(404) @@ -159,7 +151,7 @@ async def test_add_plugin_basic_commit_version( assert (mock_base_path / "plugins" / "bilibili_sub" / "__init__.py").is_file() -@pytest.mark.parametrize("package_api", ["jsd", "gh"]) +@pytest.mark.parametrize("package_api", ["gh"]) @pytest.mark.parametrize("is_commit", [True, False]) async def test_add_plugin_basic_is_not_dir( package_api: str, @@ -181,10 +173,7 @@ async def test_add_plugin_basic_is_not_dir( new=tmp_path / "zhenxun", ) - if package_api != "jsd": - mocked_api["zhenxun_bot_plugins_metadata"].respond(404) - if package_api != "gh": - mocked_api["zhenxun_bot_plugins_tree"].respond(404) + mocked_api["zhenxun_bot_plugins_metadata"].respond(404) if not is_commit: mocked_api["zhenxun_bot_plugins_commit"].respond(404) @@ -230,7 +219,7 @@ async def test_add_plugin_basic_is_not_dir( assert (mock_base_path / "plugins" / "alapi" / "jitang.py").is_file() -@pytest.mark.parametrize("package_api", ["jsd", "gh"]) +@pytest.mark.parametrize("package_api", ["gh"]) @pytest.mark.parametrize("is_commit", [True, False]) async def test_add_plugin_extra( package_api: str, @@ -252,10 +241,7 @@ async def test_add_plugin_extra( new=tmp_path / "zhenxun", ) - if package_api != "jsd": - mocked_api["zhenxun_github_sub_metadata"].respond(404) - if package_api != "gh": - mocked_api["zhenxun_github_sub_tree"].respond(404) + mocked_api["zhenxun_github_sub_metadata"].respond(404) if not is_commit: mocked_api["zhenxun_github_sub_commit"].respond(404) diff --git a/tests/builtin_plugins/plugin_store/test_plugin_store.py b/tests/builtin_plugins/plugin_store/test_plugin_store.py deleted file mode 100644 index 4e8eae16..00000000 --- a/tests/builtin_plugins/plugin_store/test_plugin_store.py +++ /dev/null @@ -1,140 +0,0 @@ -from collections.abc import Callable -from pathlib import Path -from typing import cast - -from nonebot.adapters.onebot.v11 import Bot, Message -from nonebot.adapters.onebot.v11.event import GroupMessageEvent -from nonebug import App -from pytest_mock import MockerFixture -from respx import MockRouter - -from tests.builtin_plugins.plugin_store.utils import init_mocked_api -from tests.config import BotId, GroupId, MessageId, UserId -from tests.utils import _v11_group_message_event - - -async def test_plugin_store( - app: App, - mocker: MockerFixture, - mocked_api: MockRouter, - create_bot: Callable, - tmp_path: Path, -) -> None: - """ - 测试插件商店 - """ - from zhenxun.builtin_plugins.plugin_store import _matcher - from zhenxun.builtin_plugins.plugin_store.data_source import row_style - - init_mocked_api(mocked_api=mocked_api) - - mock_table_page = mocker.patch( - "zhenxun.builtin_plugins.plugin_store.data_source.ImageTemplate.table_page" - ) - mock_table_page_return = mocker.AsyncMock() - mock_table_page.return_value = mock_table_page_return - - mock_build_message = mocker.patch( - "zhenxun.builtin_plugins.plugin_store.MessageUtils.build_message" - ) - mock_build_message_return = mocker.AsyncMock() - mock_build_message.return_value = mock_build_message_return - - async with app.test_matcher(_matcher) as ctx: - bot = create_bot(ctx) - bot: Bot = cast(Bot, bot) - raw_message = "插件商店" - event: GroupMessageEvent = _v11_group_message_event( - message=raw_message, - self_id=BotId.QQ_BOT, - user_id=UserId.SUPERUSER, - group_id=GroupId.GROUP_ID_LEVEL_5, - message_id=MessageId.MESSAGE_ID_3, - to_me=True, - ) - ctx.receive_event(bot=bot, event=event) - mock_table_page.assert_awaited_once_with( - "插件列表", - "通过添加/移除插件 ID 来管理插件", - ["-", "ID", "名称", "简介", "作者", "版本", "类型"], - [ - ["", 0, "鸡汤", "喏,亲手为你煮的鸡汤", "HibiKier", "0.1", "普通插件"], - ["", 1, "识图", "以图搜图,看破本源", "HibiKier", "0.1", "普通插件"], - ["", 2, "网易云热评", "生了个人,我很抱歉", "HibiKier", "0.1", "普通插件"], - [ - "", - 3, - "B站订阅", - "非常便利的B站订阅通知", - "HibiKier", - "0.3-b101fbc", - "普通插件", - ], - [ - "", - 4, - "github订阅", - "订阅github用户或仓库", - "xuanerwa", - "0.7", - "普通插件", - ], - [ - "", - 5, - "Minecraft查服", - "Minecraft服务器状态查询,支持IPv6", - "molanp", - "1.13", - "普通插件", - ], - ], - text_style=row_style, - ) - mock_build_message.assert_called_once_with(mock_table_page_return) - mock_build_message_return.send.assert_awaited_once() - - assert mocked_api["basic_plugins"].called - assert mocked_api["extra_plugins"].called - - -async def test_plugin_store_fail( - app: App, - mocker: MockerFixture, - mocked_api: MockRouter, - create_bot: Callable, - tmp_path: Path, -) -> None: - """ - 测试插件商店 - """ - from zhenxun.builtin_plugins.plugin_store import _matcher - - init_mocked_api(mocked_api=mocked_api) - mocked_api.get( - "https://raw.githubusercontent.com/zhenxun-org/zhenxun_bot_plugins/b101fbc/plugins.json", - name="basic_plugins", - ).respond(404) - - async with app.test_matcher(_matcher) as ctx: - bot = create_bot(ctx) - bot: Bot = cast(Bot, bot) - raw_message = "插件商店" - event: GroupMessageEvent = _v11_group_message_event( - message=raw_message, - self_id=BotId.QQ_BOT, - user_id=UserId.SUPERUSER, - group_id=GroupId.GROUP_ID_LEVEL_5, - message_id=MessageId.MESSAGE_ID_3, - to_me=True, - ) - ctx.receive_event(bot=bot, event=event) - ctx.should_call_send( - event=event, - message=Message("获取插件列表失败..."), - result=None, - exception=None, - bot=bot, - ) - - assert mocked_api["basic_plugins"].called diff --git a/tests/builtin_plugins/plugin_store/test_search_plugin.py b/tests/builtin_plugins/plugin_store/test_search_plugin.py index 3dd9bd4c..404fee5e 100644 --- a/tests/builtin_plugins/plugin_store/test_search_plugin.py +++ b/tests/builtin_plugins/plugin_store/test_search_plugin.py @@ -63,11 +63,11 @@ async def test_search_plugin_name( [ [ "", - 49, + 4, "github订阅", "订阅github用户或仓库", "xuanerwa", - "0.9", + "0.7", "普通插件", ] ], @@ -129,11 +129,11 @@ async def test_search_plugin_author( [ [ "", - 49, + 4, "github订阅", "订阅github用户或仓库", "xuanerwa", - "0.9", + "0.7", "普通插件", ] ], diff --git a/tests/builtin_plugins/plugin_store/test_update_plugin.py b/tests/builtin_plugins/plugin_store/test_update_plugin.py index e252eb42..39412de9 100644 --- a/tests/builtin_plugins/plugin_store/test_update_plugin.py +++ b/tests/builtin_plugins/plugin_store/test_update_plugin.py @@ -88,7 +88,7 @@ async def test_update_plugin_basic_is_new( ) mocker.patch( "zhenxun.builtin_plugins.plugin_store.data_source.StoreManager.get_loaded_plugins", - return_value=[("search_image", "0.2")], + return_value=[("search_image", "0.1")], ) plugin_id = 1 diff --git a/zhenxun/builtin_plugins/plugin_store/data_source.py b/zhenxun/builtin_plugins/plugin_store/data_source.py index eb58c632..4bb3b64f 100644 --- a/zhenxun/builtin_plugins/plugin_store/data_source.py +++ b/zhenxun/builtin_plugins/plugin_store/data_source.py @@ -389,7 +389,6 @@ class StoreManager: logger.debug(f"当前插件列表: {suc_plugin}", LOG_COMMAND) if cls.check_version_is_new(plugin_info, suc_plugin): return f"插件 {plugin_info.name} 已是最新版本" - is_external = True if plugin_info.github_url is None: plugin_info.github_url = DEFAULT_GITHUB_URL await cls.install_plugin_with_repo( diff --git a/zhenxun/utils/repo_utils/file_manager.py b/zhenxun/utils/repo_utils/file_manager.py index 67c82192..53797bd6 100644 --- a/zhenxun/utils/repo_utils/file_manager.py +++ b/zhenxun/utils/repo_utils/file_manager.py @@ -207,13 +207,13 @@ class RepoFileManager: ) if repo_type is None: try: - return await self.get_aliyun_file_content( - repo_name, file_path, branch, ignore_error - ) - except Exception: return await self.get_github_file_content( repo_url, file_path, ignore_error ) + except Exception: + return await self.get_aliyun_file_content( + repo_name, file_path, branch, ignore_error + ) try: if repo_type == RepoType.GITHUB: @@ -257,17 +257,17 @@ class RepoFileManager: ) try: if repo_type is None: - # 尝试阿里云,失败则尝试GitHub + # 尝试GitHub,失败则尝试阿里云 try: - return await self._list_aliyun_directory_files( - repo_name, directory_path, branch, recursive + return await self._list_github_directory_files( + repo_url, directory_path, branch, recursive ) except Exception as e: logger.warning( - "获取阿里云目录文件失败,尝试GitHub", LOG_COMMAND, e=e + "获取GitHub目录文件失败,尝试阿里云", LOG_COMMAND, e=e ) - return await self._list_github_directory_files( - repo_url, directory_path, branch, recursive + return await self._list_aliyun_directory_files( + repo_name, directory_path, branch, recursive ) if repo_type == RepoType.GITHUB: return await self._list_github_directory_files( @@ -526,6 +526,7 @@ class RepoFileManager: content_bytes = content.encode("utf-8") else: content_bytes = content + logger.warning(f"写入文件: {local_path}") async with aiofiles.open(local_path, "wb") as f: await f.write(content_bytes) result.success = True