oh-my-muse/muse-studio/e2e/knowledge-draft-actions.spec.ts
lili e5ee1fdb58 feat(knowledge): studio 草稿「忽略/重新校验」接通真后端 + e2e
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>
2026-06-20 19:59:40 -07:00

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