完成 2.0.0 S4 的外部 AI、admin、account 与 solo SQL 收口,并推进 S5 studio 市场/handoff/旧编辑器入口裁剪。S5 的前端单测、构建与 route-only e2e 已留证;MSW-off 创作主线 e2e 仍因本地后端活体启动口径待修正,已在总账标为未完成验收。
45 lines
2.1 KiB
TypeScript
45 lines
2.1 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
test.skip(true, '2.0.0 S5 单人版已移除市场、handoff 或多用户前端入口,本 spec 隔离保留待恢复');
|
|
|
|
/**
|
|
* 市场推荐位 e2e(真实后端,MSW off)——A 类切片:后端 GET /marketplace/recommendations 就绪、此前 studio 零调用。
|
|
*
|
|
* 反假绿:盘点(02F C3)确认后端推荐接口就绪(curl code:0 + 真实推荐资产 + recommendationReason),
|
|
* 但前端从不调用、推荐理由仅 mock 造、UI 未渲染。本测进市场发现页 → 等真实 GET /marketplace/recommendations
|
|
* → 验响应 code:0(证真后端就绪被 UI 消费)+「为你推荐」区按真实数据渲染。
|
|
* 设计:不硬编码推荐条数/内容(后端推荐算法可变),依真实响应数据断言——有推荐则验区块 + 首个推荐名渲染,
|
|
* 空推荐则不阻断(契合"推荐失败不阻断主列表"语义)。
|
|
*/
|
|
const TOKEN = 'test1';
|
|
|
|
async function seedToken(page: Page): Promise<void> {
|
|
await page.addInitScript((t) => {
|
|
window.localStorage.setItem('accessToken', t);
|
|
window.localStorage.setItem('tenantId', '1');
|
|
}, TOKEN);
|
|
}
|
|
|
|
test('市场发现页渲染个性化推荐位(真实后端 recommendations)', async ({ page }) => {
|
|
await seedToken(page);
|
|
|
|
// 进市场页 → 捕获真实 GET /marketplace/recommendations(随首屏发出)。
|
|
const recoResp = page.waitForResponse(
|
|
(r) =>
|
|
/\/marketplace\/recommendations$/.test(new URL(r.url()).pathname) &&
|
|
r.request().method() === 'GET',
|
|
{ timeout: 15_000 }
|
|
);
|
|
await page.goto('/market');
|
|
const resp = await recoResp;
|
|
expect(resp.status()).toBe(200);
|
|
const body = await resp.json();
|
|
expect(body.code).toBe(0); // 后端推荐接口就绪(非 fail-closed)。
|
|
|
|
// 依真实响应断言:有推荐资产时「为你推荐」区渲染 + 首个推荐名可见(证真后端数据被 UI 消费)。
|
|
if (Array.isArray(body.data) && body.data.length > 0) {
|
|
await expect(page.getByRole('heading', { name: '为你推荐' })).toBeVisible({ timeout: 10_000 });
|
|
await expect(page.getByText(String(body.data[0].name)).first()).toBeVisible({ timeout: 10_000 });
|
|
}
|
|
});
|