package core // 端到端验证:恢复出来的任务能真的下载 // // 2026-10-24 事故修复的回归测试。 // state.json 被清空过,token/title/status 全丢,靠「?next= 定位法」抓回来。 // 这个测试确认抓回来的 token + title 能让引擎真的把图下下来。 // // 需要能连上 e-hentai.org,跑法: // // EH_TEST_PROXY=http://127.0.0.1:7890 go test ./internal/core/ -run TestRecoveredTaskDownloads -v import ( "context" "os" "path/filepath" "testing" "time" "eh-downloader-wails/internal/eh" ) func TestRecoveredTaskDownloads(t *testing.T) { proxy := os.Getenv("EH_TEST_PROXY") if proxy == "" { t.Skip("设 EH_TEST_PROXY 才跑(需要能连 e-hentai.org)") } dir := t.TempDir() dlRoot := filepath.Join(dir, "dl") store := NewStore(filepath.Join(dir, "state.json")) store.UpdateSettings(map[string]interface{}{ "downloadRoot": dlRoot, "proxy": proxy, "proxyMode": "http", "timeout": 30000, "xres": "auto", "galleryConcurrency": 1, "pageConcurrency": 2, }) // 一个事故恢复时抓回来的任务(gid/token/title) const gid = "4278109" const token = "007bf09196" const title = "Minamoto-no-Raikou [Fate/Grand Order]" store.AddTasks([]eh.GalleryRef{{ GID: gid, Token: token, Raw: "https://e-hentai.org/g/" + gid + "/" + token + "/", Title: title, }}) sink := &testSink{} e := NewEngine(store, sink, store.Settings()) // 只跑这一个任务 task0 := store.FindTask(gid, token) if task0 == nil { t.Fatal("任务不见了") } e.Enqueue([]Task{*task0}) ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) defer cancel() e.Start(ctx) task := store.FindTask(gid, token) if task == nil { t.Fatal("任务不见了") } if task.Status != "done" && task.Status != "partial" { t.Fatalf("状态应为 done/partial,实际 %q(错误: %s)", task.Status, task.Error) } if task.Done == 0 { t.Fatal("一张图都没下下来") } t.Logf("✓ 下载完成: %s %d/%d 页 (状态 %s)", task.Title, task.Done, task.TotalPages, task.Status) // 文件系统里应该有东西 var files int filepath.Walk(dlRoot, func(p string, info os.FileInfo, err error) error { if err == nil && !info.IsDir() && filepath.Ext(p) != "" { files++ } return nil }) if files == 0 { t.Fatal("下载目录里没有文件") } t.Logf("✓ 磁盘上有 %d 个文件", files) } type testSink struct{} func (s *testSink) TaskUpdate(t Task) {} func (s *testSink) Log(level, msg string) {} func (s *testSink) Done() {}