Files
everything-is-suitable/everything-is-suitable-test/e2e/workflows/user-management-workflow.ts
T
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

443 lines
13 KiB
TypeScript

/**
* 用户管理工作流实现
* 实现用户管理相关的端到端业务流程
*/
import { Page } from '@playwright/test';
import { BusinessWorkflow, WorkflowStep } from '../core/business-workflows.js';
import { TestLogger } from '../core/test-logger.js';
import { TestDataManager, TestUser } from '../core/test-data-manager.js';
import { LoginPage } from '../pages/login-page.js';
import { UserManagementPage } from '../pages/user-management-page.js';
export interface UserWorkflowContext {
page: Page;
testLogger: TestLogger;
testDataManager: TestDataManager;
loginPage: LoginPage;
userManagementPage: UserManagementPage;
createdUser?: TestUser;
createdUserId?: string;
}
/**
* 创建用户工作流
*/
export function createUserWorkflow(context: UserWorkflowContext): BusinessWorkflow {
const { page, testLogger, testDataManager, loginPage, userManagementPage } = context;
return {
name: 'createUser',
description: '创建新用户的完整流程',
preconditions: async () => {
testLogger.info('🔍 检查前置条件: 用户已登录');
// 检查是否已登录
const currentUrl = page.url();
if (!currentUrl.includes('/dashboard') && !currentUrl.includes('/users')) {
testLogger.info('用户未登录,执行登录');
await loginPage.navigate();
await loginPage.login('admin', 'admin123');
await page.waitForURL('**/dashboard', { timeout: 10000 });
}
return true;
},
steps: [
{
name: 'navigateToUserManagement',
action: async () => {
testLogger.info('🌐 导航到用户管理页面');
await userManagementPage.navigate();
await userManagementPage.waitForLoad();
},
timeout: 15000,
retryCount: 3
},
{
name: 'clickAddUserButton',
action: async () => {
testLogger.info('🖱️ 点击新增用户按钮');
await userManagementPage.clickAddUser();
},
timeout: 10000,
retryCount: 3
},
{
name: 'fillUserForm',
action: async () => {
testLogger.info('📝 填写用户表单');
context.createdUser = testDataManager.createTestUser();
// 填写表单字段
await page.fill('input[name="username"]', context.createdUser.username);
await page.fill('input[name="password"]', context.createdUser.password);
await page.fill('input[name="email"]', context.createdUser.email);
if (context.createdUser.phone) {
await page.fill('input[name="phone"]', context.createdUser.phone);
}
if (context.createdUser.realName) {
await page.fill('input[name="realName"]', context.createdUser.realName);
}
},
timeout: 15000,
retryCount: 3
},
{
name: 'submitUserForm',
action: async () => {
testLogger.info('📤 提交用户表单');
await page.click('button[type="submit"]');
// 等待提交完成
await page.waitForSelector('.ant-message-success', {
state: 'visible',
timeout: 10000
});
},
timeout: 15000,
retryCount: 3
},
{
name: 'verifyUserCreated',
action: async () => {
testLogger.info('✅ 验证用户创建成功');
// 搜索新创建的用户
if (context.createdUser) {
await userManagementPage.searchUser(context.createdUser.username);
// 验证用户出现在列表中
const userCount = await userManagementPage.getUserCount();
if (userCount === 0) {
throw new Error('用户创建后未在列表中找到');
}
}
},
timeout: 15000,
retryCount: 3
}
],
postconditions: async () => {
testLogger.info('🔍 检查后置条件: 用户创建成功');
return !!context.createdUser;
},
cleanup: async () => {
testLogger.info('🧹 执行清理操作');
// 清理创建的用户
if (context.createdUser) {
try {
await userManagementPage.searchUser(context.createdUser.username);
// 如果找到用户,执行删除
const userCount = await userManagementPage.getUserCount();
if (userCount > 0) {
await userManagementPage.clickDeleteUser(0);
await userManagementPage.confirmDelete();
}
} catch (error) {
testLogger.warn('清理用户失败,可能用户不存在');
}
}
}
};
}
/**
* 编辑用户工作流
*/
export function editUserWorkflow(context: UserWorkflowContext, targetUsername?: string): BusinessWorkflow {
const { page, testLogger, testDataManager, loginPage, userManagementPage } = context;
return {
name: 'editUser',
description: '编辑用户的完整流程',
preconditions: async () => {
testLogger.info('🔍 检查前置条件');
// 确保已登录
const currentUrl = page.url();
if (!currentUrl.includes('/dashboard') && !currentUrl.includes('/users')) {
await loginPage.navigate();
await loginPage.login('admin', 'admin123');
await page.waitForURL('**/dashboard', { timeout: 10000 });
}
return true;
},
steps: [
{
name: 'navigateToUserManagement',
action: async () => {
testLogger.info('🌐 导航到用户管理页面');
await userManagementPage.navigate();
await userManagementPage.waitForLoad();
},
timeout: 15000,
retryCount: 3
},
{
name: 'searchUser',
action: async () => {
testLogger.info('🔍 搜索目标用户');
const searchUsername = targetUsername || context.createdUser?.username || 'admin';
await userManagementPage.searchUser(searchUsername);
// 验证找到用户
const userCount = await userManagementPage.getUserCount();
if (userCount === 0) {
throw new Error(`未找到用户: ${searchUsername}`);
}
},
timeout: 15000,
retryCount: 3
},
{
name: 'clickEditButton',
action: async () => {
testLogger.info('🖱️ 点击编辑按钮');
await userManagementPage.clickEditUser(0);
},
timeout: 10000,
retryCount: 3
},
{
name: 'updateUserForm',
action: async () => {
testLogger.info('📝 更新用户表单');
// 更新邮箱
const newEmail = testDataManager.generateEmail('updated');
await page.fill('input[name="email"]', newEmail);
// 更新手机号
const newPhone = testDataManager.generatePhone();
await page.fill('input[name="phone"]', newPhone);
},
timeout: 10000,
retryCount: 3
},
{
name: 'submitUserForm',
action: async () => {
testLogger.info('📤 提交用户表单');
await page.click('button[type="submit"]');
// 等待提交完成
await page.waitForSelector('.ant-message-success', {
state: 'visible',
timeout: 10000
});
},
timeout: 15000,
retryCount: 3
},
{
name: 'verifyUserUpdated',
action: async () => {
testLogger.info('✅ 验证用户更新成功');
// 验证成功消息
const successMessage = await userManagementPage.getSuccessMessage();
if (!successMessage.includes('成功')) {
throw new Error('用户更新未显示成功消息');
}
},
timeout: 10000,
retryCount: 3
}
]
};
}
/**
* 删除用户工作流
*/
export function deleteUserWorkflow(context: UserWorkflowContext, targetUsername?: string): BusinessWorkflow {
const { page, testLogger, userManagementPage, loginPage } = context;
return {
name: 'deleteUser',
description: '删除用户的完整流程',
preconditions: async () => {
testLogger.info('🔍 检查前置条件');
const currentUrl = page.url();
if (!currentUrl.includes('/dashboard') && !currentUrl.includes('/users')) {
await loginPage.navigate();
await loginPage.login('admin', 'admin123');
await page.waitForURL('**/dashboard', { timeout: 10000 });
}
return true;
},
steps: [
{
name: 'navigateToUserManagement',
action: async () => {
testLogger.info('🌐 导航到用户管理页面');
await userManagementPage.navigate();
await userManagementPage.waitForLoad();
},
timeout: 15000,
retryCount: 3
},
{
name: 'searchUser',
action: async () => {
testLogger.info('🔍 搜索目标用户');
const searchUsername = targetUsername || context.createdUser?.username;
if (!searchUsername) {
throw new Error('未指定要删除的用户');
}
await userManagementPage.searchUser(searchUsername);
const userCount = await userManagementPage.getUserCount();
if (userCount === 0) {
throw new Error(`未找到用户: ${searchUsername}`);
}
},
timeout: 15000,
retryCount: 3
},
{
name: 'clickDeleteButton',
action: async () => {
testLogger.info('🖱️ 点击删除按钮');
await userManagementPage.clickDeleteUser(0);
},
timeout: 10000,
retryCount: 3
},
{
name: 'confirmDelete',
action: async () => {
testLogger.info('✅ 确认删除');
await userManagementPage.confirmDelete();
},
timeout: 10000,
retryCount: 3
},
{
name: 'verifyUserDeleted',
action: async () => {
testLogger.info('✅ 验证用户删除成功');
// 验证成功消息
const successMessage = await userManagementPage.getSuccessMessage();
if (!successMessage.includes('成功')) {
throw new Error('用户删除未显示成功消息');
}
},
timeout: 10000,
retryCount: 3
}
]
};
}
/**
* 用户生命周期工作流
*/
export function userLifecycleWorkflow(context: UserWorkflowContext): BusinessWorkflow {
const { testLogger, testDataManager } = context;
let createdUsername: string | undefined;
return {
name: 'userLifecycle',
description: '用户从创建到删除的完整生命周期',
steps: [
{
name: 'login',
action: async () => {
const loginWorkflow = createUserWorkflow(context);
if (loginWorkflow.preconditions) {
await loginWorkflow.preconditions();
}
},
timeout: 20000,
retryCount: 3
},
{
name: 'createUser',
action: async () => {
const createWorkflow = createUserWorkflow(context);
for (const step of createWorkflow.steps) {
await step.action();
}
createdUsername = context.createdUser?.username;
},
timeout: 60000,
retryCount: 3
},
{
name: 'verifyUserInList',
action: async () => {
if (!createdUsername) {
throw new Error('用户创建失败');
}
await context.userManagementPage.searchUser(createdUsername);
const count = await context.userManagementPage.getUserCount();
if (count === 0) {
throw new Error('新创建的用户未在列表中');
}
},
timeout: 15000,
retryCount: 3
},
{
name: 'editUser',
action: async () => {
const editWorkflow = editUserWorkflow(context, createdUsername);
for (const step of editWorkflow.steps.slice(2)) { // 跳过导航和搜索
await step.action();
}
},
timeout: 45000,
retryCount: 3
},
{
name: 'verifyUserUpdated',
action: async () => {
testLogger.info('✅ 验证用户更新成功');
const successMessage = await context.userManagementPage.getSuccessMessage();
if (!successMessage.includes('成功')) {
throw new Error('用户更新验证失败');
}
},
timeout: 10000,
retryCount: 3
},
{
name: 'deleteUser',
action: async () => {
const deleteWorkflow = deleteUserWorkflow(context, createdUsername);
for (const step of deleteWorkflow.steps.slice(2)) { // 跳过导航和搜索
await step.action();
}
},
timeout: 30000,
retryCount: 3
},
{
name: 'verifyUserDeleted',
action: async () => {
testLogger.info('✅ 验证用户删除成功');
if (!createdUsername) return;
await context.userManagementPage.searchUser(createdUsername);
const count = await context.userManagementPage.getUserCount();
if (count > 0) {
throw new Error('用户删除后仍存在于列表中');
}
},
timeout: 15000,
retryCount: 3
}
]
};
}