Files
张翔 08ea5fbe98 feat(admin): 添加用户管理相关文件
添加用户管理视图、API和状态管理文件
2026-03-28 14:37:29 +08:00

317 lines
11 KiB
TypeScript

import { test, expect } from '../fixtures/test-fixtures';
test.describe('API集成测试', () => {
test.beforeEach(async ({ apiHelper, testLogger }) => {
testLogger.startTest('API集成测试');
await apiHelper.login('admin', 'admin123');
});
test.afterEach(async ({ apiHelper, testLogger }) => {
await apiHelper.logout();
testLogger.endTest('API集成测试', 'passed');
});
test('TC-API-001: 用户CRUD操作', async ({ apiHelper, assertionHelper, testLogger }) => {
testLogger.startStep('步骤1: 创建用户');
const userData = {
username: `api_test_${Date.now()}`,
password: 'Test@123456',
realName: 'API测试用户',
email: `api_test_${Date.now()}@example.com`,
phone: '13800138000',
status: 1,
gender: 1
};
const createResponse = await apiHelper.post('/api/sys/user', userData);
await assertionHelper.assertAPISuccess(createResponse, '创建用户API应该返回成功');
const createdUser = await createResponse.json();
const userId = createdUser.data?.id || createdUser.id;
testLogger.endStep('步骤1: 创建用户', 'passed');
testLogger.startStep('步骤2: 查询用户');
const getResponse = await apiHelper.get(`/api/sys/user/${userId}`);
await assertionHelper.assertAPISuccess(getResponse, '查询用户API应该返回成功');
const getUser = await getResponse.json();
expect(getUser.data?.username).toBe(userData.username);
testLogger.endStep('步骤2: 查询用户', 'passed');
testLogger.startStep('步骤3: 更新用户');
const updateData = {
id: userId,
realName: '更新后的用户名',
email: `updated_${Date.now()}@example.com`
};
const updateResponse = await apiHelper.put('/api/sys/user', updateData);
await assertionHelper.assertAPISuccess(updateResponse, '更新用户API应该返回成功');
testLogger.endStep('步骤3: 更新用户', 'passed');
testLogger.startStep('步骤4: 验证更新');
const verifyResponse = await apiHelper.get(`/api/sys/user/${userId}`);
const verifyUser = await verifyResponse.json();
expect(verifyUser.data?.realName).toBe(updateData.realName);
expect(verifyUser.data?.email).toBe(updateData.email);
testLogger.endStep('步骤4: 验证更新', 'passed');
testLogger.startStep('步骤5: 删除用户');
const deleteResponse = await apiHelper.delete(`/api/sys/user/${userId}`);
await assertionHelper.assertAPISuccess(deleteResponse, '删除用户API应该返回成功');
testLogger.endStep('步骤5: 删除用户', 'passed');
testLogger.startStep('步骤6: 验证删除');
const verifyDeleteResponse = await apiHelper.get(`/api/sys/user/${userId}`);
expect(verifyDeleteResponse.status()).toBe(404);
testLogger.endStep('步骤6: 验证删除', 'passed');
});
test('TC-API-002: 角色CRUD操作', async ({ apiHelper, assertionHelper, testLogger }) => {
testLogger.startStep('步骤1: 创建角色');
const roleData = {
roleName: `API测试角色_${Date.now()}`,
roleCode: `api_test_role_${Date.now()}`,
description: 'API测试角色描述',
status: 1
};
const createResponse = await apiHelper.post('/api/sys/role', roleData);
await assertionHelper.assertAPISuccess(createResponse, '创建角色API应该返回成功');
const createdRole = await createResponse.json();
const roleId = createdRole.data?.id || createdRole.id;
testLogger.endStep('步骤1: 创建角色', 'passed');
testLogger.startStep('步骤2: 查询角色列表');
const listResponse = await apiHelper.get('/api/sys/role/list');
await assertionHelper.assertAPISuccess(listResponse, '查询角色列表API应该返回成功');
const roleList = await listResponse.json();
expect(roleList.data?.length).toBeGreaterThan(0);
testLogger.endStep('步骤2: 查询角色列表', 'passed');
testLogger.startStep('步骤3: 查询单个角色');
const getResponse = await apiHelper.get(`/api/sys/role/${roleId}`);
await assertionHelper.assertAPISuccess(getResponse, '查询角色API应该返回成功');
const getRole = await getResponse.json();
expect(getRole.data?.roleName).toBe(roleData.roleName);
testLogger.endStep('步骤3: 查询单个角色', 'passed');
testLogger.startStep('步骤4: 更新角色');
const updateData = {
id: roleId,
roleName: '更新后的角色名',
description: '更新后的角色描述'
};
const updateResponse = await apiHelper.put('/api/sys/role', updateData);
await assertionHelper.assertAPISuccess(updateResponse, '更新角色API应该返回成功');
testLogger.endStep('步骤4: 更新角色', 'passed');
testLogger.startStep('步骤5: 删除角色');
const deleteResponse = await apiHelper.delete(`/api/sys/role/${roleId}`);
await assertionHelper.assertAPISuccess(deleteResponse, '删除角色API应该返回成功');
testLogger.endStep('步骤5: 删除角色', 'passed');
});
test('TC-API-003: 菜单CRUD操作', async ({ apiHelper, assertionHelper, testLogger }) => {
testLogger.startStep('步骤1: 创建菜单');
const menuData = {
name: `API测试菜单_${Date.now()}`,
code: `api_test_menu_${Date.now()}`,
path: `/api-test-menu-${Date.now()}`,
icon: 'SettingOutlined',
sortOrder: 10,
status: 1,
parentId: 0
};
const createResponse = await apiHelper.post('/api/sys/menu', menuData);
await assertionHelper.assertAPISuccess(createResponse, '创建菜单API应该返回成功');
const createdMenu = await createResponse.json();
const menuId = createdMenu.data?.id || createdMenu.id;
testLogger.endStep('步骤1: 创建菜单', 'passed');
testLogger.startStep('步骤2: 查询菜单树');
const treeResponse = await apiHelper.get('/api/sys/menu/tree');
await assertionHelper.assertAPISuccess(treeResponse, '查询菜单树API应该返回成功');
const menuTree = await treeResponse.json();
expect(menuTree.data?.length).toBeGreaterThan(0);
testLogger.endStep('步骤2: 查询菜单树', 'passed');
testLogger.startStep('步骤3: 查询单个菜单');
const getResponse = await apiHelper.get(`/api/sys/menu/${menuId}`);
await assertionHelper.assertAPISuccess(getResponse, '查询菜单API应该返回成功');
const getMenu = await getResponse.json();
expect(getMenu.data?.name).toBe(menuData.name);
testLogger.endStep('步骤3: 查询单个菜单', 'passed');
testLogger.startStep('步骤4: 更新菜单');
const updateData = {
id: menuId,
name: '更新后的菜单名',
icon: 'EditOutlined'
};
const updateResponse = await apiHelper.put('/api/sys/menu', updateData);
await assertionHelper.assertAPISuccess(updateResponse, '更新菜单API应该返回成功');
testLogger.endStep('步骤4: 更新菜单', 'passed');
testLogger.startStep('步骤5: 删除菜单');
const deleteResponse = await apiHelper.delete(`/api/sys/menu/${menuId}`);
await assertionHelper.assertAPISuccess(deleteResponse, '删除菜单API应该返回成功');
testLogger.endStep('步骤5: 删除菜单', 'passed');
});
test('TC-API-004: 分页查询用户', async ({ apiHelper, assertionHelper, testLogger }) => {
testLogger.startStep('步骤1: 创建多个测试用户');
const users = [];
for (let i = 0; i < 5; i++) {
const userData = {
username: `pagination_test_${Date.now()}_${i}`,
password: 'Test@123456',
realName: `分页测试用户${i}`,
email: `pagination_test_${i}@example.com`,
phone: '13800138000',
status: 1,
gender: 1
};
const createResponse = await apiHelper.post('/api/sys/user', userData);
const createdUser = await createResponse.json();
users.push(createdUser.data?.id || createdUser.id);
}
testLogger.endStep('步骤1: 创建多个测试用户', 'passed');
testLogger.startStep('步骤2: 分页查询用户');
const page1Response = await apiHelper.get('/api/sys/user/page', {
current: 1,
size: 2
});
await assertionHelper.assertAPISuccess(page1Response, '分页查询API应该返回成功');
const page1Data = await page1Response.json();
expect(page1Data.data?.records?.length).toBeLessThanOrEqual(2);
expect(page1Data.data?.total).toBeGreaterThanOrEqual(5);
testLogger.endStep('步骤2: 分页查询用户', 'passed');
testLogger.startStep('步骤3: 查询第二页');
const page2Response = await apiHelper.get('/api/sys/user/page', {
current: 2,
size: 2
});
await assertionHelper.assertAPISuccess(page2Response, '分页查询API应该返回成功');
const page2Data = await page2Response.json();
expect(page2Data.data?.records?.length).toBeLessThanOrEqual(2);
testLogger.endStep('步骤3: 查询第二页', 'passed');
testLogger.startStep('步骤4: 清理测试数据');
for (const userId of users) {
await apiHelper.delete(`/api/sys/user/${userId}`);
}
testLogger.endStep('步骤4: 清理测试数据', 'passed');
});
test('TC-API-005: 用户搜索功能', async ({ apiHelper, assertionHelper, testLogger }) => {
testLogger.startStep('步骤1: 创建测试用户');
const userData = {
username: `search_test_${Date.now()}`,
password: 'Test@123456',
realName: '搜索测试用户',
email: 'search_test@example.com',
phone: '13800138000',
status: 1,
gender: 1
};
const createResponse = await apiHelper.post('/api/sys/user', userData);
const createdUser = await createResponse.json();
const userId = createdUser.data?.id || createdUser.id;
testLogger.endStep('步骤1: 创建测试用户', 'passed');
testLogger.startStep('步骤2: 按用户名搜索');
const searchResponse = await apiHelper.get('/api/sys/user/page', {
username: userData.username
});
await assertionHelper.assertAPISuccess(searchResponse, '搜索API应该返回成功');
const searchData = await searchResponse.json();
expect(searchData.data?.records?.length).toBeGreaterThan(0);
expect(searchData.data?.records?.[0]?.username).toBe(userData.username);
testLogger.endStep('步骤2: 按用户名搜索', 'passed');
testLogger.startStep('步骤3: 按真实姓名搜索');
const searchByNameResponse = await apiHelper.get('/api/sys/user/page', {
realName: userData.realName
});
await assertionHelper.assertAPISuccess(searchByNameResponse, '按姓名搜索API应该返回成功');
const searchByNameData = await searchByNameResponse.json();
expect(searchByNameData.data?.records?.length).toBeGreaterThan(0);
expect(searchByNameData.data?.records?.[0]?.realName).toBe(userData.realName);
testLogger.endStep('步骤3: 按真实姓名搜索', 'passed');
testLogger.startStep('步骤4: 清理测试数据');
await apiHelper.delete(`/api/sys/user/${userId}`);
testLogger.endStep('步骤4: 清理测试数据', 'passed');
});
});