Explorar o código

docs(story): 创建 Story 12.1 - 用户管理 Page Object

为 Epic 12 的用户管理和小程序登录测试提供基础的 Page Object 能力,
支持企业用户和人才用户的创建。

Co-Authored-By: Claude <noreply@anthropic.com>
yourname hai 4 días
pai
achega
07d3d45a0a
Modificáronse 1 ficheiros con 177 adicións e 0 borrados
  1. 177 0
      _bmad-output/implementation-artifacts/story-12.1.md

+ 177 - 0
_bmad-output/implementation-artifacts/story-12.1.md

@@ -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` (测试用户数据)