feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
This commit is contained in:
@@ -0,0 +1,282 @@
|
||||
import { test, expect } from './test-fixtures.js';
|
||||
|
||||
/**
|
||||
* 菜单管理模块完整测试套件
|
||||
* 采用TDD方法:Red -> Green -> Refactor
|
||||
* 测试覆盖:CRUD操作、树形结构、搜索、表单验证
|
||||
*/
|
||||
|
||||
test.describe('菜单管理 - 列表功能', () => {
|
||||
test.beforeEach(async ({ pageObjects, testData, testLogger }) => {
|
||||
testLogger.info('开始菜单管理列表测试套件');
|
||||
await pageObjects.loginPage.navigate();
|
||||
await pageObjects.loginPage.login(testData.admin.username, testData.admin.password);
|
||||
await pageObjects.dashboardPage.waitForLoad();
|
||||
await pageObjects.menuManagementPage.navigate();
|
||||
await pageObjects.menuManagementPage.waitForLoad();
|
||||
});
|
||||
|
||||
test.afterEach(async ({ testLogger, helpers }) => {
|
||||
testLogger.info('菜单管理列表测试用例完成');
|
||||
await helpers.screenshot.takeScreenshot('after-menu-list-test');
|
||||
});
|
||||
|
||||
test('应该显示菜单树形结构', async ({ pageObjects, testLogger }) => {
|
||||
testLogger.startTest('菜单树形结构显示');
|
||||
|
||||
try {
|
||||
const nodeCount = await pageObjects.menuManagementPage.getTreeNodeCount();
|
||||
expect(nodeCount).toBeGreaterThanOrEqual(0);
|
||||
|
||||
testLogger.endTest('菜单树形结构显示', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('菜单树形结构显示', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该能够搜索菜单', async ({ pageObjects, testLogger }) => {
|
||||
testLogger.startTest('搜索菜单功能');
|
||||
|
||||
try {
|
||||
await pageObjects.menuManagementPage.searchMenu('系统');
|
||||
|
||||
const menuCount = await pageObjects.menuManagementPage.getMenuCount();
|
||||
expect(menuCount).toBeGreaterThanOrEqual(0);
|
||||
|
||||
testLogger.endTest('搜索菜单功能', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('搜索菜单功能', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该能够展开树节点', async ({ pageObjects, testLogger }) => {
|
||||
testLogger.startTest('展开树节点');
|
||||
|
||||
try {
|
||||
await pageObjects.menuManagementPage.expandTreeNode(0);
|
||||
|
||||
testLogger.endTest('展开树节点', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('展开树节点', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('菜单管理 - 创建菜单', () => {
|
||||
test.beforeEach(async ({ pageObjects, testData, testLogger }) => {
|
||||
testLogger.info('开始创建菜单测试套件');
|
||||
await pageObjects.loginPage.navigate();
|
||||
await pageObjects.loginPage.login(testData.admin.username, testData.admin.password);
|
||||
await pageObjects.dashboardPage.waitForLoad();
|
||||
await pageObjects.menuManagementPage.navigate();
|
||||
await pageObjects.menuManagementPage.waitForLoad();
|
||||
});
|
||||
|
||||
test('应该成功创建新菜单', async ({ pageObjects, testData, testLogger, helpers }) => {
|
||||
testLogger.startTest('创建新菜单');
|
||||
|
||||
try {
|
||||
await pageObjects.menuManagementPage.clickAddMenu();
|
||||
|
||||
await helpers.form.fillForm({
|
||||
menuName: testData.menu.name,
|
||||
menuType: testData.menu.menuType,
|
||||
path: testData.menu.path,
|
||||
icon: testData.menu.icon,
|
||||
status: testData.menu.status
|
||||
});
|
||||
|
||||
await helpers.form.submitForm();
|
||||
|
||||
const successMessage = await pageObjects.menuManagementPage.getSuccessMessage();
|
||||
expect(successMessage).toBeTruthy();
|
||||
|
||||
testLogger.endTest('创建新菜单', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('创建新菜单', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该验证菜单名称不能为空', async ({ pageObjects, testData, testLogger, helpers }) => {
|
||||
testLogger.startTest('菜单名称空值验证');
|
||||
|
||||
try {
|
||||
await pageObjects.menuManagementPage.clickAddMenu();
|
||||
|
||||
await helpers.form.fillForm({
|
||||
menuType: testData.menu.menuType,
|
||||
path: testData.menu.path,
|
||||
icon: testData.menu.icon
|
||||
});
|
||||
|
||||
await helpers.form.submitForm();
|
||||
|
||||
const errorMessage = await pageObjects.menuManagementPage.getErrorMessage();
|
||||
expect(errorMessage).toBeTruthy();
|
||||
|
||||
testLogger.endTest('菜单名称空值验证', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('菜单名称空值验证', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
|
||||
test('应该验证菜单路径不能为空', async ({ pageObjects, testData, testLogger, helpers }) => {
|
||||
testLogger.startTest('菜单路径空值验证');
|
||||
|
||||
try {
|
||||
await pageObjects.menuManagementPage.clickAddMenu();
|
||||
|
||||
await helpers.form.fillForm({
|
||||
menuName: testData.menu.name,
|
||||
menuType: testData.menu.menuType,
|
||||
icon: testData.menu.icon
|
||||
});
|
||||
|
||||
await helpers.form.submitForm();
|
||||
|
||||
const errorMessage = await pageObjects.menuManagementPage.getErrorMessage();
|
||||
expect(errorMessage).toBeTruthy();
|
||||
|
||||
testLogger.endTest('菜单路径空值验证', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('菜单路径空值验证', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('菜单管理 - 编辑菜单', () => {
|
||||
test.beforeEach(async ({ pageObjects, testData, testLogger }) => {
|
||||
testLogger.info('开始编辑菜单测试套件');
|
||||
await pageObjects.loginPage.navigate();
|
||||
await pageObjects.loginPage.login(testData.admin.username, testData.admin.password);
|
||||
await pageObjects.dashboardPage.waitForLoad();
|
||||
await pageObjects.menuManagementPage.navigate();
|
||||
await pageObjects.menuManagementPage.waitForLoad();
|
||||
});
|
||||
|
||||
test('应该成功编辑菜单信息', async ({ pageObjects, testData, testLogger, helpers }) => {
|
||||
testLogger.startTest('编辑菜单信息');
|
||||
|
||||
try {
|
||||
// 先搜索菜单
|
||||
await pageObjects.menuManagementPage.searchMenu(testData.menu.name);
|
||||
|
||||
// 点击编辑按钮
|
||||
await pageObjects.menuManagementPage.clickEditMenu(testData.menu.name);
|
||||
|
||||
// 修改菜单图标
|
||||
const updatedIcon = 'SettingOutlined';
|
||||
await helpers.form.fillField('input[name="icon"]', updatedIcon);
|
||||
|
||||
await helpers.form.submitForm();
|
||||
|
||||
const successMessage = await pageObjects.menuManagementPage.getSuccessMessage();
|
||||
expect(successMessage).toBeTruthy();
|
||||
|
||||
testLogger.endTest('编辑菜单信息', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('编辑菜单信息', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('菜单管理 - 删除菜单', () => {
|
||||
test.beforeEach(async ({ pageObjects, testData, testLogger }) => {
|
||||
testLogger.info('开始删除菜单测试套件');
|
||||
await pageObjects.loginPage.navigate();
|
||||
await pageObjects.loginPage.login(testData.admin.username, testData.admin.password);
|
||||
await pageObjects.dashboardPage.waitForLoad();
|
||||
await pageObjects.menuManagementPage.navigate();
|
||||
await pageObjects.menuManagementPage.waitForLoad();
|
||||
});
|
||||
|
||||
test('应该成功删除菜单', async ({ pageObjects, testData, testLogger }) => {
|
||||
testLogger.startTest('删除菜单');
|
||||
|
||||
try {
|
||||
// 先搜索菜单
|
||||
await pageObjects.menuManagementPage.searchMenu(testData.menu.name);
|
||||
|
||||
// 点击删除按钮
|
||||
await pageObjects.menuManagementPage.clickDeleteMenu(testData.menu.name);
|
||||
|
||||
// 确认删除
|
||||
await pageObjects.menuManagementPage.confirmDelete();
|
||||
|
||||
const successMessage = await pageObjects.menuManagementPage.getSuccessMessage();
|
||||
expect(successMessage).toBeTruthy();
|
||||
|
||||
testLogger.endTest('删除菜单', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('删除菜单', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('菜单管理 - 端到端流程', () => {
|
||||
test('应该完成完整的菜单CRUD流程', async ({ pageObjects, testData, testLogger, helpers }) => {
|
||||
testLogger.startTest('完整菜单CRUD流程');
|
||||
|
||||
try {
|
||||
// 步骤1: 登录
|
||||
testLogger.startStep('用户登录');
|
||||
await pageObjects.loginPage.navigate();
|
||||
await pageObjects.loginPage.login(testData.admin.username, testData.admin.password);
|
||||
await pageObjects.dashboardPage.waitForLoad();
|
||||
testLogger.endStep('用户登录', 'passed');
|
||||
|
||||
// 步骤2: 导航到菜单管理
|
||||
testLogger.startStep('导航到菜单管理');
|
||||
await pageObjects.menuManagementPage.navigate();
|
||||
await pageObjects.menuManagementPage.waitForLoad();
|
||||
testLogger.endStep('导航到菜单管理', 'passed');
|
||||
|
||||
// 步骤3: 创建菜单
|
||||
testLogger.startStep('创建新菜单');
|
||||
await pageObjects.menuManagementPage.clickAddMenu();
|
||||
await helpers.form.fillForm({
|
||||
menuName: testData.menu.name,
|
||||
menuType: testData.menu.menuType,
|
||||
path: testData.menu.path,
|
||||
icon: testData.menu.icon,
|
||||
status: testData.menu.status
|
||||
});
|
||||
await helpers.form.submitForm();
|
||||
testLogger.endStep('创建新菜单', 'passed');
|
||||
|
||||
// 步骤4: 搜索菜单
|
||||
testLogger.startStep('搜索菜单');
|
||||
await pageObjects.menuManagementPage.searchMenu(testData.menu.name);
|
||||
const menuCount = await pageObjects.menuManagementPage.getMenuCount();
|
||||
expect(menuCount).toBeGreaterThanOrEqual(0);
|
||||
testLogger.endStep('搜索菜单', 'passed');
|
||||
|
||||
// 步骤5: 编辑菜单
|
||||
testLogger.startStep('编辑菜单');
|
||||
await pageObjects.menuManagementPage.clickEditMenu(testData.menu.name);
|
||||
await helpers.form.fillField('input[name="icon"]', 'SettingOutlined');
|
||||
await helpers.form.submitForm();
|
||||
testLogger.endStep('编辑菜单', 'passed');
|
||||
|
||||
// 步骤6: 删除菜单
|
||||
testLogger.startStep('删除菜单');
|
||||
await pageObjects.menuManagementPage.searchMenu(testData.menu.name);
|
||||
await pageObjects.menuManagementPage.clickDeleteMenu(testData.menu.name);
|
||||
await pageObjects.menuManagementPage.confirmDelete();
|
||||
testLogger.endStep('删除菜单', 'passed');
|
||||
|
||||
testLogger.endTest('完整菜单CRUD流程', 'passed');
|
||||
} catch (error) {
|
||||
testLogger.endTest('完整菜单CRUD流程', 'failed', error as Error);
|
||||
throw error;
|
||||
}
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user