From 75a70ece5d4787208472a562e568fec144559a19 Mon Sep 17 00:00:00 2001 From: Ma Date: Sat, 28 Mar 2026 20:40:14 +0800 Subject: [PATCH] =?UTF-8?q?test:=20add=20rewrite=20chapter=20regression=20?= =?UTF-8?q?=E2=80=94=20verify=20next=20chapter=20is=202=20after=20rewrite?= =?UTF-8?q?=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simulates: write 3 chapters → rewrite chapter 2 (trim index, delete files, restore snapshot) → assert getNextChapterNumber returns 2. Addresses #103 --- .../core/src/__tests__/state-manager.test.ts | 36 +++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/packages/core/src/__tests__/state-manager.test.ts b/packages/core/src/__tests__/state-manager.test.ts index 3c78b41f..cc150750 100644 --- a/packages/core/src/__tests__/state-manager.test.ts +++ b/packages/core/src/__tests__/state-manager.test.ts @@ -418,6 +418,42 @@ describe("StateManager", () => { const restored = await manager.restoreState(bookId, 999); expect(restored).toBe(false); }); + + it("rewrite chapter 2 then getNextChapterNumber returns 2", async () => { + const rwBookId = "rewrite-book"; + const chapDir = join(manager.bookDir(rwBookId), "chapters"); + const storyDir = join(manager.bookDir(rwBookId), "story"); + await mkdir(chapDir, { recursive: true }); + await mkdir(storyDir, { recursive: true }); + + // Simulate 3 chapters written + await writeFile(join(chapDir, "0001_ch1.md"), "# Chapter 1\nContent 1", "utf-8"); + await writeFile(join(chapDir, "0002_ch2.md"), "# Chapter 2\nContent 2", "utf-8"); + await writeFile(join(chapDir, "0003_ch3.md"), "# Chapter 3\nContent 3", "utf-8"); + const fullIndex = [ + { number: 1, title: "Ch1", status: "approved", wordCount: 100, createdAt: "", updatedAt: "", auditIssues: [] }, + { number: 2, title: "Ch2", status: "approved", wordCount: 100, createdAt: "", updatedAt: "", auditIssues: [] }, + { number: 3, title: "Ch3", status: "approved", wordCount: 100, createdAt: "", updatedAt: "", auditIssues: [] }, + ]; + await manager.saveChapterIndex(rwBookId, fullIndex); + + // Snapshot state at chapter 1 (before chapter 2) + await writeFile(join(storyDir, "current_state.md"), "State at ch1", "utf-8"); + await writeFile(join(storyDir, "pending_hooks.md"), "Hooks at ch1", "utf-8"); + await manager.snapshotState(rwBookId, 1); + + // Simulate rewrite of chapter 2: trim index, delete ch2+ch3, restore state + const trimmed = fullIndex.filter((ch) => ch.number < 2); + await manager.saveChapterIndex(rwBookId, trimmed); + const { rm } = await import("node:fs/promises"); + await rm(join(chapDir, "0002_ch2.md")); + await rm(join(chapDir, "0003_ch3.md")); + await manager.restoreState(rwBookId, 1); + + // Next chapter should be 2, not 4 + const next = await manager.getNextChapterNumber(rwBookId); + expect(next).toBe(2); + }); }); // -------------------------------------------------------------------------