oh-my-muse/muse-studio/e2e/market-recommendations.spec.ts
zizi 6dcabf69fb feat(solo): 收口治理入口并裁剪 studio 表面
完成 2.0.0 S4 的外部 AI、admin、account 与 solo SQL 收口,并推进 S5 studio 市场/handoff/旧编辑器入口裁剪。S5 的前端单测、构建与 route-only e2e 已留证;MSW-off 创作主线 e2e 仍因本地后端活体启动口径待修正,已在总账标为未完成验收。
2026-07-08 11:45:26 +08:00

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 });
}
});