muse-studio/e2e/knowledge-bindings.spec.ts:nav /knowledge/1→捕获真实 GET /works/1/knowledge-bindings→断 200/code:0/active 绑定 + 面板渲染(作品已绑定的知识来源/市场知识库/生效中)。playwright --list 确认编译有效可发现(1 test)。 尝试活体运行受阻(诚实,非假绿):远端 PG 宿主 100.64.0.8:5433 离线(不在 tailnet 节点列表)、本机无 PG 兜底,全栈 muse-server 起不来。PG 宿主恢复后按 .agents/knowledge §六 起栈(redis 本机可启、jar 需重建含 GET 端点、muse_slice_live seed work1 绑定)即可跑。后端 218 + studio 50/tsc/build 已绿。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
53 lines
2.7 KiB
TypeScript
53 lines
2.7 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
/**
|
|
* 作品已绑定知识来源读回视图 e2e(来源绑定读模型,真实后端,MSW off)。
|
|
*
|
|
* 前置(同 knowledge-graph.spec.ts 的活体全栈口径):
|
|
* - vite 以 VITE_API_MOCK=false 运行、真实 muse-server 在 48080;
|
|
* - muse_slice_live 作品 1 下已种子一条<生效>的来源绑定读模型投影
|
|
* (muse_knowledge_source_binding_projection:work_id=1、deleted=false、status=active、
|
|
* source_type=market_kb、kb_id=4001;可由真实 bind(precheck→bind)产生,或等价 seed)。
|
|
* 目的:rendered studio 的「作品已绑定的知识来源」面板经 GET /works/1/knowledge-bindings
|
|
* 读真实投影,把当前生效的来源绑定在 UI 渲染——证"绑定确认 → 读模型回填 → 读回展示"链路活体可见(打真后端,非 mock)。
|
|
*
|
|
* ⚠️ 状态(2026-06-19):本 spec 已编写但<尚未>活体运行——远端 PG 宿主(100.64.0.8:5433)当时离线、
|
|
* 全栈 app 无法启动(见 docs/mvp/进度总账.md bindings 条目"诚实边界")。PG 宿主恢复后按上述前置起栈即可运行。
|
|
* 后端读端点 + FE hook/面板已在 vitest/单测/tsc/build 层验证(knowledge-server 218、studio 50 + build 绿)。
|
|
*/
|
|
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('已绑定知识来源面板渲染真实投影读回(真实后端)', async ({ page }) => {
|
|
await seedToken(page);
|
|
|
|
// 捕获真实来源绑定读回响应(打真后端,非 mock)。
|
|
const [resp] = await Promise.all([
|
|
page.waitForResponse(
|
|
(r) => /\/works\/1\/knowledge-bindings(\?|$)/.test(r.url()) && r.request().method() === 'GET',
|
|
{ timeout: 15_000 }
|
|
),
|
|
page.goto('/knowledge/1'),
|
|
]);
|
|
|
|
// Yudao 口径:成功为 HTTP 200 + CommonResult{code:0}。
|
|
expect(resp.status()).toBe(200);
|
|
const body = await resp.json();
|
|
expect(body.code).toBe(0);
|
|
// 真实后端返回该作品当前生效(未删)的来源绑定。
|
|
const bindings = body.data?.bindings ?? [];
|
|
expect(bindings.length).toBeGreaterThan(0);
|
|
expect(bindings.some((b: { status: string }) => b.status === 'active')).toBe(true);
|
|
|
|
// UI 渲染:面板标题 + 来源类型徽标(market_kb→市场知识库)+ 生效状态徽标。
|
|
await expect(page.getByText('作品已绑定的知识来源').first()).toBeVisible({ timeout: 15_000 });
|
|
await expect(page.getByText('市场知识库').first()).toBeVisible({ timeout: 15_000 });
|
|
await expect(page.getByText('生效中').first()).toBeVisible({ timeout: 15_000 });
|
|
});
|