fix(sign_in): 修复签到命令 Rule 构造 NameError(MessageEvent 注解全局可见)

- rules.py 改为模块顶层导入 nonebot(NoneBot Rule 解析依赖参数注解在全局命名空间求值)
- 权限纯函数 is_allowed 拆至 permission.py(无 nonebot 依赖,保持可测性)
- 测试加载模块列表同步调整(config/api/service/permission)
This commit is contained in:
2026-08-16 09:05:08 +08:00
parent 9ee5545cac
commit 260651363a
3 changed files with 43 additions and 43 deletions

View File

@@ -1,6 +1,6 @@
"""独立签到插件danding_sign_in测试。
直接加载 config/api/service/rules 子模块,避免执行 nonebot 插件入口;
直接加载 config/api/service/permission 子模块,避免执行 nonebot 插件入口;
aiohttp 调用用 FakeSession/FakeResponse 替身 mock与 test_onmyoji_gacha_http_api.py 同模式)。
"""
@@ -15,7 +15,11 @@ import pytest
def load_modules():
"""直接加载 danding_sign_in 子模块,避免测试环境执行 nonebot 插件入口。"""
"""直接加载 danding_sign_in 子模块,避免测试环境执行 nonebot 插件入口。
rules.py 顶层导入 nonebotRule 解析要求注解全局可见),无 nonebot 的
测试环境不加载它;权限纯函数在 permission.py 中测试。
"""
plugin_dir = Path(__file__).resolve().parents[1] / "danding_bot" / "plugins" / "danding_sign_in"
package_name = "_danding_sign_in_under_test"
@@ -23,7 +27,7 @@ def load_modules():
package.__path__ = [str(plugin_dir)]
sys.modules[package_name] = package
for module_name in ("config", "api", "service", "rules"):
for module_name in ("config", "api", "service", "permission"):
full_name = f"{package_name}.{module_name}"
spec = importlib.util.spec_from_file_location(full_name, plugin_dir / f"{module_name}.py")
module = importlib.util.module_from_spec(spec)
@@ -35,15 +39,15 @@ def load_modules():
sys.modules[f"{package_name}.config"],
sys.modules[f"{package_name}.api"],
sys.modules[f"{package_name}.service"],
sys.modules[f"{package_name}.rules"],
sys.modules[f"{package_name}.permission"],
)
config_module, api_module, service_module, rules_module = load_modules()
config_module, api_module, service_module, permission_module = load_modules()
Config = config_module.Config
SignInAPI = api_module.SignInAPI
perform_daily_sign_in = service_module.perform_daily_sign_in
is_allowed = rules_module.is_allowed
is_allowed = permission_module.is_allowed
class FakeResponse: