背景: - .gitea/workflows/ci.yml 在 job env 中设置 VITE_PUBLIC_DEMO_SESSION=true, e2e 用 vite preview + 演示会话登录;scripts/ci-local.mjs 没有同步这组 env, 本地 CI 第 10 步必失败; - e2e/smoke.spec.ts 是 A0 用例:还在找「请输入账号或邮箱」占位符、断言登录后落在工作台; A1 接入真实登录后占位符为「请输入账号或手机号」,且登录默认落地 /system/users。 改动: - ci-local:构建与 e2e 步骤注入 VITE_PUBLIC_DEMO_SESSION / VITE_PUBLIC_API_BASE_URL (与 ci.yml 对齐),只作用于这两个步骤,避免影响单测对真实登录流程的断言; - turbo.json:声明 globalEnv,保证构建产物随这两个 VITE 变量变化,不复用非 demo 构建缓存; - smoke.spec:登录占位符改为「请输入账号或手机号」;登录后按 A1 现状断言落地 /system/users, 再从顶部「工作台」进入首页并校验模块导航; - README:单独执行 e2e 时补充 demo 会话环境变量,并注明 ci:local 已内置。 影响面: - 仅本地 CI 与 e2e 冒烟;业务代码与 CI 工作流行为不变(ci.yml 本就在 job env 注入这些变量); - 本地构建缓存会因 globalEnv 变更失效一次。 回滚方式: - 回滚本提交即恢复原 ci-local 步骤、冒烟用例与 README。 验证证据: - pnpm ci:local 全部门禁通过(用时 218.8s); - e2e smoke 4 项通过(登录 / 403 / 模块切换 / 404;A1 账号周期 7 项按预期 skip)。
42 lines
1.8 KiB
TypeScript
42 lines
1.8 KiB
TypeScript
import { expect, type Page, test } from '@playwright/test';
|
|
|
|
async function signIn(page: Page): Promise<void> {
|
|
await page.goto('/login');
|
|
await page.getByPlaceholder('请输入账号或手机号').fill('admin');
|
|
await page.getByPlaceholder('请输入密码').fill('demo1234');
|
|
await page.getByTestId('login-submit').click();
|
|
await expect(page.getByTestId('app-shell')).toBeVisible();
|
|
}
|
|
|
|
test('登录页打开并进入工作台', async ({ page }) => {
|
|
await page.goto('/login');
|
|
await expect(page.getByRole('heading', { name: '登录灵犀' })).toBeVisible();
|
|
await signIn(page);
|
|
// A1 起登录默认落地 /system/users,再从顶部模块导航进入工作台
|
|
await expect(page).toHaveURL(/\/system\/users/);
|
|
await page.getByRole('button', { name: '工作台', exact: true }).click();
|
|
await expect(page).toHaveURL('/');
|
|
await expect(page.getByRole('heading', { name: '工作台', exact: true })).toBeVisible();
|
|
await expect(page.getByRole('navigation', { name: '模块导航' })).toBeVisible();
|
|
});
|
|
|
|
test('403 页可演示', async ({ page }) => {
|
|
await page.goto('/403');
|
|
await expect(page.getByTestId('error-403')).toBeVisible();
|
|
await expect(page.getByRole('heading', { name: '没有访问权限' })).toBeVisible();
|
|
});
|
|
|
|
test('模块切换与侧边栏、面包屑联动', async ({ page }) => {
|
|
await signIn(page);
|
|
await page.getByRole('button', { name: '素材', exact: true }).click();
|
|
await expect(page).toHaveURL(/\/material/);
|
|
await page.getByRole('link', { name: '快筛', exact: true }).click();
|
|
await expect(page.getByRole('heading', { name: '快筛' })).toBeVisible();
|
|
await expect(page.getByRole('navigation', { name: '面包屑' })).toContainText('素材');
|
|
});
|
|
|
|
test('未知路由展示 404', async ({ page }) => {
|
|
await page.goto('/404');
|
|
await expect(page.getByTestId('error-404')).toBeVisible();
|
|
});
|