- 添加 target/ 到 .gitignore - 从 git 暂存区移除已追踪的 target 目录 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
132 lines
4.3 KiB
TypeScript
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/);
|
|
});
|
|
});
|