From 4d206f39cc8f16bd794f9cfe071799e68c7f9864 Mon Sep 17 00:00:00 2001 From: lanyuanxiaoyao Date: Wed, 10 Jun 2026 17:31:35 +0800 Subject: [PATCH] =?UTF-8?q?test:=20=E8=B0=83=E6=95=B4=20archive=20?= =?UTF-8?q?=E6=B5=81=E7=A8=8B=E6=B5=8B=E8=AF=95=EF=BC=8C=E6=96=B0=E5=A2=9E?= =?UTF-8?q?=20finish=20=E5=91=BD=E4=BB=A4=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/cli/help.test.ts | 8 ++++ tests/integration/flow.test.ts | 70 +++++++++++++++++++++++++++------- 2 files changed, 65 insertions(+), 13 deletions(-) diff --git a/tests/cli/help.test.ts b/tests/cli/help.test.ts index 8bb1707..5edaba0 100644 --- a/tests/cli/help.test.ts +++ b/tests/cli/help.test.ts @@ -22,6 +22,7 @@ describe("showGlobalHelp", () => { expect(output).toContain("plan <变更> <文档>"); expect(output).toContain("build <名称>"); expect(output).toContain("archive <名称>"); + expect(output).toContain("finish <名称>"); expect(output).toContain("status"); expect(output).toContain("help"); expect(output).toContain("version"); @@ -56,6 +57,13 @@ describe("showCommandHelp", () => { expect(output).toContain("rune create add-user-auth"); }); + it("finish 命令包含归档变更说明", () => { + const output = showCommandHelp("finish", "rune"); + expect(output).toContain("rune finish "); + expect(output).toContain("归档变更"); + expect(output).toContain("将变更目录"); + }); + it("不存在的命令返回 null", () => { const output = showCommandHelp("nonexistent", "rune"); expect(output).toBeNull(); diff --git a/tests/integration/flow.test.ts b/tests/integration/flow.test.ts index 6b8fc67..895d827 100644 --- a/tests/integration/flow.test.ts +++ b/tests/integration/flow.test.ts @@ -64,21 +64,12 @@ describe("完整 SDD 流程", () => { expect(buildPrompt2).toContain("已完成"); const archivePrompt = await assembleArchivePrompt(config, TMP_DIR, changeName); - expect(archivePrompt).toContain("归档"); - const today = new Date().toISOString().slice(0, 10); - const src = getChangeDir(TMP_DIR, changeName); - const dest = join(getArchiveDir(TMP_DIR), `${today}-${changeName}`); - await mkdir(join(TMP_DIR, ".rune", "archive"), { recursive: true }); - await rename(src, dest); - - expect(existsSync(dest)).toBe(true); - expect(existsSync(src)).toBe(false); - - const archives = await scanArchives(TMP_DIR); - expect(archives).toContain(`${today}-${changeName}`); + expect(archivePrompt).toContain("归档阶段"); + expect(archivePrompt).toContain("user-auth"); + expect(archivePrompt).toContain("finish"); const postArchiveChanges = await scanChanges(TMP_DIR, config); - expect(postArchiveChanges).toHaveLength(0); + expect(postArchiveChanges).toHaveLength(1); }); it("多变更并行", async () => { @@ -220,3 +211,56 @@ describe("archive 校验", () => { expect(prompt).not.toContain("警告"); }); }); + +describe("finish 命令", () => { + it("将变更目录移动到 archive", async () => { + await runInit(TMP_DIR, ["opencode"]); + const config = await loadConfig(TMP_DIR); + + const changeName = "finish-test"; + await mkdir(getChangeDir(TMP_DIR, changeName), { recursive: true }); + await writeFile(join(getChangeDir(TMP_DIR, changeName), "design.md"), "# 设计"); + await writeFile(join(getChangeDir(TMP_DIR, changeName), "task.md"), "- [x] 全部完成"); + + const today = new Date().toISOString().slice(0, 10); + const src = getChangeDir(TMP_DIR, changeName); + const dest = join(getArchiveDir(TMP_DIR), `${today}-${changeName}`); + await mkdir(getArchiveDir(TMP_DIR), { recursive: true }); + await rename(src, dest); + + expect(existsSync(dest)).toBe(true); + expect(existsSync(src)).toBe(false); + + const archives = await scanArchives(TMP_DIR); + expect(archives).toContain(`${today}-${changeName}`); + + const changes = await scanChanges(TMP_DIR, config); + expect(changes).toHaveLength(0); + }); + + it("目标路径已存在时抛出错误", async () => { + await runInit(TMP_DIR, ["opencode"]); + + const changeName = "dup-test"; + await mkdir(getChangeDir(TMP_DIR, changeName), { recursive: true }); + await writeFile(join(getChangeDir(TMP_DIR, changeName), "design.md"), "# 设计"); + + const today = new Date().toISOString().slice(0, 10); + const dest = join(getArchiveDir(TMP_DIR), `${today}-${changeName}`); + await mkdir(dest, { recursive: true }); + await writeFile(join(dest, "existing.md"), "# 已有内容"); + + await expect(rename(getChangeDir(TMP_DIR, changeName), dest)).rejects.toThrow(); + }); + + it("变更目录不存在时抛出错误", async () => { + await runInit(TMP_DIR, ["opencode"]); + + await expect( + rename( + getChangeDir(TMP_DIR, "nonexistent"), + join(getArchiveDir(TMP_DIR), "2024-01-01-nonexistent"), + ), + ).rejects.toThrow(); + }); +});