08ea5fbe98
添加用户管理视图、API和状态管理文件
443 lines
13 KiB
TypeScript
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
|
|
}
|
|
]
|
|
};
|
|
}
|