diff --git a/tests/agent/e2e-archive.test.ts b/tests/agent/e2e-archive.test.ts new file mode 100644 index 0000000..d3c3a2d --- /dev/null +++ b/tests/agent/e2e-archive.test.ts @@ -0,0 +1,65 @@ +import { describe, it, expect, beforeEach, afterEach } from "bun:test"; +import { mkdir, writeFile } from "node:fs/promises"; +import { join } from "node:path"; +import { createRunner } from "./tier1-command.ts"; +import { + setupTempDir, + cleanupTempDir, + getTempDir, + createFreshProject, + writeDoc, + changeFileExists, +} from "./fixtures.ts"; +import { scanChanges, scanArchives } from "../../src/core/scanner.ts"; +import { getChangeDir } from "../../src/core/config.ts"; + +describe("e2e: archive 阶段", () => { + let runner: ReturnType; + + beforeEach(async () => { + await setupTempDir(); + runner = createRunner(); + }); + + afterEach(async () => { + await cleanupTempDir(); + }); + + it("全部任务完成时变更移至 archive/", async () => { + const config = await createFreshProject(); + await writeDoc("ready", "task", "- [x] 任务\n"); + + await runner.runArchive(getTempDir(), "ready", config); + + expect(changeFileExists("ready", "task.md")).toBe(false); + + const archives = await scanArchives(getTempDir()); + expect(archives.length).toBeGreaterThanOrEqual(1); + + const changes = await scanChanges(getTempDir(), config); + expect(changes.find((c) => c.name === "ready")).toBeUndefined(); + }); + + it("任务未完成时阻止归档", async () => { + const config = await createFreshProject(); + await writeDoc("pending", "task", "- [ ] 未完成\n"); + + await expect(runner.runArchive(getTempDir(), "pending", config)).rejects.toThrow("未完成任务"); + + expect(changeFileExists("pending", "task.md")).toBe(true); + }); + + it("无 task.md 时允许归档", async () => { + const config = await createFreshProject(); + const changeDir = getChangeDir(getTempDir(), "no-task"); + await mkdir(changeDir, { recursive: true }); + await writeFile(join(changeDir, "design.md"), "# 设计\n"); + + await runner.runArchive(getTempDir(), "no-task", config); + + expect(changeFileExists("no-task", "design.md")).toBe(false); + + const archives = await scanArchives(getTempDir()); + expect(archives.length).toBeGreaterThanOrEqual(1); + }); +});