|
|
@@ -0,0 +1,126 @@
|
|
|
+# Story 12.1: 用户管理 Page Object
|
|
|
+
|
|
|
+Status: ready-for-dev
|
|
|
+
|
|
|
+
|
|
|
+## Story
|
|
|
+
|
|
|
+作为测试开发者,
|
|
|
+我想要创建或增强用户管理的 Page Object,
|
|
|
+以便组织用户管理相关的页面元素和操作,为后续的用户管理测试提供基础。
|
|
|
+
|
|
|
+## Acceptance Criteria
|
|
|
+
|
|
|
+1. **AC1: 创建或增强用户管理 Page Object 文件**
|
|
|
+ - 文件位置:web/tests/e2e/pages/admin/user-management.page.ts
|
|
|
+ - 导出 UserManagementPage 类
|
|
|
+ - 继承 Epic 11 的成熟 Page Object 模式
|
|
|
+
|
|
|
+2. **AC2: 实现列表页面选择器和操作方法**
|
|
|
+ - 页面标题、创建按钮、搜索输入、搜索按钮
|
|
|
+ - 用户表格、编辑按钮、删除按钮
|
|
|
+ - goto(), expectToBeVisible(), getUserCount(), getUserByUsername(), userExists() 方法
|
|
|
+
|
|
|
+3. **AC3: 实现创建用户对话框的选择器和操作方法**
|
|
|
+ - createUser() 方法:填写用户表单并提交
|
|
|
+ - 支持字段:用户名、密码、昵称、邮箱、手机号、真实姓名
|
|
|
+ - 支持用户类型:EMPLOYER(需关联公司)、TALENT(需关联残疾人)、ADMIN
|
|
|
+ - 使用 TIMEOUTS 常量
|
|
|
+
|
|
|
+4. **AC4: 实现编辑用户对话框的选择器和操作方法**
|
|
|
+ - editUser() 方法:编辑用户信息
|
|
|
+ - 支持编辑字段:昵称、邮箱、手机号、真实姓名
|
|
|
+
|
|
|
+5. **AC5: 实现删除功能(API 直接删除)**
|
|
|
+ - 使用 API 直接删除策略(避免 UI 不稳定性)
|
|
|
+ - 参考 Epic 11 的模式
|
|
|
+
|
|
|
+6. **AC6: 实现表单填写和提交方法**
|
|
|
+ - fillUserForm() 辅助方法
|
|
|
+ - 处理用户类型选择和关联
|
|
|
+
|
|
|
+7. **AC7: 实现搜索和验证方法**
|
|
|
+ - searchUsers(), expectUserExists(), expectUserNotExists() 方法
|
|
|
+
|
|
|
+8. **AC8: 代码质量标准**
|
|
|
+ - 使用 TIMEOUTS 常量
|
|
|
+ - 遵循 Epic 11 Page Object 模式
|
|
|
+ - TypeScript 严格类型检查
|
|
|
+
|
|
|
+## Tasks / Subtasks
|
|
|
+
|
|
|
+- [ ] 任务 1: 分析现有 UserManagementPage 并确定改进方向 (AC: #1, #8)
|
|
|
+ - [ ] 1.1 读取现有 user-management.page.ts
|
|
|
+ - [ ] 1.2 对比 Epic 11 的 Page Object 模式
|
|
|
+ - [ ] 1.3 识别需要改进的部分
|
|
|
+
|
|
|
+- [ ] 任务 2: 实现列表页面选择器和基础方法 (AC: #2)
|
|
|
+ - [ ] 2.1 定义选择器
|
|
|
+ - [ ] 2.2 实现 goto() 和 expectToBeVisible()
|
|
|
+ - [ ] 2.3 实现用户查询方法
|
|
|
+
|
|
|
+- [ ] 任务 3: 实现创建用户对话框 (AC: #3, #6)
|
|
|
+ - [ ] 3.1 实现 createUser() 方法
|
|
|
+ - [ ] 3.2 实现 fillUserForm() 辅助方法
|
|
|
+ - [ ] 3.3 支持用户类型和关联
|
|
|
+
|
|
|
+- [ ] 任务 4: 实现编辑用户对话框 (AC: #4, #6)
|
|
|
+ - [ ] 4.1 实现 editUser() 方法
|
|
|
+ - [ ] 4.2 复用 fillUserForm()
|
|
|
+
|
|
|
+- [ ] 任务 5: 实现 API 删除方法 (AC: #5)
|
|
|
+ - [ ] 5.1 实现 deleteUser() 方法
|
|
|
+ - [ ] 5.2 使用 API 直接删除策略
|
|
|
+
|
|
|
+- [ ] 任务 6: 实现搜索和验证方法 (AC: #7)
|
|
|
+ - [ ] 6.1 实现 searchUsers()
|
|
|
+ - [ ] 6.2 实现断言方法
|
|
|
+
|
|
|
+- [ ] 任务 7: 定义 TypeScript 类型 (AC: #8)
|
|
|
+ - [ ] 7.1 定义 UserData, UserType, UserUpdateData
|
|
|
+
|
|
|
+- [ ] 任务 8: 添加 JSDoc 注释 (AC: #8)
|
|
|
+ - [ ] 8.1 为每个方法添加 JSDoc
|
|
|
+
|
|
|
+- [ ] 任务 9: 验证代码质量 (AC: #8)
|
|
|
+ - [ ] 9.1 运行 typecheck
|
|
|
+ - [ ] 9.2 运行 lint (pre-commit hook)
|
|
|
+
|
|
|
+## Dev Notes
|
|
|
+
|
|
|
+### Epic 11 关键经验
|
|
|
+
|
|
|
+**Page Object 模式(成熟,可直接复用):**
|
|
|
+- 参考 platform-management.page.ts, company-management.page.ts
|
|
|
+- 选择器优先级:data-testid → role + label → text
|
|
|
+- CRUD 方法:create, edit, delete, exists
|
|
|
+- 使用 TIMEOUTS 常量
|
|
|
+
|
|
|
+**API 删除策略(关键):**
|
|
|
+- 使用 API 直接删除,绕过 UI 不稳定性
|
|
|
+- 删除成功后刷新页面
|
|
|
+
|
|
|
+**测试数据唯一性:**
|
|
|
+- 使用时间戳:Date.now()
|
|
|
+
|
|
|
+### 用户类型和关联
|
|
|
+
|
|
|
+- EMPLOYER:企业用户,需关联公司(Epic 11)
|
|
|
+- TALENT:人才用户,需关联残疾人(Epic 9)
|
|
|
+- ADMIN:管理员,无关联
|
|
|
+
|
|
|
+### 项目结构
|
|
|
+
|
|
|
+- 文件:web/tests/e2e/pages/admin/user-management.page.ts
|
|
|
+- 导入:import { TIMEOUTS } from '../../utils/timeouts';
|
|
|
+
|
|
|
+## Dev Agent Record
|
|
|
+
|
|
|
+### Agent Model Used
|
|
|
+Claude (d8d-model)
|
|
|
+
|
|
|
+### File List
|
|
|
+- 12-1-user-page-object.md
|
|
|
+- web/tests/e2e/pages/admin/user-management.page.ts (创建/增强)
|
|
|
+- web/tests/e2e/pages/admin/platform-management.page.ts (参考)
|
|
|
+- web/tests/e2e/utils/timeouts.ts (使用)
|