From d3de2c8971f3a463a8973cb7a13222268c43f865 Mon Sep 17 00:00:00 2001 From: root Date: Mon, 28 Sep 2026 00:50:29 +0800 Subject: [PATCH] fix(files,test): probe requires organize.execute; rename duplicate E6 to E10; trash approval replay test - POST /files/probe writes media_asset.media_info, so scope organize.read -> organize.execute - e2e e6-w4a-endpoints -> e10-w4a-endpoints (number clashed with e6-auto-recover) - trash: reusing a consumed approval / retired planId is rejected and the file stays Co-Authored-By: Claude Opus 5.5 --- apps/server/test/e2e/e10-w4a-endpoints.test.ts | 6 +++--- apps/server/test/file-manager/trash.test.ts | 5 +++++ packages/contracts/src/api.ts | 4 ++-- 3 files changed, 10 insertions(+), 5 deletions(-) diff --git a/apps/server/test/e2e/e10-w4a-endpoints.test.ts b/apps/server/test/e2e/e10-w4a-endpoints.test.ts index 8261c04f..cc2ebfc8 100644 --- a/apps/server/test/e2e/e10-w4a-endpoints.test.ts +++ b/apps/server/test/e2e/e10-w4a-endpoints.test.ts @@ -10,17 +10,17 @@ import { waitFor, } from "./harness.ts"; -// E6 W4-A 前后端集成端点:手动提交下载(与自动同流程)、候选评估去重、库存叠加补字段、 +// E10(原编号与 e6-auto-recover 重复,W6-B 改名) W4-A 前后端集成端点:手动提交下载(与自动同流程)、候选评估去重、库存叠加补字段、 // 整理记录 downloadTaskId、只读资产/产物端点、偏好标签修订历史、列表带作品标题、事件 JSON 补读。 const hasPg = await pgAvailable(); -describe.skipIf(!hasPg)("E6 W4-A 集成端点", () => { +describe.skipIf(!hasPg)("E10 W4-A 集成端点", () => { let e: E2E; let target: Awaited>; beforeAll(async () => { - e = await createE2E("e6"); + e = await createE2E("e10"); const base = await seedBase(e); target = await seedMovieTarget(e, base.siteId); }, 120_000); diff --git a/apps/server/test/file-manager/trash.test.ts b/apps/server/test/file-manager/trash.test.ts index cf7faefa..8711c8cd 100644 --- a/apps/server/test/file-manager/trash.test.ts +++ b/apps/server/test/file-manager/trash.test.ts @@ -203,6 +203,11 @@ describe.skipIf(skip)("files 删除与回收站", () => { const ok = await del({ items, dryRun: false, planId: dry.body.data.planId }, EXEC_KEY); expect(ok.status).toBe(200); expect(await exists(join(h.lib, "perm.txt"))).toBe(false); + // 重放:同名文件再出现,拿用过的 planId(审批已 consumed、计划已退役)再执行 → 拒绝,文件不动 + await writeFile(join(h.lib, "perm.txt"), "p2"); + const replay = await del({ items, dryRun: false, planId: dry.body.data.planId }, EXEC_KEY); + expect([403, 409]).toContain(replay.status); + expect(await readFile(join(h.lib, "perm.txt"), "utf8")).toBe("p2"); }); it("离线根:删除检查返回 root_unavailable,不当作已删除", async () => { diff --git a/packages/contracts/src/api.ts b/packages/contracts/src/api.ts index 7cf25314..283ab396 100644 --- a/packages/contracts/src/api.ts +++ b/packages/contracts/src/api.ts @@ -1173,8 +1173,8 @@ export const Api = { probe: ep({ method: "post", path: "/files/probe", - scope: "organize.read", - summary: "ffprobe 摘要(≤20 项;已登记资产写回 media_info)", + scope: "organize.execute", + summary: "ffprobe 摘要(≤20 项;已登记资产写回 media_info,所以要 organize.execute)", body: files.FilesProbeRequest, response: files.FilesProbeResult, }),