/** * 前端路由守卫与权限 E2E 测试 * 覆盖: 未登录重定向 / 已登录访问 /login / Token 失效后跳转 */ import { test, expect } from '@playwright/test'; // 不使用全局 auth test.use({ storageState: { cookies: [], origins: [] } }); test.describe('路由守卫', () => { test('未登录访问受保护页面被重定向到登录页', async ({ page }) => { await page.goto('/customers'); await page.waitForURL(/\/login/); await expect(page.locator('.login-title')).toBeVisible(); }); test('未登录访问订单页被重定向', async ({ page }) => { await page.goto('/orders'); await page.waitForURL(/\/login/); }); test('未登录访问设置页被重定向', async ({ page }) => { await page.goto('/settings'); await page.waitForURL(/\/login/); }); test('登录页直接可访问', async ({ page }) => { await page.goto('/login'); // 不会重定向,直接显示登录页 await expect(page.locator('.login-title')).toContainText('CRM'); }); }); test.describe('Token 销毁后行为', () => { test('清除 Token 后访问受保护页面被重定向', async ({ page }) => { // 先登录 await page.goto('/login'); await page.getByPlaceholder('用户名').fill('admin'); await page.getByPlaceholder('密码').fill('123456'); await page.getByRole('button', { name: '登 录' }).click(); await page.waitForURL('/', { timeout: 10000 }); // 清除 localStorage(模拟 Token 销毁) await page.evaluate(() => localStorage.clear()); // 访问受保护页面 await page.goto('/customers'); // 应被重定向到登录页 await page.waitForURL(/\/login/, { timeout: 5000 }); }); });