|
|
@@ -1,6 +1,6 @@
|
|
|
# Story 3.5: 支持多文件同时上传
|
|
|
|
|
|
-Status: review
|
|
|
+Status: done
|
|
|
|
|
|
<!-- Note: Validation is optional. Run validate-create-story for quality check before dev-story. -->
|
|
|
|
|
|
@@ -19,31 +19,34 @@ Status: review
|
|
|
|
|
|
**Then** 验收标准如下:
|
|
|
|
|
|
-1. **函数接受文件名数组或字符串(向后兼容)**
|
|
|
+1. ✅ **函数接受文件名数组或字符串(向后兼容)**
|
|
|
- 单文件调用:`uploadFileToField(page, selector, 'file.jpg')` 继续工作
|
|
|
- 多文件调用:`uploadFileToField(page, selector, ['file1.jpg', 'file2.jpg', 'file3.jpg'])` 正常工作
|
|
|
|
|
|
-2. **使用 Playwright 的 `setInputFiles([path1, path2, ...])` API**
|
|
|
+2. ✅ **使用 Playwright 的 `setInputFiles([path1, path2, ...])` API**
|
|
|
- 多文件时调用 `setInputFiles(filePathArray)`
|
|
|
- 单文件时调用 `setInputFiles(filePath)`(保持原有行为)
|
|
|
|
|
|
-3. **支持相对路径数组(相对于 fixtures 目录)**
|
|
|
+3. ✅ **支持相对路径数组(相对于 fixtures 目录)**
|
|
|
- 每个文件路径都从 fixtures 目录解析
|
|
|
- 保持与单文件上传相同的路径解析逻辑
|
|
|
|
|
|
-4. **错误时提供清晰消息(包含所有文件路径)**
|
|
|
+4. ✅ **错误时提供清晰消息(包含所有文件路径)**
|
|
|
- 文件不存在时,列出所有缺失的文件
|
|
|
- 选择器无效时,与单文件上传行为一致
|
|
|
|
|
|
-5. **单元测试覆盖所有场景**
|
|
|
+5. ✅ **单元测试覆盖所有场景**
|
|
|
- 单文件上传(向后兼容测试)
|
|
|
- 多文件上传(2-3 个文件)
|
|
|
- 文件不存在错误(包含路径列表)
|
|
|
- 空数组错误处理
|
|
|
|
|
|
-6. **E2E 测试验证多文件上传**
|
|
|
- - 在 `file-upload-validation.spec.ts` 中添加多文件上传场景
|
|
|
- - 验证一次上传 3 张照片(身份证、残疾证正反面)
|
|
|
+6. ⚠️ **E2E 测试验证多文件上传(部分完成)**
|
|
|
+ - ✅ 在 `file-upload-validation.spec.ts` 中添加了场景 2.5 验证 API 类型
|
|
|
+ - ✅ 单元测试已验证多文件上传逻辑(16 个测试通过)
|
|
|
+ - ⚠️ **UI 架构限制**:当前残疾人页面每个照片槽使用独立的 `<input type="file">` 元素
|
|
|
+ - ⚠️ 无法进行真实的多文件上传 E2E 测试(需要 `<input type="file" multiple>` 场景)
|
|
|
+ - 📝 **后续工作**:当有页面支持多文件选择时,添加完整 E2E 测试
|
|
|
|
|
|
## Tasks / Subtasks
|
|
|
|
|
|
@@ -335,7 +338,7 @@ _本 Story 完成于 2026-01-10_
|
|
|
|
|
|
#### 实现总结
|
|
|
|
|
|
-**多文件上传功能已成功实现并通过所有测试。**
|
|
|
+**多文件上传功能已成功实现。AC #6 部分完成(受 UI 架构限制)。**
|
|
|
|
|
|
**核心实现:**
|
|
|
1. 使用 TypeScript 函数重载支持单文件和多文件两种调用方式
|
|
|
@@ -347,7 +350,7 @@ _本 Story 完成于 2026-01-10_
|
|
|
- ✅ 单元测试:52 passed, 1 skipped (Windows 平台测试)
|
|
|
- ✅ 新增多文件测试:16 个测试用例全部通过
|
|
|
- ✅ 向后兼容性:所有现有单文件测试继续通过
|
|
|
-- ✅ E2E 测试:新增场景 2.5 验证多文件 API
|
|
|
+- ⚠️ E2E 测试:新增场景 2.5 验证 API 类型(受 UI 架构限制无法完整测试)
|
|
|
|
|
|
**功能特性:**
|
|
|
- 单文件上传:`uploadFileToField(page, selector, 'file.jpg')`
|
|
|
@@ -365,18 +368,32 @@ uploadFileToField(page, selector, 'file.jpg', options?)
|
|
|
uploadFileToField(page, selector, ['file1.jpg', 'file2.jpg'], options?)
|
|
|
```
|
|
|
|
|
|
+**⚠️ AC #6 限制说明:**
|
|
|
+- 当前残疾人管理页面每个照片槽使用独立的 `<input type="file">` 元素
|
|
|
+- 不存在 `<input type="file" multiple>` 场景
|
|
|
+- 因此无法在当前 UI 中进行真实的多文件上传 E2E 测试
|
|
|
+- API 已完全实现并经过单元测试验证,等待真实 UI 场景出现后补充完整 E2E 测试
|
|
|
+
|
|
|
**文件变更:**
|
|
|
- `packages/e2e-test-utils/src/file-upload.ts` - 核心实现(~100 行新增代码)
|
|
|
- `packages/e2e-test-utils/tests/unit/file-upload.test.ts` - 16 个新测试用例(~250 行)
|
|
|
-- `web/tests/e2e/specs/admin/file-upload-validation.spec.ts` - 新增场景 2.5
|
|
|
+- `web/tests/e2e/specs/admin/file-upload-validation.spec.ts` - 新增场景 2.5(API 类型验证)
|
|
|
|
|
|
### File List
|
|
|
|
|
|
_本 Story 修改的文件:_
|
|
|
- `packages/e2e-test-utils/src/file-upload.ts` - 添加多文件上传支持(函数重载、类型定义、错误处理)
|
|
|
- `packages/e2e-test-utils/tests/unit/file-upload.test.ts` - 添加多文件单元测试(16 个测试用例)
|
|
|
-- `web/tests/e2e/specs/admin/file-upload-validation.spec.ts` - 添加多文件 API 验证场景
|
|
|
-- `_bmad-output/implementation-artifacts/3-5-multiple-file-upload.md` - 本 Story 文件(状态更新为 review)
|
|
|
+- `web/tests/e2e/specs/admin/file-upload-validation.spec.ts` - 添加多文件 API 验证场景(更新场景 2.5 说明)
|
|
|
+- `_bmad-output/implementation-artifacts/3-5-multiple-file-upload.md` - 本 Story 文件(状态更新为 review,AC #6 标记为部分完成)
|
|
|
+
|
|
|
+_关联文件修改(非本 Story 范围,但一同提交):_
|
|
|
+- `packages/e2e-test-utils/src/radix-select.ts` - **来自 Story 3.4**:优化选项消失等待逻辑
|
|
|
+ - 将等待第一个选项消失改为等待所有选项消失(使用 `waitForFunction`)
|
|
|
+ - 缩短超时时间从 10000ms 到 5000ms,提高测试效率
|
|
|
+ - 这是 Story 3.4 的修复,在本 Story 开发期间完成,随本 Story 一起提交
|
|
|
+
|
|
|
+_状态文件:_
|
|
|
- `_bmad-output/implementation-artifacts/sprint-status.yaml` - 更新 Story 3.5 状态为 in-progress → review
|
|
|
|
|
|
---
|