| 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 |