diff --git a/novalon-manage-web/e2e/comprehensive-uat.spec.ts b/novalon-manage-web/e2e/comprehensive-uat.spec.ts deleted file mode 100644 index a402615..0000000 --- a/novalon-manage-web/e2e/comprehensive-uat.spec.ts +++ /dev/null @@ -1,833 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { LoginPage } from './pages/LoginPage'; -import { DashboardPage } from './pages/DashboardPage'; -import { UserManagementPage } from './pages/UserManagementPage'; -import { RoleManagementPage } from './pages/RoleManagementPage'; -import { MenuManagementPage } from './pages/MenuManagementPage'; -import { SystemConfigPage } from './pages/SystemConfigPage'; -import { FileManagementPage } from './pages/FileManagementPage'; -import { OperationLogPage } from './pages/OperationLogPage'; -import { NotificationPage } from './pages/NotificationPage'; -import { DictionaryManagementPage } from './pages/DictionaryManagementPage'; -import { TestDataCleanup } from './utils/TestDataCleanup'; - -test.describe('UAT用户验收测试', () => { - let testDataCleanup: TestDataCleanup; - - test.beforeEach(async ({ page }) => { - testDataCleanup = new TestDataCleanup(page); - }); - - test.afterEach(async ({ page }) => { - await testDataCleanup.cleanupAll(); - }); - - test('UAT-001: 用户注册与首次登录场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const userManagementPage = new UserManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 管理员登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 创建新用户账号', async () => { - await dashboardPage.navigateToUserManagement(); - await userManagementPage.clickCreateUser(); - - const userData = { - username: `newuser_${timestamp}`, - nickname: `新员工${timestamp}`, - email: `newuser_${timestamp}@example.com`, - phone: '13800138000', - password: 'Test123!@#', - confirmPassword: 'Test123!@#', - }; - - await userManagementPage.fillUserForm(userData); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - - testDataCleanup.trackUser(userData.username); - }); - - await test.step('3. 设置初始密码', async () => { - await userManagementPage.editUser(1); - const dialog = page.locator('.el-dialog'); - const passwordInput = dialog.locator('.el-form-item').filter({ hasText: '密码' }).locator('input[type="password"]'); - await passwordInput.fill('NewPass123!@#'); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - }); - - await test.step('4. 分配基本角色', async () => { - await userManagementPage.editUser(1); - await page.click('.role-select'); - await page.click('option:has-text("普通用户")'); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - }); - - await test.step('5. 新用户使用初始密码登录', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login(`newuser_${timestamp}`, 'NewPass123!@#'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('6. 验证密码修改提示', async () => { - await expect(page.locator('.password-change-notice')).toBeVisible(); - }); - - await test.step('7. 修改密码', async () => { - await dashboardPage.navigateToProfile(); - await page.fill('input[name="oldPassword"]', 'NewPass123!@#'); - await page.fill('input[name="newPassword"]', 'FinalPass123!@#'); - await page.fill('input[name="confirmPassword"]', 'FinalPass123!@#'); - await page.click('button[type="submit"]'); - await expect(page.locator('.success-message')).toBeVisible(); - }); - - await test.step('8. 验证登录成功', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login(`newuser_${timestamp}`, 'FinalPass123!@#'); - await expect(page).toHaveURL(/.*dashboard/); - const username = await dashboardPage.getUsername(); - expect(username).toContain(`newuser_${timestamp}`); - }); - - await test.step('9. 查看欢迎信息', async () => { - await expect(page.locator('.welcome-message')).toBeVisible(); - await expect(page.locator('.welcome-message')).toContainText('欢迎'); - }); - - await test.step('10. 查看系统通知', async () => { - await dashboardPage.navigateToNotification(); - await expect(page.locator('.notification-list')).toBeVisible(); - }); - }); - - test('UAT-002: 用户信息管理场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const userManagementPage = new UserManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 用户登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 导航到个人信息页面', async () => { - await dashboardPage.navigateToProfile(); - await expect(page.locator('.profile-form')).toBeVisible(); - }); - - await test.step('3. 查看当前信息', async () => { - const currentUsername = await page.locator('input[name="username"]').inputValue(); - expect(currentUsername).toBe('admin'); - }); - - await test.step('4. 修改昵称', async () => { - await page.fill('input[name="nickname"]', `管理员_${timestamp}`); - await page.click('button[type="submit"]'); - await expect(page.locator('.success-message')).toBeVisible(); - }); - - await test.step('5. 修改邮箱', async () => { - await page.fill('input[name="email"]', `admin_${timestamp}@example.com`); - await page.click('button[type="submit"]'); - await expect(page.locator('.success-message')).toBeVisible(); - }); - - await test.step('6. 修改手机号', async () => { - await page.fill('input[name="phone"]', '13900139000'); - await page.click('button[type="submit"]'); - await expect(page.locator('.success-message')).toBeVisible(); - }); - - await test.step('7. 上传头像', async () => { - const fileInput = page.locator('input[type="file"]'); - await fileInput.setInputFiles('./e2e/fixtures/test-file.txt'); - await page.click('button[type="submit"]'); - await expect(page.locator('.success-message')).toBeVisible(); - }); - - await test.step('8. 保存修改', async () => { - await page.click('button:has-text("保存")'); - await expect(page.locator('.success-message')).toBeVisible(); - }); - - await test.step('9. 验证信息更新', async () => { - await page.reload(); - await expect(page.locator('input[name="nickname"]')).toHaveValue(`管理员_${timestamp}`); - }); - - await test.step('10. 查看操作日志', async () => { - await dashboardPage.navigateToOperationLog(); - await expect(page.locator('table')).toContainText('个人信息'); - }); - }); - - test('UAT-003: 角色权限分配场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const roleManagementPage = new RoleManagementPage(page); - const userManagementPage = new UserManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 管理员登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 创建新角色', async () => { - await dashboardPage.navigateToRoleManagement(); - await roleManagementPage.clickCreateRole(); - - const roleData = { - roleName: `业务角色_${timestamp}`, - roleKey: `business_role_${timestamp}`, - roleSort: '1', - status: '1', - remark: `业务操作角色_${timestamp}`, - }; - - await roleManagementPage.fillRoleForm(roleData); - await roleManagementPage.submitForm(); - await expect(roleManagementPage.successMessage).toBeVisible(); - - testDataCleanup.trackRole(roleData.roleKey); - }); - - await test.step('3. 配置角色基本信息', async () => { - await roleManagementPage.editRole(1); - await page.fill('input[name="remark"]', `更新备注_${timestamp}`); - await roleManagementPage.submitForm(); - await expect(roleManagementPage.successMessage).toBeVisible(); - }); - - await test.step('4. 分配菜单权限', async () => { - await roleManagementPage.openPermissionDialog(1); - await roleManagementPage.selectPermission('system:user:view'); - await roleManagementPage.selectPermission('system:user:add'); - await roleManagementPage.selectPermission('system:user:edit'); - await roleManagementPage.submitPermissions(); - await expect(roleManagementPage.successMessage).toBeVisible(); - }); - - await test.step('5. 分配API权限', async () => { - await roleManagementPage.openPermissionDialog(1); - await roleManagementPage.selectPermission('api:user:list'); - await roleManagementPage.selectPermission('api:user:create'); - await roleManagementPage.submitPermissions(); - await expect(roleManagementPage.successMessage).toBeVisible(); - }); - - await test.step('6. 保存角色配置', async () => { - await roleManagementPage.saveRole(); - await expect(roleManagementPage.successMessage).toBeVisible(); - }); - - await test.step('7. 为用户分配角色', async () => { - await dashboardPage.navigateToUserManagement(); - await userManagementPage.editUser(1); - await page.click('.role-select'); - await page.click('option:has-text("业务角色")'); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - }); - - await test.step('8. 用户重新登录', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('9. 验证权限生效', async () => { - await dashboardPage.navigateToUserManagement(); - await expect(page).toHaveURL(/.*users/); - await expect(page.locator('button:has-text("新增")')).toBeVisible(); - }); - - await test.step('10. 查看权限日志', async () => { - await dashboardPage.navigateToOperationLog(); - await expect(page.locator('table')).toContainText('权限'); - }); - }); - - test('UAT-004: 菜单管理场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const menuManagementPage = new MenuManagementPage(page); - const roleManagementPage = new RoleManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 管理员登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 创建父级菜单', async () => { - await dashboardPage.navigateToMenuManagement(); - await menuManagementPage.clickCreateMenu(); - - const menuData = { - menuName: `业务菜单_${timestamp}`, - parentId: '0', - orderNum: '1', - menuType: 'M', - component: `business_${timestamp}`, - perms: `business:view_${timestamp}`, - status: '1', - }; - - await menuManagementPage.fillMenuForm(menuData); - await menuManagementPage.submitForm(); - await expect(menuManagementPage.successMessage).toBeVisible(); - - testDataCleanup.trackMenu(`business_${timestamp}`); - }); - - await test.step('3. 创建子级菜单', async () => { - await menuManagementPage.clickCreateMenu(); - - const menuData = { - menuName: `业务操作_${timestamp}`, - parentId: '1', - orderNum: '1', - menuType: 'C', - component: `business_operation_${timestamp}`, - perms: `business:operation_${timestamp}`, - status: '1', - }; - - await menuManagementPage.fillMenuForm(menuData); - await menuManagementPage.submitForm(); - await expect(menuManagementPage.successMessage).toBeVisible(); - }); - - await test.step('4. 配置菜单权限', async () => { - await menuManagementPage.editMenu(1); - await menuManagementPage.selectPermission('menu:view'); - await menuManagementPage.selectPermission('menu:edit'); - await menuManagementPage.submitForm(); - await expect(menuManagementPage.successMessage).toBeVisible(); - }); - - await test.step('5. 保存菜单配置', async () => { - await menuManagementPage.saveMenu(); - await expect(menuManagementPage.successMessage).toBeVisible(); - }); - - await test.step('6. 为角色分配菜单权限', async () => { - await dashboardPage.navigateToRoleManagement(); - await roleManagementPage.openPermissionDialog(1); - await roleManagementPage.selectPermission(`business:view_${timestamp}`); - await roleManagementPage.submitPermissions(); - await expect(roleManagementPage.successMessage).toBeVisible(); - }); - - await test.step('7. 用户登录系统', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('8. 验证菜单显示', async () => { - await expect(page.locator('.menu-item')).toContainText(`业务菜单_${timestamp}`); - }); - - await test.step('9. 验证菜单访问', async () => { - await page.click(`text=业务菜单_${timestamp}`); - await expect(page).toHaveURL(/.*business/); - }); - - await test.step('10. 验证菜单结构', async () => { - await dashboardPage.navigateToMenuManagement(); - await expect(page.locator('table')).toContainText(`业务菜单_${timestamp}`); - await expect(page.locator('table')).toContainText(`业务操作_${timestamp}`); - }); - }); - - test('UAT-005: 文件管理场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const fileManagementPage = new FileManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 用户登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 导航到文件管理页面', async () => { - await dashboardPage.navigateToFileManagement(); - await expect(fileManagementPage.table).toBeVisible(); - }); - - await test.step('3. 上传文件', async () => { - await fileManagementPage.clickUploadFile(); - const fileInput = page.locator('input[type="file"]'); - await fileInput.setInputFiles('./e2e/fixtures/test-file.txt'); - await fileManagementPage.submitUpload(); - await expect(fileManagementPage.successMessage).toBeVisible(); - }); - - await test.step('4. 验证文件上传成功', async () => { - await expect(page.locator('table')).toContainText('test-file.txt'); - }); - - await test.step('5. 预览文件', async () => { - await fileManagementPage.previewFile(1); - await expect(page.locator('.file-preview')).toBeVisible(); - await expect(page.locator('.file-preview')).toContainText('test'); - }); - - await test.step('6. 下载文件', async () => { - const downloadPromise = page.waitForEvent('download'); - await fileManagementPage.downloadFile(1); - const download = await downloadPromise; - expect(download.suggestedFilename()).toBe('test-file.txt'); - }); - - await test.step('7. 验证文件内容', async () => { - await fileManagementPage.previewFile(1); - const content = await page.locator('.file-preview').textContent(); - expect(content).toContain('test'); - }); - - await test.step('8. 设置文件权限', async () => { - await fileManagementPage.editFile(1); - await page.selectOption('select[name="permission"]', 'private'); - await fileManagementPage.submitForm(); - await expect(fileManagementPage.successMessage).toBeVisible(); - }); - - await test.step('9. 删除文件', async () => { - await fileManagementPage.deleteFile(1); - await fileManagementPage.confirmDelete(); - await expect(fileManagementPage.successMessage).toBeVisible(); - }); - - await test.step('10. 验证文件删除', async () => { - await page.reload(); - await expect(page.locator('table')).not.toContainText('test-file.txt'); - }); - }); - - test('UAT-006: 系统配置管理场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const systemConfigPage = new SystemConfigPage(page); - const timestamp = Date.now(); - - await test.step('1. 管理员登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 导航到系统配置页面', async () => { - await dashboardPage.navigateToSystemConfig(); - await expect(systemConfigPage.table).toBeVisible(); - }); - - await test.step('3. 查看当前配置', async () => { - const configCount = await page.locator('table tbody tr').count(); - expect(configCount).toBeGreaterThan(0); - }); - - await test.step('4. 修改配置项', async () => { - await systemConfigPage.editConfig(1); - await page.fill('input[name="configValue"]', `test_config_${timestamp}`); - await systemConfigPage.submitForm(); - await expect(systemConfigPage.successMessage).toBeVisible(); - }); - - await test.step('5. 验证配置有效性', async () => { - await systemConfigPage.editConfig(1); - await expect(page.locator('input[name="configValue"]')).toHaveValue(`test_config_${timestamp}`); - }); - - await test.step('6. 保存配置', async () => { - await systemConfigPage.submitForm(); - await expect(systemConfigPage.successMessage).toBeVisible(); - }); - - await test.step('7. 验证配置生效', async () => { - await page.reload(); - await expect(page.locator('table')).toContainText(`test_config_${timestamp}`); - }); - - await test.step('8. 刷新配置缓存', async () => { - await systemConfigPage.refreshCache(); - await expect(systemConfigPage.successMessage).toBeVisible(); - }); - - await test.step('9. 查看配置日志', async () => { - await dashboardPage.navigateToOperationLog(); - await expect(page.locator('table')).toContainText('配置'); - }); - - await test.step('10. 恢复默认配置', async () => { - await dashboardPage.navigateToSystemConfig(); - await systemConfigPage.editConfig(1); - await page.fill('input[name="configValue"]', 'default_value'); - await systemConfigPage.submitForm(); - await expect(systemConfigPage.successMessage).toBeVisible(); - }); - }); - - test('UAT-007: 审计日志查询场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const operationLogPage = new OperationLogPage(page); - - await test.step('1. 审计员登录系统', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('2. 导航到审计日志页面', async () => { - await dashboardPage.navigateToOperationLog(); - await expect(operationLogPage.table).toBeVisible(); - }); - - await test.step('3. 查看操作日志', async () => { - await expect(page.locator('table')).toContainText('操作'); - }); - - await test.step('4. 查看登录日志', async () => { - await operationLogPage.switchToLoginLog(); - await expect(page.locator('table')).toContainText('登录'); - }); - - await test.step('5. 查看异常日志', async () => { - await operationLogPage.switchToExceptionLog(); - await expect(operationLogPage.table).toBeVisible(); - }); - - await test.step('6. 搜索日志', async () => { - await operationLogPage.search('admin'); - await page.waitForTimeout(2000); - await expect(page.locator('table')).toContainText('admin'); - }); - - await test.step('7. 导出日志', async () => { - const downloadPromise = page.waitForEvent('download'); - await operationLogPage.exportLogs(); - const download = await downloadPromise; - expect(download.suggestedFilename()).toMatch(/logs.*\.xlsx/); - }); - - await test.step('8. 验证日志准确性', async () => { - const logCount = await page.locator('table tbody tr').count(); - expect(logCount).toBeGreaterThan(0); - }); - - await test.step('9. 生成审计报告', async () => { - await operationLogPage.generateReport(); - await expect(operationLogPage.successMessage).toBeVisible(); - }); - - await test.step('10. 验证报告内容', async () => { - await expect(page.locator('.report-content')).toBeVisible(); - }); - }); - - test('UAT-008: 通知中心使用场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const notificationPage = new NotificationPage(page); - const timestamp = Date.now(); - - await test.step('1. 管理员发布系统通知', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await dashboardPage.navigateToNotification(); - await notificationPage.clickCreateNotification(); - - const notificationData = { - title: `系统通知_${timestamp}`, - content: `这是一条重要的系统通知_${timestamp}`, - type: 'system', - status: '1', - }; - - await notificationPage.fillNotificationForm(notificationData); - await notificationPage.submitForm(); - await expect(notificationPage.successMessage).toBeVisible(); - }); - - await test.step('2. 用户登录系统', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('3. 查看通知列表', async () => { - await dashboardPage.navigateToNotification(); - await expect(page.locator('.notification-list')).toBeVisible(); - await expect(page.locator('.notification-list')).toContainText(`系统通知_${timestamp}`); - }); - - await test.step('4. 查看通知详情', async () => { - await notificationPage.viewNotification(1); - await expect(page.locator('.notification-detail')).toBeVisible(); - await expect(page.locator('.notification-detail')).toContainText(`系统通知_${timestamp}`); - }); - - await test.step('5. 标记通知已读', async () => { - await notificationPage.markAsRead(1); - await expect(notificationPage.successMessage).toBeVisible(); - }); - - await test.step('6. 验证通知状态', async () => { - await page.reload(); - await expect(page.locator('.notification-item.read')).toBeVisible(); - }); - - await test.step('7. 删除通知', async () => { - await notificationPage.deleteNotification(1); - await notificationPage.confirmDelete(); - await expect(notificationPage.successMessage).toBeVisible(); - }); - - await test.step('8. 验证通知删除', async () => { - await page.reload(); - await expect(page.locator('.notification-list')).not.toContainText(`系统通知_${timestamp}`); - }); - - await test.step('9. 验证通知推送', async () => { - await notificationPage.clickCreateNotification(); - const notificationData = { - title: `推送通知_${timestamp}`, - content: `这是一条推送通知_${timestamp}`, - type: 'push', - status: '1', - }; - await notificationPage.fillNotificationForm(notificationData); - await notificationPage.submitForm(); - await expect(notificationPage.successMessage).toBeVisible(); - }); - - await test.step('10. 查看通知历史', async () => { - await page.reload(); - await expect(page.locator('.notification-list')).toContainText(`推送通知_${timestamp}`); - }); - }); - - test('UAT-009: 字典数据使用场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const dictionaryManagementPage = new DictionaryManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 管理员配置字典数据', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await dashboardPage.navigateToDictionary(); - await dictionaryManagementPage.clickCreateDictType(); - - const dictTypeData = { - dictName: `业务字典_${timestamp}`, - dictType: `business_dict_${timestamp}`, - status: '1', - remark: `业务字典类型_${timestamp}`, - }; - - await dictionaryManagementPage.fillDictTypeForm(dictTypeData); - await dictionaryManagementPage.submitForm(); - await expect(dictionaryManagementPage.successMessage).toBeVisible(); - - testDataCleanup.trackDictType(`business_dict_${timestamp}`); - }); - - await test.step('2. 用户登录系统', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('3. 查看字典数据', async () => { - await dashboardPage.navigateToDictionary(); - await expect(page.locator('table')).toContainText(`业务字典_${timestamp}`); - }); - - await test.step('4. 使用字典数据', async () => { - await dictionaryManagementPage.clickCreateDictData(); - const dictData = { - dictLabel: `业务数据1_${timestamp}`, - dictValue: `business_value1_${timestamp}`, - dictSort: '1', - status: '1', - }; - await dictionaryManagementPage.fillDictDataForm(dictData); - await dictionaryManagementPage.submitForm(); - await expect(dictionaryManagementPage.successMessage).toBeVisible(); - }); - - await test.step('5. 验证数据正确性', async () => { - await page.reload(); - await expect(page.locator('table')).toContainText(`业务数据1_${timestamp}`); - }); - - await test.step('6. 管理员更新字典数据', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await dashboardPage.navigateToDictionary(); - await dictionaryManagementPage.editDictData(1); - await page.fill('input[name="dictLabel"]', `更新数据_${timestamp}`); - await dictionaryManagementPage.submitForm(); - await expect(dictionaryManagementPage.successMessage).toBeVisible(); - }); - - await test.step('7. 用户刷新页面', async () => { - await page.reload(); - await expect(page.locator('table')).toContainText(`更新数据_${timestamp}`); - }); - - await test.step('8. 验证数据更新', async () => { - await expect(page.locator('table')).toContainText(`更新数据_${timestamp}`); - }); - - await test.step('9. 验证数据缓存', async () => { - await dictionaryManagementPage.refreshCache(); - await expect(dictionaryManagementPage.successMessage).toBeVisible(); - }); - - await test.step('10. 验证数据一致性', async () => { - await page.reload(); - await expect(page.locator('table')).toContainText(`更新数据_${timestamp}`); - }); - }); - - test('UAT-010: 多用户协作场景', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - const userManagementPage = new UserManagementPage(page); - const timestamp = Date.now(); - - await test.step('1. 创建测试用户A', async () => { - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await dashboardPage.navigateToUserManagement(); - await userManagementPage.clickCreateUser(); - const userData = { - username: `user_a_${timestamp}`, - nickname: `用户A_${timestamp}`, - email: `user_a_${timestamp}@example.com`, - phone: '13800138000', - password: 'Test123!@#', - confirmPassword: 'Test123!@#', - }; - await userManagementPage.fillUserForm(userData); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - - testDataCleanup.trackUser(`user_a_${timestamp}`); - }); - - await test.step('2. 创建测试用户B', async () => { - await userManagementPage.clickCreateUser(); - const userData = { - username: `user_b_${timestamp}`, - nickname: `用户B_${timestamp}`, - email: `user_b_${timestamp}@example.com`, - phone: '13800138000', - password: 'Test123!@#', - confirmPassword: 'Test123!@#', - }; - await userManagementPage.fillUserForm(userData); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - - testDataCleanup.trackUser(`user_b_${timestamp}`); - }); - - await test.step('3. 多用户同时登录', async () => { - await loginPage.logout(); - await loginPage.goto(); - await loginPage.login('admin', 'admin123'); - await expect(page).toHaveURL(/.*dashboard/); - }); - - await test.step('4. 用户A创建数据', async () => { - await dashboardPage.navigateToUserManagement(); - await userManagementPage.clickCreateUser(); - const userData = { - username: `data_a_${timestamp}`, - nickname: `数据A_${timestamp}`, - email: `data_a_${timestamp}@example.com`, - phone: '13800138000', - password: 'Test123!@#', - confirmPassword: 'Test123!@#', - }; - await userManagementPage.fillUserForm(userData); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - }); - - await test.step('5. 用户B同时创建数据', async () => { - await userManagementPage.clickCreateUser(); - const userData = { - username: `data_b_${timestamp}`, - nickname: `数据B_${timestamp}`, - email: `data_b_${timestamp}@example.com`, - phone: '13800138000', - password: 'Test123!@#', - confirmPassword: 'Test123!@#', - }; - await userManagementPage.fillUserForm(userData); - await userManagementPage.submitForm(); - await expect(userManagementPage.successMessage).toBeVisible(); - }); - - await test.step('6. 验证数据一致性', async () => { - await page.reload(); - await expect(page.locator('table')).toContainText(`data_a_${timestamp}`); - await expect(page.locator('table')).toContainText(`data_b_${timestamp}`); - }); - - await test.step('7. 验证并发处理', async () => { - const userCount = await userManagementPage.getUserCount(); - expect(userCount).toBeGreaterThanOrEqual(2); - }); - - await test.step('8. 查看操作日志', async () => { - await dashboardPage.navigateToOperationLog(); - await expect(page.locator('table')).toContainText('创建'); - }); - - await test.step('9. 验证日志完整性', async () => { - const logCount = await page.locator('table tbody tr').count(); - expect(logCount).toBeGreaterThan(0); - }); - - await test.step('10. 清理测试数据', async () => { - await dashboardPage.navigateToUserManagement(); - await userManagementPage.search(`user_a_${timestamp}`); - await page.waitForTimeout(1000); - const rows = await page.locator('table tbody tr').count(); - if (rows > 0) { - await userManagementPage.deleteUser(1); - await userManagementPage.confirmDelete(); - } - }); - }); -}); \ No newline at end of file diff --git a/novalon-manage-web/e2e/uat-phase1.spec.ts b/novalon-manage-web/e2e/uat-phase1.spec.ts deleted file mode 100644 index 179c9c7..0000000 --- a/novalon-manage-web/e2e/uat-phase1.spec.ts +++ /dev/null @@ -1,205 +0,0 @@ -import { test, expect } from '@playwright/test'; -import { LoginPage } from './pages/LoginPage'; -import { DashboardPage } from './pages/DashboardPage'; - -test.describe('UAT阶段一:核心功能验证', () => { - test.slow(); - - test('UAT-AUTH-001: 成功登录流程', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - - await test.step('访问登录页面', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await expect(page).toHaveTitle(/登录/); - }); - - await test.step('输入用户名和密码', async () => { - await loginPage.usernameInput.fill('admin'); - await loginPage.passwordInput.fill('admin123'); - }); - - await test.step('点击登录按钮', async () => { - await loginPage.loginButton.click(); - }); - - await test.step('验证登录成功', async () => { - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - const username = await dashboardPage.getUsername(); - expect(username).toContain('admin'); - }); - }); - - test('UAT-AUTH-002: 登录失败 - 无效凭证', async ({ page }) => { - const loginPage = new LoginPage(page); - - await test.step('访问登录页面', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await expect(page).toHaveTitle(/登录/); - }); - - await test.step('输入无效凭证', async () => { - await loginPage.usernameInput.fill('invalid'); - await loginPage.passwordInput.fill('invalid'); - await loginPage.loginButton.click(); - }); - - await test.step('验证错误消息显示', async () => { - await page.waitForTimeout(2000); - const currentUrl = page.url(); - expect(currentUrl).toContain('/login'); - }); - - await test.step('验证保持在登录页面', async () => { - await expect(page).toHaveURL(/.*login/); - }); - }); - - test('UAT-AUTH-003: 登出流程', async ({ page }) => { - const loginPage = new LoginPage(page); - - await test.step('登录系统', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await loginPage.usernameInput.fill('admin'); - await loginPage.passwordInput.fill('admin123'); - await loginPage.loginButton.click(); - await page.waitForURL(/.*dashboard/, { timeout: 30000 }); - }); - - await test.step('点击用户头像', async () => { - const avatar = page.locator('.el-avatar'); - await avatar.click(); - await page.waitForSelector('.el-dropdown-menu', { state: 'visible' }); - }); - - await test.step('点击退出登录', async () => { - const logoutButton = page.locator('.el-dropdown-menu').getByText('退出登录'); - await logoutButton.click(); - }); - - await test.step('验证跳转到登录页面', async () => { - await page.waitForURL(/.*login/, { timeout: 30000 }); - await expect(page).toHaveTitle(/登录/); - }); - }); - - test('UAT-NAV-001: 系统管理菜单导航', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - - await test.step('登录系统', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await loginPage.usernameInput.fill('admin'); - await loginPage.passwordInput.fill('admin123'); - await loginPage.loginButton.click(); - await page.waitForURL(/.*dashboard/, { timeout: 30000 }); - }); - - await test.step('点击系统管理菜单', async () => { - const systemMenu = page.locator('.el-sub-menu').filter({ hasText: '系统管理' }); - await systemMenu.click(); - await page.waitForLoadState('networkidle'); - }); - - await test.step('点击用户管理', async () => { - await dashboardPage.userManagementLink.click(); - }); - - await test.step('验证页面跳转', async () => { - await page.waitForURL(/.*users/, { timeout: 30000 }); - await expect(page).toHaveURL(/.*users/); - }); - }); - - test('UAT-NAV-002: 角色管理菜单导航', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - - await test.step('登录系统', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await loginPage.usernameInput.fill('admin'); - await loginPage.passwordInput.fill('admin123'); - await loginPage.loginButton.click(); - await page.waitForURL(/.*dashboard/, { timeout: 30000 }); - }); - - await test.step('点击系统管理菜单', async () => { - const systemMenu = page.locator('.el-sub-menu').filter({ hasText: '系统管理' }); - await systemMenu.click(); - await page.waitForLoadState('networkidle'); - }); - - await test.step('点击角色管理', async () => { - await dashboardPage.roleManagementLink.click(); - }); - - await test.step('验证页面跳转', async () => { - await page.waitForURL(/.*roles/, { timeout: 30000 }); - await expect(page).toHaveURL(/.*roles/); - }); - }); - - test('UAT-NAV-003: 菜单管理菜单导航', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - - await test.step('登录系统', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await loginPage.usernameInput.fill('admin'); - await loginPage.passwordInput.fill('admin123'); - await loginPage.loginButton.click(); - await page.waitForURL(/.*dashboard/, { timeout: 30000 }); - }); - - await test.step('点击系统管理菜单', async () => { - const systemMenu = page.locator('.el-sub-menu').filter({ hasText: '系统管理' }); - await systemMenu.click(); - await page.waitForLoadState('networkidle'); - }); - - await test.step('点击菜单管理', async () => { - await dashboardPage.menuManagementLink.click(); - }); - - await test.step('验证页面跳转', async () => { - await page.waitForURL(/.*menus/, { timeout: 30000 }); - await expect(page).toHaveURL(/.*menus/); - }); - }); - - test('UAT-NAV-004: 系统配置菜单导航', async ({ page }) => { - const loginPage = new LoginPage(page); - const dashboardPage = new DashboardPage(page); - - await test.step('登录系统', async () => { - await loginPage.goto(); - await page.waitForLoadState('networkidle'); - await loginPage.usernameInput.fill('admin'); - await loginPage.passwordInput.fill('admin123'); - await loginPage.loginButton.click(); - await page.waitForURL(/.*dashboard/, { timeout: 30000 }); - }); - - await test.step('点击系统配置菜单', async () => { - const configMenu = page.locator('.el-sub-menu').filter({ hasText: '系统配置' }); - await configMenu.click(); - await page.waitForLoadState('networkidle'); - }); - - await test.step('点击参数配置', async () => { - await dashboardPage.systemConfigLink.click(); - }); - - await test.step('验证页面跳转', async () => { - await page.waitForURL(/.*sys\/config/, { timeout: 30000 }); - await expect(page).toHaveURL(/.*sys\/config/); - }); - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase2-user.spec.ts b/novalon-manage-web/e2e/uat-phase2-user.spec.ts deleted file mode 100644 index 4a308e9..0000000 --- a/novalon-manage-web/e2e/uat-phase2-user.spec.ts +++ /dev/null @@ -1,78 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段二:用户管理功能验证', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-USER-001: 用户列表加载', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 }); - await expect(page.locator('.el-table__body-wrapper')).toBeVisible(); - }); - - test('UAT-USER-002: 用户搜索功能', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const searchInput = page.locator('input[placeholder*="搜索"]').first(); - if (await searchInput.isVisible()) { - await searchInput.fill('admin'); - await page.waitForTimeout(1000); - - await expect(page.locator('.el-table')).toBeVisible(); - } - }); - - test('UAT-USER-003: 新增用户表单验证', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - await expect(page.locator('.el-dialog')).toBeVisible(); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - if (await confirmButton.isVisible()) { - await confirmButton.click(); - await page.waitForTimeout(500); - - const formErrors = page.locator('.el-form-item__error'); - const errorCount = await formErrors.count(); - expect(errorCount).toBeGreaterThan(0); - } - } - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase3-role.spec.ts b/novalon-manage-web/e2e/uat-phase3-role.spec.ts deleted file mode 100644 index b5667d7..0000000 --- a/novalon-manage-web/e2e/uat-phase3-role.spec.ts +++ /dev/null @@ -1,91 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段三:角色管理功能验证', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-ROLE-001: 角色列表加载', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 }); - }); - - test('UAT-ROLE-002: 新增角色表单验证', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - await expect(page.locator('.el-dialog')).toBeVisible(); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - if (await roleNameInput.isVisible()) { - await roleNameInput.fill('测试角色'); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - if (await roleKeyInput.isVisible()) { - await roleKeyInput.fill('test_role'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - if (await confirmButton.isVisible()) { - await confirmButton.click(); - await page.waitForTimeout(1000); - } - } - } - } - }); - - test('UAT-ROLE-003: 角色权限分配', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const permissionButton = page.locator('button:has-text("权限")').first(); - if (await permissionButton.isVisible()) { - await permissionButton.click(); - await page.waitForTimeout(500); - - await expect(page.locator('.el-dialog')).toBeVisible(); - - const tree = page.locator('.el-tree'); - if (await tree.isVisible()) { - const firstCheckbox = tree.locator('.el-checkbox').first(); - if (await firstCheckbox.isVisible()) { - await firstCheckbox.click(); - } - } - } - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase4-menu.spec.ts b/novalon-manage-web/e2e/uat-phase4-menu.spec.ts deleted file mode 100644 index 7a0d8fd..0000000 --- a/novalon-manage-web/e2e/uat-phase4-menu.spec.ts +++ /dev/null @@ -1,110 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段四:菜单管理功能验证', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-MENU-001: 菜单树形结构展示', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=菜单管理'); - await page.waitForURL('**/menus', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 }); - - await page.waitForTimeout(1000); - - const tableBody = page.locator('.el-table__body-wrapper'); - await expect(tableBody).toBeVisible(); - - const emptyText = page.locator('text=暂无数据'); - const hasEmptyText = await emptyText.isVisible().catch(() => false); - - if (!hasEmptyText) { - const treeNodes = page.locator('.el-table__row'); - const count = await treeNodes.count(); - expect(count).toBeGreaterThanOrEqual(0); - } - }); - - test('UAT-MENU-002: 新增菜单表单验证', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=菜单管理'); - await page.waitForURL('**/menus', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - await expect(page.locator('.el-dialog')).toBeVisible(); - - const menuNameInput = page.locator('.el-dialog input[placeholder*="菜单名称"]').first(); - if (await menuNameInput.isVisible()) { - await menuNameInput.fill('测试菜单'); - - const permsInput = page.locator('.el-dialog input[placeholder*="路由地址"]').first(); - if (await permsInput.isVisible()) { - await permsInput.fill('/test-menu'); - - const componentInput = page.locator('.el-dialog input[placeholder*="组件路径"]').first(); - if (await componentInput.isVisible()) { - await componentInput.fill('views/test/TestMenu.vue'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - if (await confirmButton.isVisible()) { - await confirmButton.click(); - await page.waitForTimeout(1000); - } - } - } - } - } - }); - - test('UAT-MENU-003: 菜单类型选择', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=菜单管理'); - await page.waitForURL('**/menus', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const menuTypeSelect = page.locator('.el-dialog .el-select').first(); - if (await menuTypeSelect.isVisible()) { - await menuTypeSelect.click(); - await page.waitForTimeout(300); - - const options = page.locator('.el-select-dropdown__item'); - const count = await options.count(); - expect(count).toBeGreaterThan(0); - } - } - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase5-api.spec.ts b/novalon-manage-web/e2e/uat-phase5-api.spec.ts deleted file mode 100644 index 6c5e25b..0000000 --- a/novalon-manage-web/e2e/uat-phase5-api.spec.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段五:API交互与错误处理验证', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-API-001: Token过期处理', async ({ page }) => { - await page.evaluate(() => { - localStorage.removeItem('token'); - }); - - await page.goto('/users'); - await page.waitForTimeout(2000); - - const currentUrl = page.url(); - expect(currentUrl).toContain('/login'); - }); - - test('UAT-API-002: 网络错误提示', async ({ page, context }) => { - await context.route('**/api/**', route => route.abort('failed')); - - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForTimeout(2000); - - await context.unroute('**/api/**'); - }); - - test('UAT-API-003: 权限不足提示', async ({ page }) => { - await page.evaluate(() => { - localStorage.setItem('token', 'user_token_without_admin_rights'); - }); - - await page.goto('/roles'); - await page.waitForTimeout(1000); - - const errorMessage = page.locator('.el-message--error'); - if (await errorMessage.isVisible()) { - await expect(errorMessage).toBeVisible(); - } - }); - - test('UAT-API-004: 并发请求处理', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - - const refreshButton = page.locator('button:has-text("刷新")').first(); - if (await refreshButton.isVisible()) { - for (let i = 0; i < 3; i++) { - await refreshButton.click(); - await page.waitForTimeout(100); - } - - await page.waitForTimeout(1000); - await expect(page.locator('.el-table')).toBeVisible(); - } - }); - - test('UAT-API-005: 数据加载状态显示', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - const navigationPromise = page.click('text=用户管理'); - - const loading = page.locator('.el-loading-mask'); - if (await loading.isVisible({ timeout: 100 }).catch(() => false)) { - await expect(loading).toBeVisible(); - } - - await navigationPromise; - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - await expect(page.locator('.el-table')).toBeVisible(); - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase6-persistence.spec.ts b/novalon-manage-web/e2e/uat-phase6-persistence.spec.ts deleted file mode 100644 index 5b41781..0000000 --- a/novalon-manage-web/e2e/uat-phase6-persistence.spec.ts +++ /dev/null @@ -1,191 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段六:数据持久化验证', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-PERSIST-001: 角色创建持久化验证', async ({ page }) => { - const timestamp = Date.now(); - const roleName = `测试角色_${timestamp}`; - const roleKey = `test_role_${timestamp}`; - - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - await roleNameInput.fill(roleName); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - await roleKeyInput.fill(roleKey); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - await page.reload(); - await page.waitForLoadState('networkidle'); - await page.waitForTimeout(1000); - - const createdRole = page.locator(`text=${roleName}`); - await expect(createdRole).toBeVisible({ timeout: 5000 }); - } - }); - - test('UAT-PERSIST-002: 用户创建持久化验证', async ({ page }) => { - const timestamp = Date.now(); - const username = `testuser_${timestamp}`; - - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const usernameInput = page.locator('.el-dialog input[placeholder*="用户名"]').first(); - await usernameInput.fill(username); - - const nicknameInput = page.locator('.el-dialog input[placeholder*="昵称"]').first(); - await nicknameInput.fill(`测试用户_${timestamp}`); - - const emailInput = page.locator('.el-dialog input[placeholder*="邮箱"]').first(); - await emailInput.fill(`${username}@test.com`); - - const phoneInput = page.locator('.el-dialog input[placeholder*="手机"]').first(); - await phoneInput.fill('13800138000'); - - const passwordInput = page.locator('.el-dialog input[placeholder*="密码"]').first(); - await passwordInput.fill('Test123456'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - await page.reload(); - await page.waitForLoadState('networkidle'); - await page.waitForTimeout(1000); - - const searchInput = page.locator('input[placeholder*="搜索"]').first(); - if (await searchInput.isVisible()) { - await searchInput.fill(username); - await page.waitForTimeout(1000); - - const createdUser = page.locator(`text=${username}`); - await expect(createdUser).toBeVisible({ timeout: 5000 }); - } - } - }); - - test('UAT-PERSIST-003: 数据更新持久化验证', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const editButton = page.locator('button:has-text("编辑")').first(); - if (await editButton.isVisible()) { - await editButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - const currentValue = await roleNameInput.inputValue(); - const newValue = `${currentValue}_已修改_${Date.now()}`; - - await roleNameInput.fill(newValue); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - await page.reload(); - await page.waitForLoadState('networkidle'); - await page.waitForTimeout(1000); - - const updatedRole = page.locator(`text=${newValue}`); - await expect(updatedRole).toBeVisible({ timeout: 5000 }); - } - }); - - test('UAT-PERSIST-004: 数据删除持久化验证', async ({ page }) => { - const timestamp = Date.now(); - const roleName = `待删除角色_${timestamp}`; - - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - await roleNameInput.fill(roleName); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - await roleKeyInput.fill(`delete_test_${timestamp}`); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - const createdRole = page.locator(`text=${roleName}`); - await createdRole.scrollIntoViewIfNeeded(); - - const deleteButton = page.locator(`tr:has-text("${roleName}") button:has-text("删除")`).first(); - if (await deleteButton.isVisible()) { - await deleteButton.click(); - await page.waitForTimeout(500); - - const confirmDeleteButton = page.locator('.el-message-box button:has-text("确定")'); - if (await confirmDeleteButton.isVisible()) { - await confirmDeleteButton.click(); - await page.waitForTimeout(1000); - - await page.reload(); - await page.waitForLoadState('networkidle'); - await page.waitForTimeout(1000); - - const deletedRole = page.locator(`text=${roleName}`); - await expect(deletedRole).not.toBeVisible({ timeout: 5000 }); - } - } - } - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase7-boundary.spec.ts b/novalon-manage-web/e2e/uat-phase7-boundary.spec.ts deleted file mode 100644 index 093d751..0000000 --- a/novalon-manage-web/e2e/uat-phase7-boundary.spec.ts +++ /dev/null @@ -1,228 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段七:边界条件与异常输入测试', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-BOUNDARY-001: 用户名超长输入测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const usernameInput = page.locator('.el-dialog input[placeholder*="用户名"]').first(); - const longUsername = 'a'.repeat(300); - await usernameInput.fill(longUsername); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const errorMessage = page.locator('.el-form-item__error, .el-message--error'); - const hasError = await errorMessage.isVisible().catch(() => false); - expect(hasError).toBeTruthy(); - } - }); - - test('UAT-BOUNDARY-002: 特殊字符输入测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - await roleNameInput.fill(''); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - await roleKeyInput.fill("'; DROP TABLE roles; --"); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const errorMessage = page.locator('.el-form-item__error, .el-message--error'); - const hasError = await errorMessage.isVisible().catch(() => false); - - if (!hasError) { - const cancelButton = page.locator('.el-dialog button:has-text("取消")'); - await cancelButton.click(); - } - } - }); - - test('UAT-BOUNDARY-003: 空值输入测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const formErrors = page.locator('.el-form-item__error'); - const errorCount = await formErrors.count(); - expect(errorCount).toBeGreaterThan(0); - } - }); - - test('UAT-BOUNDARY-004: 邮箱格式验证测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const emailInput = page.locator('.el-dialog input[placeholder*="邮箱"]').first(); - await emailInput.fill('invalid-email'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const emailError = page.locator('.el-form-item__error:has-text("邮箱")'); - const hasError = await emailError.isVisible().catch(() => false); - expect(hasError).toBeTruthy(); - } - }); - - test('UAT-BOUNDARY-005: 手机号格式验证测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const phoneInput = page.locator('.el-dialog input[placeholder*="手机"]').first(); - await phoneInput.fill('123'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const phoneError = page.locator('.el-form-item__error:has-text("手机")'); - const hasError = await phoneError.isVisible().catch(() => false); - expect(hasError).toBeTruthy(); - } - }); - - test('UAT-BOUNDARY-006: Emoji表情输入测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - await roleNameInput.fill('测试角色😀🎉🔥'); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - await roleKeyInput.fill('test_emoji_role'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - const errorMessage = page.locator('.el-message--error'); - const hasError = await errorMessage.isVisible().catch(() => false); - - if (!hasError) { - const cancelButton = page.locator('.el-dialog button:has-text("取消")'); - if (await cancelButton.isVisible()) { - await cancelButton.click(); - } - } - } - }); - - test('UAT-BOUNDARY-007: 数字输入边界测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const sortInput = page.locator('.el-dialog input[type="number"]').first(); - if (await sortInput.isVisible()) { - await sortInput.fill('-1'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const errorMessage = page.locator('.el-form-item__error'); - const hasError = await errorMessage.isVisible().catch(() => false); - - if (!hasError) { - const cancelButton = page.locator('.el-dialog button:has-text("取消")'); - await cancelButton.click(); - } - } - } - }); -}); diff --git a/novalon-manage-web/e2e/uat-phase8-security.spec.ts b/novalon-manage-web/e2e/uat-phase8-security.spec.ts deleted file mode 100644 index cc4daed..0000000 --- a/novalon-manage-web/e2e/uat-phase8-security.spec.ts +++ /dev/null @@ -1,195 +0,0 @@ -import { test, expect } from '@playwright/test'; - -test.describe('UAT阶段八:安全测试', () => { - test.beforeEach(async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const usernameInput = page.locator('input[type="text"]').first(); - const passwordInput = page.locator('input[type="password"]').first(); - const loginButton = page.locator('button:has-text("登录")'); - - await usernameInput.fill('admin'); - await passwordInput.fill('admin123'); - await loginButton.click(); - - await page.waitForURL('**/dashboard', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - }); - - test('UAT-SECURITY-001: XSS攻击防护测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - const xssPayload = ''; - await roleNameInput.fill(xssPayload); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - await roleKeyInput.fill('xss_test'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - const errorMessage = page.locator('.el-form-item__error, .el-message--error'); - const hasError = await errorMessage.isVisible().catch(() => false); - - if (!hasError) { - const cancelButton = page.locator('.el-dialog button:has-text("取消")'); - if (await cancelButton.isVisible()) { - await cancelButton.click(); - } - } - - expect(hasError).toBeTruthy(); - } - }); - - test('UAT-SECURITY-002: SQL注入防护测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const searchInput = page.locator('input[placeholder*="搜索"]').first(); - if (await searchInput.isVisible()) { - await searchInput.fill("admin' OR '1'='1"); - await page.waitForTimeout(1000); - - await expect(page.locator('.el-table')).toBeVisible(); - - const allRows = await page.locator('.el-table__row').count(); - expect(allRows).toBeLessThan(100); - } - }); - - test('UAT-SECURITY-003: 未授权访问测试', async ({ page }) => { - await page.evaluate(() => { - localStorage.removeItem('token'); - }); - - await page.goto('/users'); - await page.waitForTimeout(2000); - - const currentUrl = page.url(); - expect(currentUrl).toContain('/login'); - }); - - test('UAT-SECURITY-004: CSRF防护测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=角色管理'); - await page.waitForURL('**/roles', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const roleNameInput = page.locator('.el-dialog input[placeholder*="角色名称"]').first(); - await roleNameInput.fill('CSRF测试角色'); - - const roleKeyInput = page.locator('.el-dialog input[placeholder*="角色标识"]').first(); - await roleKeyInput.fill('csrf_test'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(1000); - - const successMessage = page.locator('.el-message--success'); - const errorMessage = page.locator('.el-message--error'); - - const hasSuccess = await successMessage.isVisible().catch(() => false); - const hasError = await errorMessage.isVisible().catch(() => false); - - expect(hasSuccess || hasError).toBeTruthy(); - } - }); - - test('UAT-SECURITY-005: 密码强度验证测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - const addButton = page.locator('button:has-text("新增用户")').first(); - if (await addButton.isVisible()) { - await addButton.click(); - await page.waitForTimeout(500); - - const usernameInput = page.locator('.el-dialog input[placeholder*="用户名"]').first(); - await usernameInput.fill('testuser'); - - const passwordInput = page.locator('.el-dialog input[placeholder*="密码"]').first(); - await passwordInput.fill('123'); - - const confirmButton = page.locator('.el-dialog button:has-text("确定")'); - await confirmButton.click(); - await page.waitForTimeout(500); - - const passwordError = page.locator('.el-form-item__error'); - const hasError = await passwordError.isVisible().catch(() => false); - - expect(hasError).toBeTruthy(); - } - }); - - test('UAT-SECURITY-006: 敏感信息泄露测试', async ({ page }) => { - await page.goto('/'); - await page.waitForLoadState('networkidle'); - - const pageContent = await page.content(); - - expect(pageContent).not.toContain('password'); - expect(pageContent).not.toContain('secret'); - expect(pageContent).not.toContain('api_key'); - expect(pageContent).not.toContain('private_key'); - }); - - test('UAT-SECURITY-007: 会话超时测试', async ({ page }) => { - const systemMenu = page.locator('.el-sub-menu__title:has-text("系统管理")'); - await systemMenu.click(); - await page.waitForTimeout(1000); - - await page.click('text=用户管理'); - await page.waitForURL('**/users', { timeout: 30000 }); - await page.waitForLoadState('networkidle'); - - await page.evaluate(() => { - const token = localStorage.getItem('token'); - if (token) { - const expiredToken = token.replace(/\.(.*?)\./, '.expired.'); - localStorage.setItem('token', expiredToken); - } - }); - - await page.reload(); - await page.waitForTimeout(2000); - - const currentUrl = page.url(); - const isLoginPage = currentUrl.includes('/login'); - const hasError = await page.locator('.el-message--error').isVisible().catch(() => false); - - expect(isLoginPage || hasError).toBeTruthy(); - }); -});