From 1cfdcb5fb314dd12d7b33077c055ee421874445e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=BB=84=E8=87=AA=E8=BE=BE?= <980324341@qq.com> Date: Sat, 5 Sep 2026 12:34:32 +0800 Subject: [PATCH] =?UTF-8?q?task-20(=E5=A3=B3=E5=B1=82/=E8=B7=AF=E7=94=B1):?= =?UTF-8?q?=20=E5=AE=8C=E6=88=90=E5=A3=B3=E5=B1=82=E7=9C=9F=E5=AE=9E?= =?UTF-8?q?=E6=B5=8F=E8=A7=88=E5=99=A8=20smoke=20=E9=AA=8C=E6=94=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit e2e 8 用例端到端收口:登录态壳层渲染、折叠切换、刷新幂等、404、退出确认取消 不退出、确认后跳 /login、全程无未捕获错误与遗留弹层。 --- .../e2e/task-20-shell-smoke.spec.ts | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 admin-frontend-vue/e2e/task-20-shell-smoke.spec.ts diff --git a/admin-frontend-vue/e2e/task-20-shell-smoke.spec.ts b/admin-frontend-vue/e2e/task-20-shell-smoke.spec.ts new file mode 100644 index 00000000..3e59a0e3 --- /dev/null +++ b/admin-frontend-vue/e2e/task-20-shell-smoke.spec.ts @@ -0,0 +1,75 @@ +import { expect, test, type Page } from '@playwright/test' + +async function openAdmin(page: Page) { + await page.goto('/admin-vue/') + await expect(page.locator('main h2')).toHaveText('用户管理') +} + +test('test_task_020_shell_browser_smoke_normal_primary_path', async ({ page }) => { + await openAdmin(page) + await expect(page.getByRole('navigation', { name: '侧边栏菜单' })).toBeVisible() + await expect(page.locator('.admin-user-meta strong')).toHaveText('admin') + await expect(page.locator('.admin-user-meta span')).toHaveText('super_admin') + await expect(page.getByText('账号权限', { exact: true }).first()).toBeVisible() +}) + +test('test_task_020_shell_browser_smoke_normal_variant_input', async ({ page }) => { + await openAdmin(page) + await page.locator('.sidebar-collapse').click() + await expect(page.locator('.admin-shell')).toHaveClass(/is-collapsed/) + await page.locator('.sidebar-collapse').click() + await expect(page.locator('.admin-shell')).not.toHaveClass(/is-collapsed/) +}) + +test('test_task_020_shell_browser_smoke_normal_repeated_operation_is_idempotent', async ({ page }) => { + await openAdmin(page) + await page.reload() + await expect(page.locator('main h2')).toHaveText('用户管理') + await expect(page.locator('.global-error-stack')).toHaveCount(0) +}) + +test('test_task_020_shell_browser_smoke_boundary_empty_input', async ({ page }) => { + await page.goto('/admin-vue/definitely/not/exists') + await expect(page.locator('.not-found')).toBeVisible() + await expect(page.locator('.not-found')).toContainText('404') +}) + +test('test_task_020_shell_browser_smoke_boundary_single_item', async ({ page }) => { + await openAdmin(page) + await page.getByRole('button', { name: '退出登录' }).click() + await expect(page.locator('.el-message-box')).toBeVisible() + await expect(page.locator('.el-message-box')).toContainText('确定要退出当前账号吗?') + await page.locator('.el-message-box').getByRole('button', { name: '取消' }).click() + await expect(page.locator('.el-message-box')).toHaveCount(0) + await expect(page).toHaveURL(/\/admin-vue\//) + await expect(page.locator('main h2')).toHaveText('用户管理') +}) + +test('test_task_020_shell_browser_smoke_boundary_limit_or_missing_field', async ({ page }) => { + await openAdmin(page) + await page.getByRole('button', { name: '退出登录' }).click() + await page.locator('.el-message-box').getByRole('button', { name: '退出' }).click() + await page.waitForURL(/\/login/, { timeout: 10_000 }) +}) + +test('test_task_020_shell_browser_smoke_invalid_input_rejected', async ({ page }) => { + // 整段冒烟无未捕获脚本错误(错误不会静默遗留到控制台)。 + const errors: string[] = [] + page.on('pageerror', (error) => errors.push(error.message)) + await openAdmin(page) + await page.goto('/admin-vue/account/menus') + await expect(page.locator('main h2')).toHaveText('菜单管理') + await page.goto('/admin-vue/account/groups') + await expect(page.locator('main h2')).toHaveText('数据权限分组') + expect(errors).toEqual([]) +}) + +test('test_task_020_shell_browser_smoke_dependency_failure_returns_actionable_message', async ({ page }) => { + await openAdmin(page) + // 取消确认后无遗留弹层/遮罩;继续导航正常。 + await page.getByRole('button', { name: '退出登录' }).click() + await page.locator('.el-message-box').getByRole('button', { name: '取消' }).click() + await expect(page.locator('.el-overlay')).toHaveCount(0) + await page.locator('.admin-brand-copy, .admin-topbar h1').first().click({ force: true }) + await expect(page.locator('.admin-topbar h1')).toHaveText('用户管理') +})