| @@ -41,6 +41,16 @@ async function mockLoginDependencies(page: Page) { | |||||
| const path = new URL(route.request().url()).pathname | const path = new URL(route.request().url()).pathname | ||||
| if (path.endsWith('/auth/login-context')) return fulfill(route, loginContext) | if (path.endsWith('/auth/login-context')) return fulfill(route, loginContext) | ||||
| if (path.endsWith('/auth/login-identities')) return fulfill(route, identities) | if (path.endsWith('/auth/login-identities')) return fulfill(route, identities) | ||||
| if (path.endsWith('/auth/login')) { | |||||
| return fulfill(route, { accessToken: 'remember-access-token', refreshToken: 'remember-refresh-token', expiresIn: 3600 }) | |||||
| } | |||||
| if (path.endsWith('/auth/me')) { | |||||
| return fulfill(route, { | |||||
| user: { id: '1', username: 'admin.saved', displayName: '系统管理员', mustChangePassword: true }, | |||||
| activeRoleId: '1', roles: [{ id: '1', code: 'admin', name: '管理员', enabled: true }], | |||||
| permissions: [], authorizationMode: 'SINGLE_ACTIVE', | |||||
| }) | |||||
| } | |||||
| if (path.endsWith('/system-config/public')) return fulfill(route, {}) | if (path.endsWith('/system-config/public')) return fulfill(route, {}) | ||||
| return fulfill(route, {}) | return fulfill(route, {}) | ||||
| }) | }) | ||||
| @@ -69,6 +79,59 @@ test('登录页恢复上次成功登录的部门和账号但不保存密码', as | |||||
| await captureScreenshot(page, testInfo, 'restored-login-identity-without-password') | await captureScreenshot(page, testInfo, 'restored-login-identity-without-password') | ||||
| }) | }) | ||||
| test('按登录身份分别恢复记住的账号和密码', async ({ page }) => { | |||||
| await page.addInitScript(() => { | |||||
| window.localStorage.setItem('ai-person:web:login-identity-preference:v1', JSON.stringify({ | |||||
| lastRoleCode: 'teacher', | |||||
| selections: { | |||||
| teacher: { | |||||
| departmentId: '110', userId: '402', username: '', | |||||
| password: 'Teacher-Remembered-1', remember: true, | |||||
| }, | |||||
| admin: { | |||||
| departmentId: '', userId: '', username: 'admin.remembered', | |||||
| password: 'Admin-Remembered-2', remember: true, | |||||
| }, | |||||
| }, | |||||
| })) | |||||
| }) | |||||
| await mockLoginDependencies(page) | |||||
| await page.goto('/login') | |||||
| await expect(page.locator('.login-identity-picker')).toContainText('杜晴') | |||||
| await expect(page.locator('input[name="password"]')).toHaveValue('Teacher-Remembered-1') | |||||
| await expect(page.locator('input[name="rememberMe"]')).toBeChecked() | |||||
| await page.locator('[data-role-code="admin"]').click() | |||||
| await expect(page.locator('input[name="username"]')).toHaveValue('admin.remembered') | |||||
| await expect(page.locator('input[name="password"]')).toHaveValue('Admin-Remembered-2') | |||||
| await expect(page.locator('input[name="rememberMe"]')).toBeChecked() | |||||
| await page.locator('[data-role-code="teacher"]').click() | |||||
| await expect(page.locator('.login-identity-picker')).toContainText('杜晴') | |||||
| await expect(page.locator('input[name="password"]')).toHaveValue('Teacher-Remembered-1') | |||||
| }) | |||||
| test('成功登录后按勾选状态保存账号密码', async ({ page }) => { | |||||
| await mockLoginDependencies(page) | |||||
| await page.goto('/login') | |||||
| await page.locator('[data-role-code="admin"]').click() | |||||
| await page.locator('input[name="username"]').fill('admin.saved') | |||||
| await page.locator('input[name="password"]').fill('Saved-Password-3') | |||||
| await page.locator('input[name="rememberMe"]').check() | |||||
| await page.getByRole('button', { name: '登录' }).click() | |||||
| await expect.poll(() => page.evaluate(() => { | |||||
| const raw = window.localStorage.getItem('ai-person:web:login-identity-preference:v1') || '{}' | |||||
| return JSON.parse(raw).selections?.admin | |||||
| })).toEqual({ | |||||
| departmentId: '', userId: '', username: 'admin.saved', | |||||
| password: 'Saved-Password-3', remember: true, | |||||
| }) | |||||
| }) | |||||
| test('已删除的部门或账号不会被本地偏好错误回填', async ({ page }) => { | test('已删除的部门或账号不会被本地偏好错误回填', async ({ page }) => { | ||||
| await page.addInitScript(() => { | await page.addInitScript(() => { | ||||
| window.localStorage.setItem('ai-person:web:login-identity-preference:v1', JSON.stringify({ | window.localStorage.setItem('ai-person:web:login-identity-preference:v1', JSON.stringify({ | ||||