Files
gaokao-volunteer-system/apps/web/e2e/layout-data.spec.ts
Frontend Developer e8b8ad079e feat(sprint-2): V10 选项 B 完整切换 + G1 闸门通过
框架切换:Next.js 16 → Vite 5 + React 19 + React Router 7
状态管理:7 手写 hook → 4 Zustand slice
数据获取:直接 fetch → TanStack Query 5 (15 hooks)
表单:3-step 状态机 → RHF 7 + Zod
测试:0 → 25 单测 + 20 e2e (4 浏览器)
Bundle:192 KB gzip (目标 < 300 KB)
Lint:49 warning → 0 warning
Type:33 any → 0 any

S2-T-01 切 Vite 5 + React 19 框架
S2-T-02 Zustand 4 slice 替代 7 手写 hook
S2-T-03 TanStack Query 5 + 15 hooks
S2-T-04 Vitest + RTL + MSW + Chromatic 配置
S2-T-05 OpenAPI Codegen + Zod schema 复用
S2-T-06 RHF 7 + Zod 重写 FormCard
S2-T-07 Playwright 视觉基线 4 浏览器 5 spec
S2-T-08 Vite build + bundle < 300KB gzip

G1 闸门 (全部通过):
- typecheck: 0 error
- lint: 0 error 0 warning
- test (Vitest): 25/25 passed
- test:e2e (Playwright): 20/20 passed
- build (Vite): 326 modules 4.14s
- codegen:check: OpenAPI types 非占位

Sprint 2 收口报告:SPRINT_2_CLOSEOUT_2026-07-03.md
2026-07-03 15:51:03 +08:00

38 lines
1.2 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* V10 选项 B · e2e: layout data binding
*
* 覆盖 AppLayout 不再用本地消息临时拼 recentChat改为读取咨询记录 API。
*/
import { test, expect } from '@playwright/test';
test.describe('Layout data binding', () => {
test('desktop sidebar renders recent consultations from API data', async ({ page }) => {
await page.setViewportSize({ width: 1280, height: 800 });
await page.route('**/api/consultations**', async (route) => {
await route.fulfill({
status: 200,
contentType: 'application/json',
body: JSON.stringify({
consultations: [
{
id: 'consultation-e2e-1',
title: '真实咨询记录入口',
messageCount: 3,
createdAt: '2026-07-03T00:00:00.000Z',
updatedAt: '2026-07-03T00:05:00.000Z',
},
],
total: 1,
}),
});
});
await page.goto('/');
await page.waitForResponse((response) => response.url().includes('/api/consultations') && response.status() === 200);
await expect(page.getByRole('heading', { name: '最近对话' })).toBeVisible();
await expect(page.getByRole('button', { name: '真实咨询记录入口' })).toBeVisible();
});
});