P1 真缺口补全(2/7):KnowledgeDraftPanel 在「确认入库」旁加「重新校验」「忽略」两动作,接已就绪后端端点——useIgnoreKnowledgeDraft→POST /knowledge-drafts/{id}/ignore(审而不入,草稿转 ignored 移出)、useRecheckKnowledgeDraft→POST /knowledge-drafts/{id}/recheck(来源重验异步任务,草稿留 pending);均带 commandId 幂等键,照 useConfirmKnowledgeDraft 模式。
验证:vitest 51/51(contract test 加 ignore/recheck URL+commandId 断言)、tsc 0 错;新增 e2e knowledge-draft-actions.spec.ts 2 例真后端绿(recheck→queued、ignore→ignored+移出),全量 e2e 24/24 无回归。种子:global-setup #2b 固化 work2 下 recheck-e2e/ignore-e2e 两草稿(与 confirm 的 work1 隔离、各用独立草稿避免 recheck 改态影响 ignore)。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
72 lines
2.9 KiB
TypeScript
72 lines
2.9 KiB
TypeScript
import { expect, test, type Page } from '@playwright/test';
|
|
|
|
/**
|
|
* 知识草稿「重新校验 / 忽略」动作 e2e(先审后入的配套出口,真实后端,MSW off)。
|
|
*
|
|
* 前置:vite VITE_API_MOCK=false、真实 muse-server 在 48080、muse_slice_live 作品 2 下有固定 name
|
|
* 'recheck-e2e' / 'ignore-e2e' 的 pending 草稿(由 e2e/global-setup.ts #2b 每轮复位;用 work2 与
|
|
* confirm 的 work1 隔离,且 recheck 与 ignore 各用独立草稿,避免互相影响)。
|
|
* 目的:rendered studio 草稿面板的两个新动作直打真后端(反假绿):
|
|
* - 「重新校验」POST /knowledge-drafts/{id}/recheck → 异步重验任务(queued),草稿留 pending;
|
|
* - 「忽略」POST /knowledge-drafts/{id}/ignore → 审而不入,草稿转 ignored 移出待确认。
|
|
*/
|
|
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/2');
|
|
|
|
// 精确定位固定 name 的种子草稿行(work2 隔离)。
|
|
const draftRow = page.locator('li', { hasText: 'recheck-e2e' });
|
|
await expect(draftRow).toBeVisible({ timeout: 15_000 });
|
|
|
|
// 点「重新校验」并捕获真实响应(打真后端,非 mock)。
|
|
const [resp] = await Promise.all([
|
|
page.waitForResponse(
|
|
(r) => /\/knowledge-drafts\/\d+\/recheck$/.test(r.url()) && r.request().method() === 'POST',
|
|
{ timeout: 15_000 }
|
|
),
|
|
draftRow.getByRole('button', { name: /重新校验/ }).click(),
|
|
]);
|
|
|
|
// Yudao 口径:成功为 HTTP 200 + CommonResult{code:0}。
|
|
expect(resp.status()).toBe(200);
|
|
const body = await resp.json();
|
|
expect(body.code).toBe(0);
|
|
// 重验为异步任务:返回 queued 状态或 jobId。
|
|
expect(body.data?.status === 'queued' || String(body.data?.jobId ?? '') !== '').toBe(true);
|
|
});
|
|
|
|
test('草稿「忽略」→ 审而不入移出待确认(真实后端)', async ({ page }) => {
|
|
await seedToken(page);
|
|
await page.goto('/knowledge/2');
|
|
|
|
const draftRow = page.locator('li', { hasText: 'ignore-e2e' });
|
|
await expect(draftRow).toBeVisible({ timeout: 15_000 });
|
|
|
|
// 点「忽略」并捕获真实响应(打真后端,非 mock)。
|
|
const [resp] = await Promise.all([
|
|
page.waitForResponse(
|
|
(r) => /\/knowledge-drafts\/\d+\/ignore$/.test(r.url()) && r.request().method() === 'POST',
|
|
{ timeout: 15_000 }
|
|
),
|
|
draftRow.getByRole('button', { name: /忽略/ }).click(),
|
|
]);
|
|
|
|
expect(resp.status()).toBe(200);
|
|
const body = await resp.json();
|
|
expect(body.code).toBe(0);
|
|
// 忽略结果:草稿转 ignored。
|
|
expect(body.data?.status).toBe('ignored');
|
|
|
|
// 忽略后该草稿移出待确认列表(onSuccess 失效 drafts 重新拉取)。
|
|
await expect(draftRow).toBeHidden({ timeout: 15_000 });
|
|
});
|