Implement P0 of the reaction dashboard: config loading with hot reload, SQLite migrations with backups, single-writer queue, read-only Bilibili fav client, folder import/diff sync, invalid-resource handling, blacklist seed, scheduler, and JSON redacted logging. Includes offline unit and transport-level contract tests; all existing and new tests pass.
4.4 KiB
4.4 KiB
开发约束
本文件适用于本仓库内的所有代码、测试、配置和文档变更。后续开发必须遵守以下约束;如与更深层目录中的 AGENTS.md 冲突,以更深层文件为准。
1. 测试是实现的一部分
- 新增或修改任何方法、函数、类方法或业务逻辑时,必须同步新增或更新自动化测试。
- 不依赖外部接口、文件系统、时钟、随机数或进程环境的纯函数必须有可靠的单元测试,覆盖:
- 正常输入与预期输出;
- 边界值;
- 空值、异常值或非法输入(如函数设计需要处理);
- 已修复缺陷对应的回归用例。
- 不得以“仅人工运行验证”“代码简单”或“调用方已有测试”为由省略纯函数测试。
- 测试必须确定、可重复、离线运行;不得访问真实 B 站、Telegram 或其他外部服务。
2. 外部 API 调用必须使用契约一致的 Mock 验证
- 所有依赖外部 HTTP/API 接口的方法或函数必须有自动化测试。
- 测试中的 Mock 响应必须与实际接口的返回格式一致,包括:
- 顶层字段和嵌套结构;
- 字段类型(例如整数、字符串、数组、
null); - 成功响应的
code/data等包装层; - 项目需要处理的失败响应、缺字段、空数组和异常响应。
- Mock 数据应优先来自已记录的真实接口样本,并完成脱敏;不得为方便测试而编造与接口契约不一致的简化结构。
- 每个 API 客户端至少覆盖:
- 成功响应的解析与字段映射;
- API 业务错误码;
- HTTP/网络错误;
- 本项目依赖的边界情形(例如 B 站
infos静默缺失资源、view返回-404、鉴权失效)。
- Mock 应替换网络传输边界(HTTP client / transport),而不是替换正在测试的业务解析与错误处理逻辑。
3. 测试执行要求
- 所有测试命令必须通过
uv run在项目锁定的 Python 3.14 环境中运行。 - 提交前至少运行受改动影响的测试;涉及共享模块、配置、数据库迁移、API 客户端或调度逻辑时,必须运行完整测试集。
- 测试失败时不得提交“已验证”的实现;应先修复代码或更新正确的测试预期。
- 测试命令、结果和未执行测试的原因必须在最终开发说明中如实记录。
当前已有测试示例:
uv run python tests/test_auth.py
uv run python tests/test_moves.py
新增测试应按功能放入 tests/,命名清晰,并保持可由 uv run python <测试文件> 直接执行;如后续引入测试框架,必须同时更新 pyproject.toml、uv.lock 与相关文档。
4. 阶段性本地 Git 提交
- 完成一个可独立验证的关键步骤后,必须先运行对应测试,再创建一次本地 Git 提交;不得推送远程仓库,除非用户明确要求。
- 关键步骤包括但不限于:
- 一个完整的 API 客户端或认证能力;
- 一个数据库迁移或数据模型阶段;
- 一个调度任务;
- 一个端到端业务动作(如候选收藏、忽略、拉黑);
- 一个完整页面/API 范围;
- 重要缺陷修复或安全修复。
- 提交前检查工作区,确保不包含凭据、Cookie、数据库、日志、缓存、构建产物或其他运行期文件。
- 提交信息使用简洁的 Conventional Commits 风格,例如:
feat(sync): add favorite-folder import
fix(auth): preserve device fingerprint cookies
test(api): cover missing favorite resource responses
docs: document local uv workflow
- 若当前目录尚未初始化为 Git 仓库,或 Git 用户身份未配置,应向用户说明这一阻塞项;不得未经明确授权自行执行
git init、配置 Git 身份或创建提交。 - 不得执行会丢失用户工作区内容的 Git 命令,例如
git reset --hard、git checkout -- .或强制清理未跟踪文件,除非用户明确要求。
5. 完成定义
一个开发任务只有在以下条件满足后才可视为完成:
- 实现与文档/需求口径一致;
- 新增或变更的纯函数已有可靠离线单元测试;
- API 相关逻辑已有契约一致的 Mock 测试;
- 受影响测试已通过;
- 关键步骤已经创建本地 Git 提交,或已明确记录无法提交的原因;
- 最终说明包含改动文件、验证命令与结果,以及未验证项(如有)。