运维与上线

测试与 CI 契约

正确使用测试分层、真实基础设施测试、Playwright、覆盖率棘轮和构建门禁。

已根据 starter 提交 b16b416 验证。

测试按“允许 mock 什么”分层。被 mock 的数据库测试无法证明唯一约束;mock 鉴权守卫的路由测试也无法证明数据访问发生在认证之后。

层级证明内容可以 mock
Unit纯规则和架构扫描无
APIHTTP、响应结构、鉴权顺序服务/模型,不包括守卫
Service编排、重试、成本、补偿模型和外部 SDK
Component用户可见行为fetch
Database约束、锁、真实时间戳无
E2E登录浏览器到本地基础设施无

每个路由都需要鉴权门禁测试,并证明在 401/403 前没有调用数据函数。每个资金或积分写入都需要重放测试,证明两个相同请求只有一个效果。

pnpm test:fast
pnpm test:run
pnpm test:cov
pnpm test:db
pnpm exec playwright install chromium
pnpm test:e2e

test:fast 是隔离的提交前检查,test:run 执行已配置的 Vitest 项目,test:cov 对服务、模型、API 路由、共享服务端代码和 Admin 数据代码执行覆盖率棘轮。

未设置 TEST_DATABASE_URL 和 TEST_REDIS_URL 时,Vitest 在收集测试前就排除基础设施项目。PostgreSQL 与 Redis 分别按 URL 启用;仅配置 Redis 不会初始化 Better Auth 或 PostgreSQL。CI 要求两个 URL,缺失服务会失败。PostgreSQL 测试数据库名必须包含 test,因为测试会清空表。生产部署不要配置测试 URL。

Playwright 在端口 3100 的一次性环境中验证登录、组织积分、Garage 上传删除,以及五积分图像任务的重放、Worker、私有存储和签名下载。

外部 E2E 目标必须配置 E2E_BASE_URL、E2E_USER_EMAIL 与 E2E_USER_PASSWORD;只有 E2E_ALLOW_MUTATIONS=1 明确标记一次性环境后才运行写入测试。不要把这些测试指向生产。

CI 执行 lint、PostgreSQL 16 迁移、Redis 测试、覆盖率、全部构建和浏览器流程。不要为了变绿而降低阈值或用 mock 替换真实基础设施测试。