/** * 导航与路由 E2E 测试。 * * 验证点: * - 默认路由 / → /dashboard 重定向 * - /log-viewer → /etl-tasks?tab=manager 重定向 * - 菜单高亮 * - Tab-URL 同步 */ import { test, expect } from '@playwright/test'; import { injectAuth, mockAllApis } from './helpers'; test.describe('路由重定向', () => { test.beforeEach(async ({ page }) => { await injectAuth(page); await mockAllApis(page); }); test('/ 重定向到 /dashboard', async ({ page }) => { await page.goto('/'); await expect(page).toHaveURL(/\/dashboard/); // 确认 Dashboard 页面已渲染 await expect(page.locator('text=运行状态').first()).toBeVisible(); }); test('/log-viewer 重定向到 /etl-tasks?tab=queue', async ({ page }) => { await page.goto('/log-viewer'); await expect(page).toHaveURL(/\/etl-tasks\?tab=queue/); }); test('未登录时重定向到 /login', async ({ page }) => { // 清除 localStorage 中的令牌 await page.goto('/login', { waitUntil: 'commit' }); await page.evaluate(() => { localStorage.removeItem('access_token'); localStorage.removeItem('refresh_token'); }); await page.goto('/dashboard'); await expect(page).toHaveURL(/\/login/); }); }); test.describe('菜单高亮', () => { test.beforeEach(async ({ page }) => { await injectAuth(page); await mockAllApis(page); }); test('Dashboard 页面菜单高亮"运行状态"', async ({ page }) => { await page.goto('/dashboard'); await expect(page.locator('text=运行状态').first()).toBeVisible(); // Ant Design Menu 选中项会有 ant-menu-item-selected 类 const menuItem = page.locator('.ant-menu-item-selected', { hasText: '运行状态' }); await expect(menuItem).toBeVisible(); }); test('ETL 任务页面菜单高亮"ETL 任务管理"', async ({ page }) => { await page.goto('/etl-tasks'); const menuItem = page.locator('.ant-menu-item-selected', { hasText: 'ETL 任务管理' }); await expect(menuItem).toBeVisible(); }); test('触发器管理页面菜单高亮"触发器管理"', async ({ page }) => { await page.goto('/triggers'); const menuItem = page.locator('.ant-menu-item-selected', { hasText: '触发器管理' }); await expect(menuItem).toBeVisible(); }); }); test.describe('Tab-URL 同步', () => { test.beforeEach(async ({ page }) => { await injectAuth(page); await mockAllApis(page); }); test('ETL 任务页 Tab 切换同步 URL', async ({ page }) => { await page.goto('/etl-tasks'); await expect(page.locator('text=ETL 任务管理').first()).toBeVisible(); // 点击"队列"Tab await page.locator('[role="tab"]', { hasText: '队列' }).click(); await expect(page).toHaveURL(/\?tab=queue/); // 点击"调度"Tab await page.locator('[role="tab"]', { hasText: '调度' }).click(); await expect(page).toHaveURL(/\?tab=schedule/); // 点击"历史"Tab await page.locator('[role="tab"]', { hasText: '历史' }).click(); await expect(page).toHaveURL(/\?tab=history/); // 点击"状态"Tab await page.locator('[role="tab"]', { hasText: '状态' }).click(); await expect(page).toHaveURL(/\?tab=status/); // 点击"发起"Tab 回到默认 await page.locator('[role="tab"]', { hasText: '发起' }).click(); await expect(page).toHaveURL(/\?tab=config/); }); test('触发器管理页 Tab 切换同步 URL', async ({ page }) => { await page.goto('/triggers'); await expect(page.locator('text=触发器管理').first()).toBeVisible(); // 点击"业务"Tab await page.locator('[role="tab"]', { hasText: '业务' }).click(); await expect(page).toHaveURL(/\?tab=biz/); // 点击"AI"Tab await page.locator('[role="tab"]', { hasText: 'AI' }).click(); await expect(page).toHaveURL(/\?tab=ai/); // 点击"ETL"Tab await page.locator('[role="tab"]', { hasText: 'ETL' }).click(); await expect(page).toHaveURL(/\?tab=etl/); // 回到"全部"Tab await page.locator('[role="tab"]', { hasText: '全部' }).click(); await expect(page).toHaveURL(/\?tab=all/); }); });