import { expect, test, type Page } from '@playwright/test'; test.skip(true, '2.0.0 S5 单人版已移除市场、handoff 或多用户前端入口,本 spec 隔离保留待恢复'); /** * 市场资产治理影响 e2e(真实后端,MSW off)——A 类:后端 getGovernanceImpact 就绪、studio 此前 0 消费(C14 读端缺口)。 * * 反假绿:盘点 C14 消费者治理缺口——后端 GET /marketplace/assets/{id}/governance-impact 就绪 * (curl code:0 + 真实 governanceResult:resultType/reason/操作限制 + affected 列表与 suggestedActions), * 但 studio 详情页无任何展示。本测进资产详情页 → 等真实 GET governance-impact → 验 code:0 + * 「治理影响」区按真实 governanceResult 渲染结果类型。 * 设计:不硬编码治理结果(随资产治理态变),依真实响应断言——有 governanceResult 则验区块 + 结果类型渲染。 */ const TOKEN = 'test1'; async function seedToken(page: Page): Promise { await page.addInitScript((t) => { window.localStorage.setItem('accessToken', t); window.localStorage.setItem('tenantId', '1'); }, TOKEN); } const RESULT_TYPE_LABELS: Record = { delist: '下架', recall: '召回', revoke: '吊销', appeal: '可申诉', }; test('资产详情页渲染治理影响(真实后端 governance-impact)', async ({ page }) => { await seedToken(page); const govResp = page.waitForResponse( (r) => /\/marketplace\/assets\/[^/]+\/governance-impact$/.test(new URL(r.url()).pathname) && r.request().method() === 'GET', { timeout: 15_000 } ); // asset 1:curl 证 detail + governance-impact 均 code:0(governanceResult.reason=listed + affectedAuthorizations 有数据)。 await page.goto('/market/assets/1'); const resp = await govResp; expect(resp.status()).toBe(200); const body = await resp.json(); expect(body.code).toBe(0); // 后端就绪。 // 有 governanceResult 时「治理影响」区渲染 + 结果类型按真实 resultType 映射(证真后端态被 UI 消费)。 if (body.data?.governanceResult) { await expect(page.getByRole('heading', { name: '治理影响' })).toBeVisible({ timeout: 10_000 }); const rt = body.data.governanceResult.resultType; const label = RESULT_TYPE_LABELS[rt] ?? rt; if (label) { await expect(page.getByText(label).first()).toBeVisible({ timeout: 10_000 }); } } });