|
|
@@ -0,0 +1,177 @@
|
|
|
+# Story 12.1: user-page-object - 用户管理 Page Object
|
|
|
+
|
|
|
+Status: ready-for-dev
|
|
|
+
|
|
|
+## Story
|
|
|
+
|
|
|
+作为测试开发者,
|
|
|
+我想要扩展用户管理 Page Object 以支持企业用户和人才用户的创建,
|
|
|
+以便为 Epic 12 的用户管理和小程序登录测试提供基础的 Page Object 能力。
|
|
|
+
|
|
|
+## Acceptance Criteria
|
|
|
+
|
|
|
+1. **扩展 UserManagementPage 支持 EMPLOYER 类型用户**
|
|
|
+ - 添加 `createEmployerUser` 方法,支持创建企业用户
|
|
|
+ - 方法接收 `username`, `password`, `companyId` 以及可选的 `phone`, `email`, `nickname`, `name`
|
|
|
+ - 在表单中选择用户类型为"企业用户"
|
|
|
+ - 使用 Radix UI Select 选择公司
|
|
|
+
|
|
|
+2. **扩展 UserManagementPage 支持 TALENT 类型用户**
|
|
|
+ - 添加 `createTalentUser` 方法,支持创建人才用户
|
|
|
+ - 方法接收 `username`, `password`, `personId` 以及可选的 `phone`, `email`, `nickname`, `name`
|
|
|
+ - 在表单中选择用户类型为"人才用户"
|
|
|
+ - 使用 Radix UI Select 选择残疾人
|
|
|
+
|
|
|
+3. **保持向后兼容**
|
|
|
+ - 现有的 `createUser` 方法保持不变(默认创建 ADMIN 用户)
|
|
|
+ - 所有现有测试继续通过
|
|
|
+
|
|
|
+4. **类型安全**
|
|
|
+ - 导出 `EmployerUserData` 和 `TalentUserData` 接口
|
|
|
+ - 使用 TypeScript 严格类型检查
|
|
|
+
|
|
|
+5. **错误处理**
|
|
|
+ - 当公司或残疾人不存在时,正确捕获并报告错误
|
|
|
+ - 表单验证失败时提供清晰的错误信息
|
|
|
+
|
|
|
+## Tasks / Subtasks
|
|
|
+
|
|
|
+- [ ] 任务 1: 分析用户管理表单结构 (AC: 1, 2)
|
|
|
+ - [ ] 1.1 查看 web 端用户管理 UI 组件,确定表单字段和选择器
|
|
|
+ - [ ] 1.2 确认用户类型选择器(Radix UI Select)
|
|
|
+ - [ ] 1.3 确认公司选择器(Radix UI Select)
|
|
|
+ - [ ] 1.4 确认残疾人选择器(Radix UI Select)
|
|
|
+
|
|
|
+- [ ] 任务 2: 扩展 UserManagementPage 类型定义 (AC: 4)
|
|
|
+ - [ ] 2.1 添加 `EmployerUserData` 接口
|
|
|
+ - [ ] 2.2 添加 `TalentUserData` 接口
|
|
|
+ - [ ] 2.3 导出 `UserType` 常量(参考 `@d8d/shared-types`)
|
|
|
+
|
|
|
+- [ ] 任务 3: 实现 `createEmployerUser` 方法 (AC: 1)
|
|
|
+ - [ ] 3.1 点击"创建用户"按钮
|
|
|
+ - [ ] 3.2 选择用户类型为"企业用户"
|
|
|
+ - [ ] 3.3 填写必填字段(用户名、密码、公司)
|
|
|
+ - [ ] 3.4 填写可选字段(手机号、邮箱、昵称、真实姓名)
|
|
|
+ - [ ] 3.5 使用 `selectRadixOptionAsync` 选择公司
|
|
|
+ - [ ] 3.6 提交表单并等待结果
|
|
|
+
|
|
|
+- [ ] 任务 4: 实现 `createTalentUser` 方法 (AC: 2)
|
|
|
+ - [ ] 4.1 点击"创建用户"按钮
|
|
|
+ - [ ] 4.2 选择用户类型为"人才用户"
|
|
|
+ - [ ] 4.3 填写必填字段(用户名、密码、残疾人)
|
|
|
+ - [ ] 4.4 填写可选字段(手机号、邮箱、昵称、真实姓名)
|
|
|
+ - [ ] 4.5 使用 `selectRadixOptionAsync` 选择残疾人
|
|
|
+ - [ ] 4.6 提交表单并等待结果
|
|
|
+
|
|
|
+- [ ] 任务 5: 添加辅助方法 (AC: 5)
|
|
|
+ - [ ] 5.1 添加 `selectUserType` 方法(选择用户类型)
|
|
|
+ - [ ] 5.2 添加 `selectCompany` 方法(选择公司)
|
|
|
+ - [ ] 5.3 添加 `selectPerson` 方法(选择残疾人)
|
|
|
+ - [ ] 5.4 添加错误处理逻辑
|
|
|
+
|
|
|
+- [ ] 任务 6: 编写单元测试验证 Page Object (AC: 3, 5)
|
|
|
+ - [ ] 6.1 验证 `createEmployerUser` 方法正确调用
|
|
|
+ - [ ] 6.2 验证 `createTalentUser` 方法正确调用
|
|
|
+ - [ ] 6.3 验证错误处理逻辑
|
|
|
+
|
|
|
+- [ ] 任务 7: 运行现有测试确保向后兼容 (AC: 3)
|
|
|
+ - [ ] 7.1 运行 `users.spec.ts` 所有测试通过
|
|
|
+ - [ ] 7.2 确认无破坏性变更
|
|
|
+
|
|
|
+## Dev Notes
|
|
|
+
|
|
|
+### 架构模式
|
|
|
+
|
|
|
+**Page Object 模式**
|
|
|
+- 文件位置: `web/tests/e2e/pages/admin/user-management.page.ts`
|
|
|
+- 现有实现已支持基础用户 CRUD
|
|
|
+- 需要扩展以支持多类型用户创建
|
|
|
+
|
|
|
+**Radix UI Select 集成**
|
|
|
+- 用户类型、公司、残疾人选择器使用 Radix UI Select 组件
|
|
|
+- 使用 `@d8d/e2e-test-utils` 的 `selectRadixOptionAsync` 工具函数
|
|
|
+- 参考: `packages/e2e-test-utils/src/select.ts`
|
|
|
+
|
|
|
+**依赖的测试数据**
|
|
|
+- Epic 11 已完成,有 Company 和 Platform 数据可用
|
|
|
+- 需要预先创建残疾人数据(可使用 Epic 9 的测试数据)
|
|
|
+
|
|
|
+### 用户类型定义
|
|
|
+
|
|
|
+**来自 `packages/shared-types/src/index.ts`:**
|
|
|
+```typescript
|
|
|
+export enum UserType {
|
|
|
+ ADMIN = 'admin', // 管理员
|
|
|
+ EMPLOYER = 'employer', // 企业用户
|
|
|
+ TALENT = 'talent' // 人才用户
|
|
|
+}
|
|
|
+
|
|
|
+export const TypeNameMap: Record<UserType, string> = {
|
|
|
+ [UserType.ADMIN]: '管理员',
|
|
|
+ [UserType.EMPLOYER]: '企业用户',
|
|
|
+ [UserType.TALENT]: '人才用户'
|
|
|
+};
|
|
|
+```
|
|
|
+
|
|
|
+**创建用户 Schema** (来自 `packages/core-module/user-module/src/schemas/user.schema.ts`):
|
|
|
+- 企业用户必须字段: `username`, `password`, `companyId`
|
|
|
+- 人才用户必须字段: `username`, `password`, `personId`
|
|
|
+- 可选字段: `phone`, `email`, `nickname`, `name`, `avatarFileId`, `isDisabled`
|
|
|
+
|
|
|
+### 项目结构说明
|
|
|
+
|
|
|
+**对齐统一项目结构**
|
|
|
+- Page Objects 位置: `web/tests/e2e/pages/admin/`
|
|
|
+- 测试 Fixtures 位置: `web/tests/e2e/fixtures/`
|
|
|
+- 测试 Specs 位置: `web/tests/e2e/specs/admin/`
|
|
|
+
|
|
|
+**测试标准参考**
|
|
|
+- Page Object 设计参考 `company-management.page.ts`
|
|
|
+- Select 工具使用参考 `company-create.spec.ts`
|
|
|
+
|
|
|
+### 技术约束
|
|
|
+
|
|
|
+**TypeScript 配置**
|
|
|
+- 目标: ES2020+
|
|
|
+- 严格类型检查,禁止 `any` 类型
|
|
|
+
|
|
|
+**Playwright 配置**
|
|
|
+- 超时设置: 参考 `TIMEOUTS` 常量
|
|
|
+- 测试隔离: 每个测试独立运行,不共享状态
|
|
|
+
|
|
|
+**依赖包**
|
|
|
+- `@d8d/e2e-test-utils`: 提供测试工具函数
|
|
|
+- `@playwright/test`: E2E 测试框架
|
|
|
+
|
|
|
+## References
|
|
|
+
|
|
|
+- **Epic 12 定义**: `_bmad-output/planning-artifacts/epics.md` (第 2383-2425 行)
|
|
|
+- **PRD**: `_bmad-output/planning-artifacts/prd.md`
|
|
|
+- **Architecture**: `_bmad-output/planning-artifacts/architecture.md`
|
|
|
+- **User Schema**: `packages/core-module/user-module/src/schemas/user.schema.ts`
|
|
|
+- **UserType 定义**: `packages/shared-types/src/index.ts` (第 56-67 行)
|
|
|
+- **现有 Page Object**: `web/tests/e2e/pages/admin/user-management.page.ts`
|
|
|
+- **参考 Page Object**: `web/tests/e2e/pages/admin/company-management.page.ts`
|
|
|
+- **Select 工具**: `packages/e2e-test-utils/src/select.ts`
|
|
|
+- **现有用户测试**: `web/tests/e2e/specs/admin/users.spec.ts`
|
|
|
+
|
|
|
+## Dev Agent Record
|
|
|
+
|
|
|
+### Agent Model Used
|
|
|
+
|
|
|
+Claude Opus 4.5 (model ID: 'claude-opus-4-5-20251101')
|
|
|
+
|
|
|
+### Debug Log References
|
|
|
+
|
|
|
+无(开发过程中记录)
|
|
|
+
|
|
|
+### Completion Notes List
|
|
|
+
|
|
|
+无(开发过程中记录)
|
|
|
+
|
|
|
+### File List
|
|
|
+
|
|
|
+主要文件:
|
|
|
+- `web/tests/e2e/pages/admin/user-management.page.ts` (主要修改文件)
|
|
|
+- `web/tests/e2e/specs/admin/users.spec.ts` (现有测试,确保通过)
|
|
|
+- `web/tests/e2e/fixtures/test-users.json` (测试用户数据)
|