返回 DeepSeek-Reasonix
rebuild_test.go
根目录 / internal / taskcatalog / rebuild_test.go
1 package taskcatalog
2
3 import (
4 "context"
5 "path/filepath"
6 "testing"
7 "time"
8
9 "reasonix/internal/taskmonitor"
10 )
11
12 func TestRebuildReplacesStaleTaskProjection(t *testing.T) {
13 t.Parallel()
14 ctx := context.Background()
15 databasePath := filepath.Join(t.TempDir(), "tasks.sqlite")
16 staleRoot := t.TempDir()
17 currentRoot := t.TempDir()
18 store := taskmonitor.NewFileStore(filepath.Join(".reasonix", "tasks"))
19 now := time.Now()
20 if err := store.SaveTask(ctx, staleRoot, snapshot("stale-task", "stale-session", 1, now)); err != nil {
21 t.Fatal(err)
22 }
23 if err := store.SaveTask(ctx, currentRoot, snapshot("current-task", "current-session", 1, now)); err != nil {
24 t.Fatal(err)
25 }
26 seed, err := Open(ctx, databasePath)
27 if err != nil {
28 t.Fatal(err)
29 }
30 staleProject, err := seed.RegisterProject(ctx, staleRoot, "Stale")
31 if err != nil {
32 t.Fatal(err)
33 }
34 if err := seed.ReconcileProject(ctx, staleProject); err != nil {
35 t.Fatal(err)
36 }
37 if err := seed.Close(ctx); err != nil {
38 t.Fatal(err)
39 }
40 currentProject := normalizeProject(Project{Root: currentRoot, Label: "Current"})
41 if _, err := Rebuild(ctx, databasePath, []Project{currentProject}); err != nil {
42 t.Fatal(err)
43 }
44 rebuilt, err := Open(ctx, databasePath)
45 if err != nil {
46 t.Fatal(err)
47 }
48 t.Cleanup(func() { _ = rebuilt.Close(context.Background()) })
49 stalePage, err := rebuilt.ListPage(ctx, PageRequest{ProjectKeys: []string{staleProject.Key}, Limit: 50})
50 if err != nil || len(stalePage.Items) != 0 {
51 t.Fatalf("stale page=%#v err=%v", stalePage, err)
52 }
53 currentPage, err := rebuilt.ListPage(ctx, PageRequest{ProjectKeys: []string{currentProject.Key}, Limit: 50})
54 if err != nil || len(currentPage.Items) != 1 || currentPage.Items[0].Task.TaskID != "current-task" {
55 t.Fatalf("current page=%#v err=%v", currentPage, err)
56 }
57 }
58
58 lines GO