import { captureScreenshot, expect, test } from './fixtures' import { adminCredentials, login, missingLoginOrganizationEnvironment, selectLoginOrganization, } from './helpers' test('登录页默认选择教员身份', async ({ page }) => { await page.goto('/login') await expect(page.locator('[data-role-code="teacher"]')).toHaveAttribute('aria-pressed', 'true') }) test('管理员可以登录并安全退出', async ({ page }, testInfo) => { await page.goto('/login') const loginHeading = page.getByRole('heading', { name: '登录数字车间', includeHidden: true }) await expect(loginHeading).toBeAttached() await expect(page.locator('.login-card > header')).toHaveCSS('position', 'absolute') await expect(page.locator('.login-card > header')).toHaveCSS('clip-path', 'inset(50%)') await expect(page.locator('.login-role-options > button')).toHaveCount(4) await expect(page.locator('[data-role-code="teacher"]')).toHaveAttribute('aria-pressed', 'true') await expect(page.getByRole('button', { name: /登录系统/ })).toBeDisabled() await captureScreenshot(page, testInfo, 'login-page') const credentials = adminCredentials() await page.locator('[data-role-code="admin"]').click() await page.locator('input[name="username"]').fill('__ute2e_missing_account__') await page.locator('input[name="password"]').fill('Uae2e-Invalid-Only') await page.getByRole('button', { name: /登录系统/ }).click() await expect(page.locator('.el-message--error')).toContainText('账号、密码或登录身份不匹配') await login(page, adminCredentials()) await expect(page).toHaveURL(/\/dashboard(?:\?|$)/) await captureScreenshot(page, testInfo, 'login-success') await page.locator('.user-entry').click() await page.getByText('退出登录', { exact: true }).click() await expect(page).toHaveURL(/\/login(?:\?|$)/) const returnedLoginHeading = page.getByRole('heading', { name: '登录数字车间', includeHidden: true }) await expect(returnedLoginHeading).toBeAttached() await expect(page.locator('.login-card > header')).toHaveCSS('position', 'absolute') await expect(page.locator('.login-card > header')).toHaveCSS('clip-path', 'inset(50%)') }) test('强制改密账号首次登录后必须设置新密码', async ({ page }, testInfo) => { const username = process.env.E2E_FORCE_CHANGE_USERNAME?.trim() const password = process.env.E2E_FORCE_CHANGE_PASSWORD?.trim() const newPassword = process.env.E2E_FORCE_CHANGE_NEW_PASSWORD?.trim() const roleCode = (process.env.E2E_FORCE_CHANGE_ROLE_CODE?.trim() || 'teacher') as 'admin' | 'administrative' | 'teacher' | 'student' const missingOrganizationEnvironment = missingLoginOrganizationEnvironment(roleCode) test.skip(!username || !password || !newPassword, '未配置独立强制改密账号,按约定跳过该条件用例。') test.skip(username === process.env.E2E_ADMIN_USERNAME, '强制改密用例禁止复用管理员账号。') test.skip( missingOrganizationEnvironment.length > 0, `当前登录身份缺少组织配置:${missingOrganizationEnvironment.join('、')}。`, ) await page.goto('/login') await page.locator(`[data-role-code="${roleCode}"]`).click() await selectLoginOrganization(page, roleCode) await page.locator('input[name="username"]').fill(username!) await page.locator('input[name="password"]').fill(password!) await page.getByRole('button', { name: /登录系统/ }).click() const surface = page.locator('.el-dialog:visible, .force-password-page, main').filter({ hasText: /修改密码|首次登录/ }).last() await expect(surface).toBeVisible() const currentPasswordInput = surface .locator('.el-form-item') .filter({ hasText: /当前密码/ }) .locator('input') .first() const newPasswordInput = surface .locator('.el-form-item') .filter({ hasText: /新密码/ }) .locator('input') .first() const confirmationInput = surface .locator('.el-form-item') .filter({ hasText: /确认密码|再次输入/ }) .locator('input') .first() await currentPasswordInput.fill(password!) await newPasswordInput.fill(newPassword!) await confirmationInput.fill(newPassword!) await surface.getByRole('button', { name: /确认修改|修改密码|保存/ }).last().click() await expect(page).toHaveURL(/\/login(?:\?|$)/) await login(page, { username: username!, password: newPassword!, roleCode }) await expect(page).toHaveURL(/\/dashboard(?:\?|$)/) await captureScreenshot(page, testInfo, 'forced-password-change-success') })