# Kiosk 预约 Selection Flow 测试计划

## 1. 测试目标

验证 Kiosk 中普通单日预约、`session_product`、`session_ticket` 从新建到购物车编辑均使用同一套 `SkuDetailModal + Selection Flow + UnifiedBookingSales`，并确认普通商品、跨日商品和非 Kiosk 页面没有被错误接管。

本计划区分四类证据：单元测试、接口/数据检查、真实 Kiosk 手工回归、构建检查。代码合入前需记录每项实际执行结果；仅存在测试用例不等于已通过。

## 2. 前置条件

- Kiosk 使用 `solution="unifiedBookingSales"`。
- Kiosk 或 POS 调用方已传入 `selectionFlowScene="product-selection"`，并由 BigSale 解析为 `resolveProductSelectionFlowSteps`。
- 测试环境支持 `queryProductDetail`、`prepareAvailabilityProjection`、`getProductTimeRanges`、`queryBookingAvailability`、`commitAvailabilitySelection`。
- 准备普通预约、带 SKU 预约、无 SKU 预约、无资源预约、`session_product`、`session_ticket`、Holder 商品和跨日商品。
- 清空购物车，并保留浏览器 Network、Console 和 tempOrder 查看能力。

POS 联调还需确认运行时实际加载了包含 `selectionFlowScene` 的新版 private-materials；仅修改 POS 源码但仍注入旧物料时，新 Flow 不会生效。OS 实例继续由 POS 模板提供，`BookingPos` / `SaleFood` 入口不应创建或注册新的实例。

## 3. 单元测试

| 编号 | 场景 | 预期 |
| --- | --- | --- |
| UT-01 | Session 商品通过组合详情 Host | 命中新 Host，不调用 legacy Info2 action |
| UT-02 | OS 对预约商品返回 `action:add` | 仍先调用 `openBookingSelectionFlow`，不直接 `addProductDirect` |
| UT-03 | booking-create commit | Host 返回 `committed`，外层不再 `confirmBookingEdit` |
| UT-04 | booking-edit commit | 请求携带 `productLineUid`，返回 `booking-edit-committed` |
| UT-05 | 购物车单预约行编辑 | 调用新编辑 Host，不调用旧 `openBookingEdit` 或 `updateItem` |
| UT-06 | 无 Resource Module | `_extend.availabilitySelection` 仍包含原始 candidate 和空资源选择 |
| UT-07 | Session Resolver | `session_product`、`session_ticket` 生成 SKU/日期时间/资源/Holder 的适用步骤 |
| UT-08 | 跨日 Resolver | 仍返回不适用，不进入当前单日 Flow |
| UT-09 | 合并预约行编辑 | 明确阻止编辑，不静默更新第一条 |
| UT-10 | 用户关闭 | Promise 返回 cancelled，不打开旧 Edit Service |

## 4. 新建流程手工回归

### 4.1 普通预约商品

1. 点击无 SKU 的普通预约商品。
2. 确认弹窗立即显示并展示加载状态。
3. 确认自动跳过 SKU，从 Date & Time 开始。
4. 选择日期、时间、资源和 Holder。
5. 确认后检查购物车只增加一条真实预约行。
6. 检查 booking 的开始/结束日期时间、duration、resources 与界面选择一致。

### 4.2 OS 返回 action:add

1. 使用会被 OS 判定为 `action:add` 的预约商品。
2. 确认 Console 决策日志显示 `action:add`。
3. 确认仍打开新 Flow，未立即加入购物车。
4. 关闭 Flow，确认购物车没有新增。
5. 再次打开并完成选择，确认只提交一次。

### 4.3 Session 商品

1. 分别点击 `session_product` 和可独立销售的 `session_ticket`。
2. 确认时间段来自 `getProductTimeRanges/queryBookingAvailability` 返回值。
3. 选择一个固定 Session 后完成资源和 Holder。
4. 检查 booking 写入真实 `schedule_id`，如有则同时检查 `time_slot_id`。
5. 检查订单行 metadata 包含 UBS availability 标识。
6. 确认没有出现旧 `Product Detail / Session Time` 弹窗。

### 4.4 无资源商品

1. 打开没有资源需求组的预约商品。
2. 确认 Resource 步骤不展示。
3. 选择时间后确认 Network 仍发生一次 `target:resource` 查询。
4. 提交参数中的 `requirementSelections` 应为 `[]`。
5. 商品正常进入购物车。

## 5. 购物车编辑手工回归

### 5.1 回填

1. 新建并加入一个带 SKU、日期时间、资源和 Holder 的预约。
2. 点击购物车行编辑。
3. 确认打开新 Flow，而不是右侧旧 Edit Service。
4. 检查 SKU/套餐、日期、时间、资源、Holder、数量、备注均与购物车一致。
5. 不改任何内容直接确认，检查购物车没有新增重复行。

### 5.2 修改

1. 修改日期和时间，确认旧资源选择被清理并重新查询。
2. 修改资源和 Holder。
3. 确认提交请求为 `mode:edit`，且 `productLineUid` 与原订单行一致。
4. 确认原行被更新，购物车总行数不增加。
5. 检查 summary、金额、booking 和购物车 React 视图同步刷新。

### 5.3 Session 编辑

1. 编辑已有 `session_product/session_ticket`。
2. 确认原 Session 时间段自动选中。
3. 切换到另一 Session 并确认。
4. 检查 `schedule_id`、时间和资源被原位替换。

### 5.4 合并行

1. 构造包含两个真实 booking 的合并展示行。
2. 点击编辑。
3. 当前版本应明确提示需要拆分或选择具体预约实例。
4. 确认没有任何底层订单行被部分修改。

## 6. 异常与并发

| 场景 | 预期 |
| --- | --- |
| Availability 初始化 404/超时 | 新 Flow 展示错误；不自动弹出旧 Edit Service |
| `AVAILABILITY_SELECTION_STALE` | 阻止提交，清理下游 candidate/资源并要求重新选择 |
| 资源在确认前售罄 | commit 强校验失败，购物车保持原状态 |
| 快速切换日期 | 旧请求结果不能覆盖最后一次选择 |
| 快速连续点击商品 | 同一时刻最多一个 Flow；预约商品不能被防抖直接加车 |
| Flow 关闭 | availability context 被释放，购物车不变 |
| Flow 确认 | 只调用一次 commit，不再走 legacy confirm/update |

## 7. 回归边界

- 普通无 SKU 商品继续直接加车。
- 普通 SKU/套餐商品继续使用原 SkuDetailModal。
- 普通商品购物车编辑不进入预约 Flow。
- 跨日预约继续使用独立日期区间流程。
- 非 UBS 或未配置 Kiosk Resolver 的调用方继续使用原 Host。
- 赠品等显式调用 `openBookingEdit` 的独立功能不受影响。
- 手机端时间段每行 1 个，桌面端保持配置列数；底部数量、金额和原操作按钮固定可见。

## 8. 数据验收清单

提交前后对比 tempOrder：

- `products[].metadata.unique_identification_number` 编辑前后不变。
- `products[].product_variant_id/product_sku/product_bundle` 与 SKU/套餐选择一致。
- `bookings[].product_uid` 仍指向原商品行。
- `start_date/start_time/end_date/end_time/duration` 正确。
- Session 的 `schedule_id` 为真实 ID，不再固定为 `0`。
- `resources[]` 与资源步骤选择一致。
- availability candidate key/context/version/source/schedule refs 正确回写。
- Holder 数据未丢失。
- 编辑不新增重复 product/booking。

## 9. 执行记录

| 检查类型 | 当前状态 | 备注 |
| --- | --- | --- |
| 单元测试代码 | 已补充 | 尚未执行 |
| TypeScript/构建 | 未执行 | 按项目规则需明确授权后运行 |
| Kiosk 浏览器回归 | 未执行 | 需要本地代理与真实测试商品 |
| tempOrder 对比 | 未执行 | 手工回归时保存前后快照 |
