package tools import ( "context" "encoding/json" "os" "testing" "github.com/voocel/ainovel-cli/domain" "github.com/voocel/ainovel-cli/state" ) func TestCommitChapterRejectsNonPendingRewrite(t *testing.T) { dir := t.TempDir() store := state.NewStore(dir) if err := store.Init(); err != nil { t.Fatalf("Init: %v", err) } if err := store.InitProgress("test", 10); err != nil { t.Fatalf("InitProgress: %v", err) } if err := store.SetPendingRewrites([]int{2}, "测试重写"); err != nil { t.Fatalf("SetPendingRewrites: %v", err) } if err := store.SetFlow(domain.FlowRewriting); err != nil { t.Fatalf("SetFlow: %v", err) } if err := store.SaveDraft(3, "这是错误章节的正文。"); err != nil { t.Fatalf("SaveDraft: %v", err) } tool := NewCommitChapterTool(store) args, err := json.Marshal(map[string]any{ "chapter": 3, "summary": "错误提交", "characters": []string{"主角"}, "key_events": []string{"误提交"}, "timeline_events": []any{}, }) if err != nil { t.Fatalf("Marshal: %v", err) } if _, err := tool.Execute(context.Background(), args); err == nil { t.Fatal("expected commit to be rejected during rewrite flow") } if _, err := os.Stat(dir + "/chapters/03.md"); !os.IsNotExist(err) { t.Fatalf("chapter should not be persisted, stat err=%v", err) } progress, err := store.LoadProgress() if err != nil { t.Fatalf("LoadProgress: %v", err) } if len(progress.CompletedChapters) != 0 { t.Fatalf("completed chapters should stay empty, got %v", progress.CompletedChapters) } if progress.CurrentChapter != 0 { t.Fatalf("current chapter should not advance, got %d", progress.CurrentChapter) } } func TestCommitChapterAllowsPendingRewrite(t *testing.T) { dir := t.TempDir() store := state.NewStore(dir) if err := store.Init(); err != nil { t.Fatalf("Init: %v", err) } if err := store.InitProgress("test", 10); err != nil { t.Fatalf("InitProgress: %v", err) } if err := store.SetPendingRewrites([]int{2}, "测试重写"); err != nil { t.Fatalf("SetPendingRewrites: %v", err) } if err := store.SetFlow(domain.FlowRewriting); err != nil { t.Fatalf("SetFlow: %v", err) } if err := store.SaveDraft(2, "这是正确待重写章节的正文。"); err != nil { t.Fatalf("SaveDraft: %v", err) } tool := NewCommitChapterTool(store) args, err := json.Marshal(map[string]any{ "chapter": 2, "summary": "正确提交", "characters": []string{"主角"}, "key_events": []string{"完成重写"}, "timeline_events": []any{}, }) if err != nil { t.Fatalf("Marshal: %v", err) } if _, err := tool.Execute(context.Background(), args); err != nil { t.Fatalf("Execute: %v", err) } if _, err := os.Stat(dir + "/chapters/02.md"); err != nil { t.Fatalf("chapter should be persisted: %v", err) } progress, err := store.LoadProgress() if err != nil { t.Fatalf("LoadProgress: %v", err) } if len(progress.CompletedChapters) != 1 || progress.CompletedChapters[0] != 2 { t.Fatalf("unexpected completed chapters: %v", progress.CompletedChapters) } }