kindergarten_java/reading-platform-frontend/tests/e2e/admin/99-logout.spec.ts
En 6e11c874d2 chore: 忽略 target 目录和 .class 文件
- 添加 target/ 到 .gitignore
- 从 git 暂存区移除已追踪的 target 目录

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-14 16:50:54 +08:00

132 lines
4.3 KiB
TypeScript

/**
* 超管端 E2E 测试 - 退出登录
*/
import { test, expect } from '@playwright/test';
import { loginAsAdmin, logout } from './helpers';
import { ADMIN_CONFIG } from './fixtures';
test.describe('退出登录', () => {
test('点击退出登录', async ({ page }) => {
// 先登录
await loginAsAdmin(page);
// 查找退出登录按钮并点击
const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
if (await logoutButton.isVisible()) {
await logoutButton.click();
} else {
// 尝试点击用户菜单后再找退出按钮
const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
if (await userMenu.isVisible()) {
await userMenu.click();
await page.waitForTimeout(200);
const dropdownLogout = page.getByText(/退出登录 | 退出/);
if (await dropdownLogout.isVisible()) {
await dropdownLogout.click();
}
}
}
// 等待跳转到登录页
await page.waitForURL('**/login*');
await expect(page).toHaveURL(/\/login/);
});
test('验证跳转回登录页', async ({ page }) => {
// 先登录
await loginAsAdmin(page);
// 退出登录
const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
if (await logoutButton.isVisible()) {
await logoutButton.click();
} else {
const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
if (await userMenu.isVisible()) {
await userMenu.click();
await page.waitForTimeout(200);
const dropdownLogout = page.getByText(/退出登录 | 退出/);
if (await dropdownLogout.isVisible()) {
await dropdownLogout.click();
}
}
}
// 验证在登录页面
await page.waitForURL('**/login*');
await expect(page).toHaveURL(/\/login/);
// 验证登录表单存在
await expect(page.getByPlaceholder('请输入账号')).toBeVisible();
await expect(page.getByPlaceholder('请输入密码')).toBeVisible();
});
test('验证 token 已清除', async ({ page }) => {
// 先登录
await loginAsAdmin(page);
// 获取当前 token
const tokenBeforeLogout = await page.evaluate(() => localStorage.getItem('token'));
expect(tokenBeforeLogout).toBeTruthy();
// 退出登录
const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
if (await logoutButton.isVisible()) {
await logoutButton.click();
} else {
const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
if (await userMenu.isVisible()) {
await userMenu.click();
await page.waitForTimeout(200);
const dropdownLogout = page.getByText(/退出登录 | 退出/);
if (await dropdownLogout.isVisible()) {
await dropdownLogout.click();
}
}
}
// 等待跳转完成
await page.waitForTimeout(500);
// 验证 token 已清除
const tokenAfterLogout = await page.evaluate(() => localStorage.getItem('token'));
expect(tokenAfterLogout).toBeFalsy();
// 验证 sessionStorage 中的用户信息也已清除
const userInfo = await page.evaluate(() => sessionStorage.getItem('userInfo'));
expect(userInfo).toBeFalsy();
});
test('退出后无法访问管理页面', async ({ page }) => {
// 先登录
await loginAsAdmin(page);
// 退出登录
const logoutButton = page.getByRole('button', { name: /退出登录 | 退出 | logout/i });
if (await logoutButton.isVisible()) {
await logoutButton.click();
} else {
const userMenu = page.locator('.ant-dropdown-trigger').or(page.locator('[class*="user"]'));
if (await userMenu.isVisible()) {
await userMenu.click();
await page.waitForTimeout(200);
const dropdownLogout = page.getByText(/退出登录 | 退出/);
if (await dropdownLogout.isVisible()) {
await dropdownLogout.click();
}
}
}
// 等待跳转完成
await page.waitForTimeout(500);
// 尝试直接访问管理页面
await page.goto('/admin/dashboard');
// 应该被重定向到登录页
await page.waitForURL('**/login*');
await expect(page).toHaveURL(/\/login/);
});
});