Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✅ 添加测试:更新与添加插件 #1594

Merged
merged 4 commits into from
Sep 1, 2024

Conversation

AkashiCoin
Copy link
Collaborator

@AkashiCoin AkashiCoin commented Sep 1, 2024

Summary by Sourcery

通过为 zhenxun 机器人框架添加插件管理和更新检查的新测试来增强测试套件。重构测试配置以使用动态标识符,提高测试的灵活性和可维护性。

新功能:

  • zhenxun 机器人框架中引入用于添加和更新插件的新测试,增强插件管理功能的测试覆盖率。

增强:

  • 重构测试配置以使用动态用户和机器人 ID,提高测试设置的灵活性和可维护性。

测试:

  • plugin_storeauto_update 功能添加全面测试,包括添加基本和额外插件以及检查更新的场景。
Original summary in English

Summary by Sourcery

Enhance the test suite by adding new tests for plugin management and update checking in the zhenxun bot framework. Refactor test configurations to use dynamic identifiers, improving test flexibility and maintainability.

New Features:

  • Introduce new tests for adding and updating plugins in the zhenxun bot framework, enhancing the test coverage for plugin management functionalities.

Enhancements:

  • Refactor the test configuration to use dynamic user and bot IDs, improving the flexibility and maintainability of the test setup.

Tests:

  • Add comprehensive tests for the plugin_store and auto_update functionalities, including scenarios for adding basic and extra plugins, and checking for updates.

Copy link
Contributor

sourcery-ai bot commented Sep 1, 2024

Sourcery 审核指南

此拉取请求为插件商店和自动更新功能添加了新的测试用例,更新了 conftest.py 文件以改进测试设置,并对自动更新数据源文件进行了小幅更改。更改的重点是增强测试覆盖率和改进整体测试基础设施。

文件级更改

更改 详情 文件
更新了 conftest.py 以改进测试设置和配置
  • 添加了对 json、typing 和 collections.abc 的导入
  • 实现了 get_response_json 函数以加载 JSON 测试数据
  • 使用更详细的配置更新了 pytest_configure
  • 添加了 _init_bot fixture 以注册适配器和加载插件
  • 更新了 app fixture 以包括数据库初始化和清理
  • 添加了 create_bot 和 mocked_api fixtures
tests/conftest.py
为插件商店功能添加了新的测试用例
  • 实现了 test_add_plugin_basic 以测试添加基本插件
  • 实现了 test_add_plugin_extra 以测试添加额外插件
  • 为插件商店端点添加了模拟 API 响应
  • 创建了用于生成测试事件和消息的实用函数
tests/builtin_plugins/plugin_store/test_add_plugin.py
tests/utils.py
为自动更新功能添加了新的测试用例
  • 实现了 test_check_update_release 以测试更新检查过程
  • 为 GitHub 发布端点添加了模拟 API 响应
  • 创建了用于加载测试数据和生成测试事件的实用函数
tests/builtin_plugins/auto_update/test_check_update.py
tests/utils.py
添加了用于在测试中模拟 API 调用的 JSON 响应文件
  • 创建了 release_latest.json 用于 GitHub 发布数据
  • 创建了 basic_plugins.json 和 extra_plugins.json 用于插件商店数据
  • 添加了 github_sub_plugin_api.json 和 github_sub_plugin_contents.json 用于 GitHub API 响应
  • 添加了 search_image_plugin_api.json 用于搜索图像插件数据
tests/response/release_latest.json
tests/response/basic_plugins.json
tests/response/extra_plugins.json
tests/response/github_sub_plugin_api.json
tests/response/github_sub_plugin_contents.json
tests/response/search_image_plugin_api.json
添加了测试常量的配置文件
  • 创建了 BotId、UserId、GroupId 和 MessageId 类
  • 定义了在测试用例中使用的常量值
tests/config.py
更新了自动更新数据源文件
  • 在删除下载文件和提取路径之前移动了临时文件的关闭 (tf.close())
zhenxun/builtin_plugins/auto_update/_data_source.py

提示
  • 通过在拉取请求中评论 @sourcery-ai review 来触发新的 Sourcery 审核。
  • 通过直接回复审核评论继续与 Sourcery 的讨论。
  • 您可以随时通过访问您的仪表板来更改您的审核设置:
    • 启用或禁用 Sourcery 生成的拉取请求摘要或审核指南;
    • 更改审核语言;
  • 如果您有任何问题或反馈,您可以随时联系我们
Original review guide in English

Reviewer's Guide by Sourcery

This pull request adds new test cases for the plugin store and auto-update features, updates the conftest.py file to improve test setup, and makes a minor change to the auto-update data source file. The changes focus on enhancing the test coverage and improving the overall testing infrastructure.

File-Level Changes

Change Details Files
Updated conftest.py to improve test setup and configuration
  • Added imports for json, typing, and collections.abc
  • Implemented get_response_json function to load JSON test data
  • Updated pytest_configure with more detailed configuration
  • Added _init_bot fixture to register adapters and load plugins
  • Updated app fixture to include database initialization and cleanup
  • Added create_bot and mocked_api fixtures
tests/conftest.py
Added new test cases for the plugin store feature
  • Implemented test_add_plugin_basic to test adding a basic plugin
  • Implemented test_add_plugin_extra to test adding an extra plugin
  • Added mock API responses for plugin store endpoints
  • Created utility functions for generating test events and messages
tests/builtin_plugins/plugin_store/test_add_plugin.py
tests/utils.py
Added new test cases for the auto-update feature
  • Implemented test_check_update_release to test the update checking process
  • Added mock API responses for GitHub release endpoints
  • Created utility functions for loading test data and generating test events
tests/builtin_plugins/auto_update/test_check_update.py
tests/utils.py
Added JSON response files for mocking API calls in tests
  • Created release_latest.json for GitHub release data
  • Created basic_plugins.json and extra_plugins.json for plugin store data
  • Added github_sub_plugin_api.json and github_sub_plugin_contents.json for GitHub API responses
  • Added search_image_plugin_api.json for search image plugin data
tests/response/release_latest.json
tests/response/basic_plugins.json
tests/response/extra_plugins.json
tests/response/github_sub_plugin_api.json
tests/response/github_sub_plugin_contents.json
tests/response/search_image_plugin_api.json
Added configuration file for test constants
  • Created classes for BotId, UserId, GroupId, and MessageId
  • Defined constant values for use in test cases
tests/config.py
Updated auto-update data source file
  • Moved the closing of the temporary file (tf.close()) before deleting the download file and extract path
zhenxun/builtin_plugins/auto_update/_data_source.py

Tips
  • Trigger a new Sourcery review by commenting @sourcery-ai review on the pull request.
  • Continue your discussion with Sourcery by replying directly to review comments.
  • You can change your review settings at any time by accessing your dashboard:
    • Enable or disable the Sourcery-generated pull request summary or reviewer's guide;
    • Change the review language;
  • You can always contact us if you have any questions or feedback.

Copy link
Contributor

@sourcery-ai sourcery-ai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@AkashiCoin - 我已经审查了你的更改,它们看起来很棒!

这是我在审查期间查看的内容
  • 🟢 一般问题:一切看起来都很好
  • 🟢 安全性:一切看起来都很好
  • 🟡 测试:发现4个问题
  • 🟢 复杂性:一切看起来都很好
  • 🟢 文档:一切看起来都很好

Sourcery 对开源项目免费 - 如果你喜欢我们的审查,请考虑分享它们 ✨
帮助我变得更有用!请点击 👍 或 👎 在每个评论上告诉我它是否有帮助。
Original comment in English

Hey @AkashiCoin - I've reviewed your changes and they look great!

Here's what I looked at during the review
  • 🟢 General issues: all looks good
  • 🟢 Security: all looks good
  • 🟡 Testing: 4 issues found
  • 🟢 Complexity: all looks good
  • 🟢 Documentation: all looks good

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment to tell me if it was helpful.

Comment on lines 1 to 3
import json
from pathlib import Path
from typing import TYPE_CHECKING
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 考虑为 get_response_json 函数添加类型提示

添加类型提示可以提高代码可读性并及早捕获潜在的类型相关错误。考虑为 get_response_json 函数添加返回类型提示。

Original comment in English

suggestion (testing): Consider adding type hints to the get_response_json function

Adding type hints can improve code readability and catch potential type-related errors early. Consider adding a return type hint to the get_response_json function.

Comment on lines 57 to 102
async def test_add_plugin_basic(
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)
init_mocker(mocker, tmp_path)

plugin_id = 1

async with app.test_matcher(_matcher) as ctx:
bot = create_bot(ctx)
bot = cast(Bot, bot)
raw_message = f"添加插件 {plugin_id}"
event = _v11_group_message_event(
raw_message,
self_id=BotId.QQ_BOT,
user_id=UserId.SUPERUSER,
group_id=GroupId.GROUP_ID_LEVEL_5,
message_id=MessageId.MESSAGE_ID,
to_me=True,
)
ctx.receive_event(bot, event)
ctx.should_call_send(
event=event,
message=Message(f"正在添加插件 Id: {plugin_id}"),
result=None,
bot=bot,
)
ctx.should_call_send(
event=event,
message=Message("插件 识图 安装成功! 重启后生效"),
result=None,
bot=bot,
)
assert mocked_api["basic_plugins"].called
assert mocked_api["extra_plugins"].called
assert mocked_api["search_image_plugin_api"].called
assert mocked_api["search_image_plugin_file_init"].called
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 为添加插件的预期副作用添加断言

虽然测试检查了 API 调用是否已进行,但它没有验证添加插件的副作用,例如检查插件文件是否实际创建在预期位置。考虑添加这样的断言以使测试更全面。

async def test_add_plugin_basic(
    app: App,
    mocker: MockerFixture,
    mocked_api: MockRouter,
    create_bot: Callable,
    tmp_path: Path,
) -> None:
    # ... (existing code)

    assert mocked_api["basic_plugins"].called
    assert mocked_api["extra_plugins"].called
    assert mocked_api["search_image_plugin_api"].called
    assert mocked_api["search_image_plugin_file_init"].called
    assert (tmp_path / "plugins" / "search_image").exists()
    assert (tmp_path / "plugins" / "search_image" / "__init__.py").is_file()
Original comment in English

suggestion (testing): Add assertions for the expected side effects of adding a plugin

While the test checks if the API calls were made, it doesn't verify the side effects of adding a plugin, such as checking if the plugin files were actually created in the expected location. Consider adding such assertions to make the test more comprehensive.

async def test_add_plugin_basic(
    app: App,
    mocker: MockerFixture,
    mocked_api: MockRouter,
    create_bot: Callable,
    tmp_path: Path,
) -> None:
    # ... (existing code)

    assert mocked_api["basic_plugins"].called
    assert mocked_api["extra_plugins"].called
    assert mocked_api["search_image_plugin_api"].called
    assert mocked_api["search_image_plugin_file_init"].called
    assert (tmp_path / "plugins" / "search_image").exists()
    assert (tmp_path / "plugins" / "search_image" / "__init__.py").is_file()

Comment on lines +51 to +60
async def test_check_update_release(
app: App,
mocker: MockerFixture,
mocked_api: MockRouter,
create_bot: Callable,
tmp_path: Path,
) -> None:
"""
测试检查更新
"""
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 为不同的更新场景添加测试用例

当前测试仅涵盖了有更新可用的场景。考虑为没有更新可用或更新过程中出现错误的场景添加测试用例。

Original comment in English

suggestion (testing): Add test cases for different update scenarios

The current test only covers the scenario where an update is available. Consider adding test cases for scenarios where no update is available, or when there's an error during the update process.

tests/utils.py Outdated
Comment on lines 8 to 15
def get_response_json(path: str) -> dict:
return json.loads(
(Path(__file__).parent / "response" / path).read_text(encoding="utf8")
)


def get_content_bytes(path: str) -> bytes:
return (Path(__file__).parent / "content" / path).read_bytes()
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion (testing): 为文件操作添加错误处理

实用函数 get_response_json 和 get_content_bytes 没有任何错误处理。考虑添加 try-except 块来处理潜在的文件相关错误,例如 FileNotFoundError。

def get_response_json(path: str) -> dict:
    try:
        file_path = Path(__file__).parent / "response" / path
        return json.loads(file_path.read_text(encoding="utf8"))
    except (FileNotFoundError, json.JSONDecodeError) as e:
        raise ValueError(f"Error reading or parsing JSON file: {e}")

def get_content_bytes(path: str) -> bytes:
    try:
        return (Path(__file__).parent / "content" / path).read_bytes()
    except FileNotFoundError as e:
        raise ValueError(f"Error reading file: {e}")
Original comment in English

suggestion (testing): Add error handling for file operations

The utility functions get_response_json and get_content_bytes don't have any error handling. Consider adding try-except blocks to handle potential file-related errors, such as FileNotFoundError.

def get_response_json(path: str) -> dict:
    try:
        file_path = Path(__file__).parent / "response" / path
        return json.loads(file_path.read_text(encoding="utf8"))
    except (FileNotFoundError, json.JSONDecodeError) as e:
        raise ValueError(f"Error reading or parsing JSON file: {e}")

def get_content_bytes(path: str) -> bytes:
    try:
        return (Path(__file__).parent / "content" / path).read_bytes()
    except FileNotFoundError as e:
        raise ValueError(f"Error reading file: {e}")

@AkashiCoin AkashiCoin merged commit 7e7436f into HibiKier:dev Sep 1, 2024
1 check passed
@AkashiCoin AkashiCoin deleted the feat/tests branch September 1, 2024 06:53
HibiKier added a commit that referenced this pull request Sep 30, 2024
* ✨ 父级插件加载

* ✅ 添加测试:更新与添加插件 (#1594)

* ✅ 测试更新与添加插件

* ✅ Sourcery建议

* 👷 添加pytest

* 🎨 优化代码

* 🐛 bug修复

* 🐛修复添加插件返回403的问题 (#1595)

* 完善测试方法
* vscode测试配置
* 重构插件安装过程

* 🎨 修改readme

* Update README.md

* 🐛 修改bug与版本锁定

* 🐛 修复超级用户对群组功能开关

* 🐛 修复插件商店检查插件更新问题 (#1597)

* 🐛 修复插件商店检查插件更新问题

* 🐛 恶意命令检测问题

* 🐛 增加插件状态检查 (#1598)

* ✅ 优化测试用例

* 🐛 更改插件更新与安装逻辑

* 🐛 修复更新群组成员信息

* 🎨 代码优化

* 🚀 更新Dockerfile (#1599)

* 🎨 更新requirements

* ➕ 添加依赖aiocache

* ⚡ 添加github镜像

* ✨ 添加仓库目录多获取渠道

* 🐛 修复测试用例

* ✨ 添加API缓存

* 🎨 采取Sourcery建议

* 🐛 文件下载逻辑修改

* 🎨 优化代码

* 🐛 修复插件开关有时出现错误

* ✨ 重构自检ui

* 🐛 自检html修正

* 修复签到逻辑bug,并使代码更灵活以适应签到好感度等级配置 (#1606)

* 修复签到功能已知问题

* 修复签到功能已知问题

* 修改参数名称

* 修改uid判断

---------

Co-authored-by: HibiKier <[email protected]>

* 🎨 代码结构优化

* 🐛 私聊时修改插件时删除私聊帮助

* 🐛 过滤父插件

* 🐛 修复自检在ARM上的问题 (#1607)

* 🐛 修复自检在ARM上的问题

* ✅ 优化测试

* ✨ 支持mysql,psql,sqlite随机函数

* 🔧 VSCode配置修改

* 🔧 VSCode配置修改

* ✨ 添加金币排行

Co-Authored-By: HibiKier <[email protected]>

* 📝 修改README

Co-Authored-By: HibiKier <[email protected]>

* 🔨 提取GitHub相关操作 (#1609)

* 🔨 提取GitHub相关操作

* 🔨 重构API策略

* ✨ 签到/金币排行限制最大数量 (#1616)

* ✨ 签到/金币排行限制最大数量

* 🐛 修复超级用户id获取问题

* 🐛 修复路径解压与挂载 (#1619)

* 🐛 修复功能少时zhenxun帮助图片排序问题 (#1620)

* 🐛 签到文本适应 (#1622)

* 🐛 好感度排行提供默认值 (#1624)

* 🎈 优先使用github api (#1625)

* ✨ 重构帮助,限制普通用户查询管理插件 (#1626)

* 🐛 修复群权限与插件等级匹配 (#1627)

* ✨ 当管理员尝试ban真寻时将被反杀 (#1628)

* ✨ 群组发言时间检测提供开关配置 (#1630)

* 🐳 chore: 支持自动修改版本号 (#1629)

* 🎈 perf(github_utils): 支持github url下载遍历 (#1632)

* 🎈 perf(github_utils): 支持github url下载遍历

* 🐞 fix(http_utils): 修复一些下载问题

* 🦄 refactor(http_utils): 部分重构

* chore(version): Update version to v0.2.2-e6f17c4

---------

Co-authored-by: AkashiCoin <[email protected]>

* 🧪 test(auto_update): 修复测试用例 (#1633)

* 🐛 修复商店商品为空时报错 (#1634)

* 🐛 修复群权限与插件等级匹配 (#1635)

* ✨ message_build支持AtAll (#1639)

* 🎈 perf: 使用commit号下载插件 (#1641)

* 🎈 perf: 使用commit号下载插件

* chore(version): Update version to v0.2.2-f9c7360

---------

Co-authored-by: AkashiCoin <[email protected]>

* 🐳 chore: 修改运行检查触发路径 (#1642)

* 🐳 chore: 修改运行检查触发路径

* 🐳 chore: 添加tests目录

* ✨ 重构qq群事件处理 (#1643)

* 🐛 签到名称自适应 (#1644)

* 🎨  更新README (#1645)

* 🐛 fix(http_utils): 流式下载Content-Length错误 (#1647)

* 🐛 修复群组中帮助功能状态显示问题 (#1650)

* 🐛 修复群欢迎消息设置 (#1651)

* 🐛 修复webui下载后首次启动错误 (#1652)

* 🐛 修复webui下载后首次启动错误

* chore(version): Update version to v0.2.2-4a8ef85

---------

Co-authored-by: HibiKier <[email protected]>

* ✨ 移除默认图片文件夹:爬 (#1653)

* ✨ 安装/移除插件提供插件安装/卸载方法用于插件初始化 (#1654)

* ✨ 新增超级用户与管理员帮助模板 (#1655)

* ✨ 新增个人信息命令 (#1657)

* ✨ 修改个人信息菜单名称 (#1658)

* ✨ 新增插件商店api (#1659)

* ✨ 新增插件商店api

* chore(version): Update version to v0.2.2-7e15f20

---------

Co-authored-by: HibiKier <[email protected]>

* ✨ 将cd,block,count限制复原配置文件 (#1662)

* 🎨 修改README (#1663)

* 🎨 修改版本号 (#1664)

* 🎨 修改requirements (#1665)

---------

Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: fanyinrumeng <[email protected]>
Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: Elaga <[email protected]>
Co-authored-by: AkashiCoin <[email protected]>
Co-authored-by: HibiKier <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant