# Bucket B — form-management L1 集成测试基线

**优先级**：P1
**估时**：3 天
**前置依赖**：PR #208 合入

## 背景

`form-management` 模块**完全没有 L1 集成测试**（form-engine 也没成体系）。
当前所有验证靠 L2 MCP + 手动兜底，每次改动都得重新跑 UI。
没有 L1 等于没有回归保护——下次有人改 instance.service 的撤回链路，没东西兜底。

## 范围

### 1. Test Fixture 基础设施
- [ ] `testing/backend/integration/form-management/fixtures.ts`：
  - 起独立 Temporal worker（或注入 Mock TemporalService — 决策点）
  - 通过 Prisma 注入 seed 数据（form definition / version / 流程定义 / 用户）
  - cleanupByPrefix（学已有 site-attendance 的模式，避免 ON DELETE RESTRICT 坑）
- [ ] `testing/backend/integration/form-management/setup.ts`：beforeEach 创建 + afterEach 清理

### 2. 主路径覆盖（must-have）
- [ ] **submit**：DRAFT → PENDING_APPROVAL，approval workflow 启动，FormInstance.approvalInstanceId 写入
- [ ] **submit (无审批)**：DRAFT → SUBMITTED（`requiresApproval=false`）
- [ ] **withdraw（PR #208 重点）**：PENDING_APPROVAL → WITHDRAWN，approval engine 同步撤回，**双向 WITHDRAWN（不是 CANCELLED）**
- [ ] **resubmit（PR #208 P0 #131）**：REJECTED → update data → submit → PENDING_APPROVAL
- [ ] **approve callback**：approval engine TERMINATED + endReason=APPROVED → FormInstance.status=APPROVED
- [ ] **reject callback**：endReason=REJECTED → FormInstance.status=REJECTED
- [ ] **withdraw callback**：endReason=WITHDRAWN → FormInstance.status=WITHDRAWN（验证 PR #208 修复的 CANCELLED→WITHDRAWN 映射）

### 3. 边界 / 权限
- [ ] withdraw 非 createdBy 用户 → 403（PR #208 新增的 IDOR 校验）
- [ ] submit/withdraw 状态非法（已 APPROVED 再撤回）→ InvalidStatusException
- [ ] update 在 PENDING_APPROVAL 状态 → 拒绝
- [ ] update 在 REJECTED/WITHDRAWN/DRAFT → 允许（重提路径依赖）

### 4. 边界数据结构
- [ ] FormInstance.data 含 array/object 字段（M11 渲染器对应 schema）→ 提交后 JSONB 完整保留
- [ ] businessKey 唯一性约束
- [ ] approvalInstanceId 关联完整性

### 5. Webhook
- [ ] 创建 webhook 订阅 → submit → 触发投递（或检查投递队列）
- [ ] 投递失败 → retryCount 递增（M9 重试链）

## 决策点

**Temporal 真实 worker vs Mock？**
- 真实 worker：覆盖更全，但 worktree 共用 Temporal 容易冲突
- Mock：快、无外部依赖，但 callback 链路（approval engine → form engine）需手动模拟
- **建议**：先 Mock 跑通 80% 路径，留 1-2 项关键 e2e 跑真实 worker（独立 task queue）

## 交付物

- `testing/backend/integration/form-management/*.spec.ts` 约 15-25 个测试用例
- README 说明本测试套件依赖（Postgres + Redis + 可选 Temporal）
- 跑通 `npm run test:integration` 全绿
- 矩阵 testing 列：P0 主路径项升 ✅

## 完成条件

- 上述测试用例全过
- CI quality-gates 接入（如已有 backend integration job）
- 删除本文件
