diff --git a/gym-manage-web/e2e/README.md b/e2e-tests/README.md similarity index 100% rename from gym-manage-web/e2e/README.md rename to e2e-tests/README.md diff --git a/gym-manage-web/e2e/api-connectivity.spec.ts b/e2e-tests/api-connectivity.spec.ts similarity index 100% rename from gym-manage-web/e2e/api-connectivity.spec.ts rename to e2e-tests/api-connectivity.spec.ts diff --git a/gym-manage-web/e2e/auth-test.spec.ts b/e2e-tests/auth-test.spec.ts similarity index 100% rename from gym-manage-web/e2e/auth-test.spec.ts rename to e2e-tests/auth-test.spec.ts diff --git a/gym-manage-web/e2e/auth.setup.ts b/e2e-tests/auth.setup.ts similarity index 100% rename from gym-manage-web/e2e/auth.setup.ts rename to e2e-tests/auth.setup.ts diff --git a/gym-manage-web/e2e/basic-ui-test.spec.ts b/e2e-tests/basic-ui-test.spec.ts similarity index 100% rename from gym-manage-web/e2e/basic-ui-test.spec.ts rename to e2e-tests/basic-ui-test.spec.ts diff --git a/gym-manage-web/e2e/config-management.spec.ts b/e2e-tests/config-management.spec.ts similarity index 100% rename from gym-manage-web/e2e/config-management.spec.ts rename to e2e-tests/config-management.spec.ts diff --git a/gym-manage-web/e2e/customReporter.ts b/e2e-tests/customReporter.ts similarity index 100% rename from gym-manage-web/e2e/customReporter.ts rename to e2e-tests/customReporter.ts diff --git a/e2e-tests/debug/create-role-debug.spec.ts b/e2e-tests/debug/create-role-debug.spec.ts new file mode 100644 index 0000000..d5132d3 --- /dev/null +++ b/e2e-tests/debug/create-role-debug.spec.ts @@ -0,0 +1,87 @@ +import { test, expect } from '@playwright/test'; + +test.describe('调试创建角色功能', () => { + test('调试创建角色流程', async ({ page }) => { + const timestamp = Date.now(); + const roleName = `测试角色_${timestamp}`; + const roleKey = `test_role_${timestamp}`; + + await test.step('导航到角色管理', async () => { + await page.goto('/dashboard'); + await page.waitForLoadState('networkidle'); + await page.locator('text=系统管理').click(); + await page.waitForTimeout(500); + await page.locator('text=角色管理').click(); + await page.waitForLoadState('networkidle'); + await expect(page).toHaveURL(/.*roles/, { timeout: 10000 }); + }); + + await test.step('点击创建角色按钮', async () => { + await page.locator('button:has-text("新增角色")').click(); + await page.waitForSelector('.el-dialog', { state: 'visible', timeout: 5000 }); + await page.screenshot({ path: 'test-results/debug-1-dialog-opened.png' }); + }); + + await test.step('填写角色信息', async () => { + const dialog = page.locator('.el-dialog'); + + const roleNameInput = dialog.locator('input').first(); + await roleNameInput.fill(roleName); + await roleNameInput.blur(); + await page.waitForTimeout(300); + await page.screenshot({ path: 'test-results/debug-2-filled-roleName.png' }); + + const roleKeyInput = dialog.locator('input').nth(1); + await roleKeyInput.fill(roleKey); + await roleKeyInput.blur(); + await page.waitForTimeout(300); + await page.screenshot({ path: 'test-results/debug-3-filled-roleKey.png' }); + + const roleSortInput = dialog.locator('.el-input-number .el-input__inner'); + await roleSortInput.fill('99'); + await roleSortInput.blur(); + await page.waitForTimeout(300); + await page.screenshot({ path: 'test-results/debug-4-filled-roleSort.png' }); + + console.log('Filled form with:', { roleName, roleKey, roleSort: 99 }); + + const formItems = await dialog.locator('.el-form-item').all(); + console.log('Number of form items:', formItems.length); + + for (let i = 0; i < formItems.length; i++) { + const label = await formItems[i].locator('.el-form-item__label').textContent(); + const hasError = await formItems[i].locator('.el-form-item__error').isVisible().catch(() => false); + if (hasError) { + const errorText = await formItems[i].locator('.el-form-item__error').textContent(); + console.log(`Form item "${label}" has error: ${errorText}`); + } + } + }); + + await test.step('提交表单', async () => { + await page.screenshot({ path: 'test-results/debug-5-before-submit.png' }); + + await page.locator('.el-dialog button:has-text("确定")').click(); + + await page.waitForTimeout(1000); + await page.screenshot({ path: 'test-results/debug-6-after-submit-1s.png' }); + + await page.waitForTimeout(2000); + await page.screenshot({ path: 'test-results/debug-7-after-submit-3s.png' }); + + const dialogVisible = await page.locator('.el-dialog').isVisible(); + console.log('Dialog visible after submit:', dialogVisible); + + const successMessage = await page.locator('.el-message--success').isVisible().catch(() => false); + console.log('Success message visible:', successMessage); + + const errorMessage = await page.locator('.el-message--error').isVisible().catch(() => false); + console.log('Error message visible:', errorMessage); + + if (errorMessage) { + const errorText = await page.locator('.el-message--error').textContent(); + console.log('Error message text:', errorText); + } + }); + }); +}); diff --git a/e2e-tests/debug/debug-role-assignment.spec.ts b/e2e-tests/debug/debug-role-assignment.spec.ts new file mode 100644 index 0000000..d933b65 --- /dev/null +++ b/e2e-tests/debug/debug-role-assignment.spec.ts @@ -0,0 +1,123 @@ +import { test, expect } from '@playwright/test'; + +test.describe('调试角色分配', () => { + test('调试角色分配功能', async ({ page }) => { + await test.step('导航到用户管理', async () => { + await page.goto('/users'); + await page.waitForLoadState('networkidle'); + await expect(page.locator('.el-table')).toBeVisible({ timeout: 10000 }); + }); + + await test.step('查找测试用户', async () => { + const searchInput = page.locator('input[placeholder*="用户名"]').first(); + await searchInput.fill('testuser_journey'); + await page.locator('button:has-text("搜索")').click(); + await page.waitForTimeout(1000); + + const userRow = page.locator('.el-table__row').first(); + await expect(userRow).toBeVisible({ timeout: 5000 }); + await page.screenshot({ path: 'test-results/debug-role-1-user-found.png' }); + }); + + await test.step('打开分配角色对话框', async () => { + const userRow = page.locator('.el-table__row').first(); + await userRow.locator('button:has-text("分配角色")').click(); + await page.waitForSelector('.el-dialog:has-text("分配角色")', { state: 'visible', timeout: 5000 }); + await page.screenshot({ path: 'test-results/debug-role-2-dialog-open.png' }); + }); + + await test.step('检查转移组件状态', async () => { + const transfer = page.locator('.el-transfer'); + + const leftPanel = transfer.locator('.el-transfer-panel').first(); + const rightPanel = transfer.locator('.el-transfer-panel').last(); + + const leftItems = await leftPanel.locator('.el-checkbox').all(); + const rightItems = await rightPanel.locator('.el-checkbox').all(); + + console.log(`左侧面板有 ${leftItems.length} 个选项`); + console.log(`右侧面板有 ${rightItems.length} 个选项`); + + for (let i = 0; i < leftItems.length; i++) { + const text = await leftItems[i].textContent(); + const isChecked = await leftItems[i].locator('input').isChecked(); + console.log(`左侧选项 ${i}: ${text}, 是否选中: ${isChecked}`); + } + + for (let i = 0; i < rightItems.length; i++) { + const text = await rightItems[i].textContent(); + const isChecked = await rightItems[i].locator('input').isChecked(); + console.log(`右侧选项 ${i}: ${text}, 是否选中: ${isChecked}`); + } + + await page.screenshot({ path: 'test-results/debug-role-3-transfer-state.png' }); + }); + + await test.step('选择并转移角色', async () => { + const transfer = page.locator('.el-transfer'); + + const superAdminCheckbox = transfer.locator('.el-checkbox:has-text("超级管理员")'); + const isChecked = await superAdminCheckbox.locator('input').isChecked(); + + console.log(`超级管理员复选框是否已选中: ${isChecked}`); + + if (!isChecked) { + await superAdminCheckbox.click(); + await page.waitForTimeout(500); + console.log('点击了超级管理员复选框'); + } + + await page.screenshot({ path: 'test-results/debug-role-4-checkbox-clicked.png' }); + + const moveToRightButton = transfer.locator('.el-transfer__buttons button').nth(1); + const isEnabled = await moveToRightButton.isEnabled(); + console.log(`转移按钮是否可用: ${isEnabled}`); + + if (isEnabled) { + await moveToRightButton.click(); + await page.waitForTimeout(500); + console.log('点击了转移按钮'); + } + + await page.screenshot({ path: 'test-results/debug-role-5-role-transferred.png' }); + + const rightPanel = transfer.locator('.el-transfer-panel').last(); + const rightItems = await rightPanel.locator('.el-checkbox').all(); + console.log(`转移后右侧面板有 ${rightItems.length} 个选项`); + }); + + await test.step('点击确定按钮', async () => { + const confirmButton = page.locator('.el-dialog:has-text("分配角色") button:has-text("确定")'); + await confirmButton.click(); + console.log('点击了确定按钮'); + + await page.waitForTimeout(2000); + await page.screenshot({ path: 'test-results/debug-role-6-after-confirm.png' }); + + const dialog = page.locator('.el-dialog:has-text("分配角色")'); + const isVisible = await dialog.isVisible(); + console.log(`对话框是否可见: ${isVisible}`); + + if (isVisible) { + const errorMessage = page.locator('.el-message--error'); + const hasError = await errorMessage.isVisible().catch(() => false); + if (hasError) { + const errorText = await errorMessage.textContent(); + console.log(`错误消息: ${errorText}`); + } + + const formItems = await dialog.locator('.el-form-item').all(); + console.log(`表单项数量: ${formItems.length}`); + + for (let i = 0; i < formItems.length; i++) { + const hasError = await formItems[i].locator('.el-form-item__error').isVisible().catch(() => false); + if (hasError) { + const label = await formItems[i].locator('.el-form-item__label').textContent(); + const errorText = await formItems[i].locator('.el-form-item__error').textContent(); + console.log(`表单项 "${label}" 有错误: ${errorText}`); + } + } + } + }); + }); +}); diff --git a/gym-manage-web/e2e/dict-management.spec.ts b/e2e-tests/dict-management.spec.ts similarity index 100% rename from gym-manage-web/e2e/dict-management.spec.ts rename to e2e-tests/dict-management.spec.ts diff --git a/gym-manage-web/e2e/fixtures/test-data.ts b/e2e-tests/fixtures/test-data.ts similarity index 100% rename from gym-manage-web/e2e/fixtures/test-data.ts rename to e2e-tests/fixtures/test-data.ts diff --git a/gym-manage-web/e2e/fixtures/test-file.txt b/e2e-tests/fixtures/test-file.txt similarity index 100% rename from gym-manage-web/e2e/fixtures/test-file.txt rename to e2e-tests/fixtures/test-file.txt diff --git a/gym-manage-web/e2e/global-setup.ts b/e2e-tests/global-setup.ts similarity index 100% rename from gym-manage-web/e2e/global-setup.ts rename to e2e-tests/global-setup.ts diff --git a/gym-manage-web/e2e/global-teardown.ts b/e2e-tests/global-teardown.ts similarity index 100% rename from gym-manage-web/e2e/global-teardown.ts rename to e2e-tests/global-teardown.ts diff --git a/gym-manage-web/e2e/helpers/TestDataManager.ts b/e2e-tests/helpers/TestDataManager.ts similarity index 100% rename from gym-manage-web/e2e/helpers/TestDataManager.ts rename to e2e-tests/helpers/TestDataManager.ts diff --git a/gym-manage-web/e2e/helpers/TestStabilityHelper.ts b/e2e-tests/helpers/TestStabilityHelper.ts similarity index 100% rename from gym-manage-web/e2e/helpers/TestStabilityHelper.ts rename to e2e-tests/helpers/TestStabilityHelper.ts diff --git a/gym-manage-web/e2e/helpers/auth.ts b/e2e-tests/helpers/auth.ts similarity index 100% rename from gym-manage-web/e2e/helpers/auth.ts rename to e2e-tests/helpers/auth.ts diff --git a/gym-manage-web/e2e/journeys/admin-complete-workflow.spec.ts b/e2e-tests/journeys/admin-complete-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/admin-complete-workflow.spec.ts rename to e2e-tests/journeys/admin-complete-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/audit-workflow.spec.ts b/e2e-tests/journeys/audit-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/audit-workflow.spec.ts rename to e2e-tests/journeys/audit-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/config-workflow.spec.ts b/e2e-tests/journeys/config-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/config-workflow.spec.ts rename to e2e-tests/journeys/config-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/dict-workflow.spec.ts b/e2e-tests/journeys/dict-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/dict-workflow.spec.ts rename to e2e-tests/journeys/dict-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/dictionary-complete-workflow.spec.ts b/e2e-tests/journeys/dictionary-complete-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/dictionary-complete-workflow.spec.ts rename to e2e-tests/journeys/dictionary-complete-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/exception-log-workflow.spec.ts b/e2e-tests/journeys/exception-log-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/exception-log-workflow.spec.ts rename to e2e-tests/journeys/exception-log-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/file-management-workflow.spec.ts b/e2e-tests/journeys/file-management-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/file-management-workflow.spec.ts rename to e2e-tests/journeys/file-management-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/notice-workflow.spec.ts b/e2e-tests/journeys/notice-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/notice-workflow.spec.ts rename to e2e-tests/journeys/notice-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/system-config-complete-workflow.spec.ts b/e2e-tests/journeys/system-config-complete-workflow.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/system-config-complete-workflow.spec.ts rename to e2e-tests/journeys/system-config-complete-workflow.spec.ts diff --git a/gym-manage-web/e2e/journeys/user-permission-boundary.spec.ts b/e2e-tests/journeys/user-permission-boundary.spec.ts similarity index 100% rename from gym-manage-web/e2e/journeys/user-permission-boundary.spec.ts rename to e2e-tests/journeys/user-permission-boundary.spec.ts diff --git a/gym-manage-web/e2e/menu-management.spec.ts b/e2e-tests/menu-management.spec.ts similarity index 100% rename from gym-manage-web/e2e/menu-management.spec.ts rename to e2e-tests/menu-management.spec.ts diff --git a/gym-manage-web/e2e/pages/DashboardPage.ts b/e2e-tests/pages/DashboardPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/DashboardPage.ts rename to e2e-tests/pages/DashboardPage.ts diff --git a/gym-manage-web/e2e/pages/DictionaryManagementPage.ts b/e2e-tests/pages/DictionaryManagementPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/DictionaryManagementPage.ts rename to e2e-tests/pages/DictionaryManagementPage.ts diff --git a/gym-manage-web/e2e/pages/ExceptionLogPage.ts b/e2e-tests/pages/ExceptionLogPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/ExceptionLogPage.ts rename to e2e-tests/pages/ExceptionLogPage.ts diff --git a/gym-manage-web/e2e/pages/FileManagementPage.ts b/e2e-tests/pages/FileManagementPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/FileManagementPage.ts rename to e2e-tests/pages/FileManagementPage.ts diff --git a/gym-manage-web/e2e/pages/LoginLogPage.ts b/e2e-tests/pages/LoginLogPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/LoginLogPage.ts rename to e2e-tests/pages/LoginLogPage.ts diff --git a/gym-manage-web/e2e/pages/LoginPage.ts b/e2e-tests/pages/LoginPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/LoginPage.ts rename to e2e-tests/pages/LoginPage.ts diff --git a/gym-manage-web/e2e/pages/MenuManagementPage.ts b/e2e-tests/pages/MenuManagementPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/MenuManagementPage.ts rename to e2e-tests/pages/MenuManagementPage.ts diff --git a/gym-manage-web/e2e/pages/NotificationPage.ts b/e2e-tests/pages/NotificationPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/NotificationPage.ts rename to e2e-tests/pages/NotificationPage.ts diff --git a/gym-manage-web/e2e/pages/OperationLogPage.ts b/e2e-tests/pages/OperationLogPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/OperationLogPage.ts rename to e2e-tests/pages/OperationLogPage.ts diff --git a/gym-manage-web/e2e/pages/RoleManagementPage.ts b/e2e-tests/pages/RoleManagementPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/RoleManagementPage.ts rename to e2e-tests/pages/RoleManagementPage.ts diff --git a/gym-manage-web/e2e/pages/SystemConfigPage.ts b/e2e-tests/pages/SystemConfigPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/SystemConfigPage.ts rename to e2e-tests/pages/SystemConfigPage.ts diff --git a/gym-manage-web/e2e/pages/UserManagementPage.ts b/e2e-tests/pages/UserManagementPage.ts similarity index 100% rename from gym-manage-web/e2e/pages/UserManagementPage.ts rename to e2e-tests/pages/UserManagementPage.ts diff --git a/gym-manage-web/e2e/smoke/login-logout.spec.ts b/e2e-tests/smoke/login-logout.spec.ts similarity index 100% rename from gym-manage-web/e2e/smoke/login-logout.spec.ts rename to e2e-tests/smoke/login-logout.spec.ts diff --git a/gym-manage-web/e2e/utils/RetryHelper.ts b/e2e-tests/utils/RetryHelper.ts similarity index 100% rename from gym-manage-web/e2e/utils/RetryHelper.ts rename to e2e-tests/utils/RetryHelper.ts diff --git a/gym-manage-web/e2e/utils/TestDataCleanup.ts b/e2e-tests/utils/TestDataCleanup.ts similarity index 100% rename from gym-manage-web/e2e/utils/TestDataCleanup.ts rename to e2e-tests/utils/TestDataCleanup.ts diff --git a/gym-manage-web/e2e/utils/TestDataFactory.ts b/e2e-tests/utils/TestDataFactory.ts similarity index 100% rename from gym-manage-web/e2e/utils/TestDataFactory.ts rename to e2e-tests/utils/TestDataFactory.ts diff --git a/gym-manage-web/e2e/utils/TestHelpers.ts b/e2e-tests/utils/TestHelpers.ts similarity index 100% rename from gym-manage-web/e2e/utils/TestHelpers.ts rename to e2e-tests/utils/TestHelpers.ts diff --git a/gym-manage-web/e2e/utils/api-client.ts b/e2e-tests/utils/api-client.ts similarity index 100% rename from gym-manage-web/e2e/utils/api-client.ts rename to e2e-tests/utils/api-client.ts diff --git a/gym-manage-web/e2e/utils/index.ts b/e2e-tests/utils/index.ts similarity index 100% rename from gym-manage-web/e2e/utils/index.ts rename to e2e-tests/utils/index.ts diff --git a/gym-manage-web/e2e/utils/testDataManager.ts b/e2e-tests/utils/testDataManager.ts similarity index 100% rename from gym-manage-web/e2e/utils/testDataManager.ts rename to e2e-tests/utils/testDataManager.ts diff --git a/gym-manage-web/e2e/utils/testHelper.ts b/e2e-tests/utils/testHelper.ts similarity index 100% rename from gym-manage-web/e2e/utils/testHelper.ts rename to e2e-tests/utils/testHelper.ts