P1 真缺口补全(7/7,收官):知识库工作台自建库新增「发布」入口——源侧 publish-prechecks 预检。useKBPublishReadiness→POST /knowledge-bases/{kbId}/publish-prechecks(commandId+version);KnowledgePublishModal 打开即预检,呈现 blocked+受阻原因+权利/隐私/处理三态;KnowledgePage 自建 KB 卡片加「发布」按钮。
诚实处理:平台外部权利隐私校验器未配置(EXTERNAL_RIGHTS_PRIVACY_VALIDATOR_NOT_CONFIGURED)→ precheck 恒 blocked,UI 如实呈现「暂不可发布」+受阻原因,不伪造可发布、不提供伪造确认入口。
顺带修真后端兼容 bug:normalizeKnowledgeBase/normalizeInstalledKnowledgeBase 的 kbId 未强转字符串,真后端数字 id 被 isKnowledgeBaseSummary 守卫全部过滤→KB 列表空(此前仅 mock 测过未暴露);改 String() 强转(对字符串幂等,不破坏 mock)。
验证:vitest knowledge 13/13(加 publish-precheck 契约)、tsc 0 错;新增 e2e knowledge-publish-precheck.spec.ts 真后端绿(发布→预检 200+blocked:true+「暂不可发布」),全量 30/30 无回归。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
45 lines
1.8 KiB
TypeScript
45 lines
1.8 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
/**
|
|
* 知识库「发布到市场」可发布性预检 e2e(诚实处理 blocked,真实后端,MSW off)。
|
|
*
|
|
* 前置:vite VITE_API_MOCK=false、真实 muse-server 48080、muse_slice_live 有自建知识库(活体绑定测试KB)。
|
|
* 目的:知识库工作台点自建库「发布」→ 源侧 publish-prechecks → 因平台外部权利隐私校验器未配置而恒 blocked,
|
|
* 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('知识库发布可发布性预检 → 诚实展示受阻(真实后端)', async ({ page }) => {
|
|
await seedToken(page);
|
|
await page.goto('/knowledge');
|
|
|
|
// 「我创建的」默认页签;自建库展示「发布」入口。
|
|
const publishBtn = page.getByRole('button', { name: /发布知识库/ }).first();
|
|
await expect(publishBtn).toBeVisible({ timeout: 15_000 });
|
|
|
|
// 点发布 → 弹层自动预检,捕获真实 publish-prechecks 响应(打真后端,非 mock)。
|
|
const [resp] = await Promise.all([
|
|
page.waitForResponse(
|
|
(r) => /\/knowledge-bases\/\d+\/publish-prechecks$/.test(r.url()) && r.request().method() === 'POST',
|
|
{ timeout: 15_000 }
|
|
),
|
|
publishBtn.click(),
|
|
]);
|
|
|
|
// Yudao 口径:HTTP 200 + code:0;诚实:precheck 恒 blocked(外部校验器未配置)。
|
|
expect(resp.status()).toBe(200);
|
|
const body = await resp.json();
|
|
expect(body.code).toBe(0);
|
|
expect(body.data?.blocked).toBe(true);
|
|
|
|
// UI 如实呈现受阻结论(不伪造可发布)。
|
|
await expect(page.getByText('⚠️ 暂不可发布')).toBeVisible({ timeout: 15_000 });
|
|
});
|