From fdf338dbd196a4aaa43658b79e07e4b3f3cf8e3b Mon Sep 17 00:00:00 2001 From: jochen Date: Thu, 1 Oct 2026 17:56:06 +0200 Subject: [PATCH] A plan is kept, advanced and resumed from the store: the test --- internal/inventory/plans_test.go | 48 ++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 internal/inventory/plans_test.go diff --git a/internal/inventory/plans_test.go b/internal/inventory/plans_test.go new file mode 100644 index 0000000..a9153a6 --- /dev/null +++ b/internal/inventory/plans_test.go @@ -0,0 +1,48 @@ +package inventory + +import ( + "testing" + "time" +) + +// A plan is a record the mesh keeps and resumes (novox/hq ADR 0162): written whole, read back open, +// advanced, and gone from the open ones when done. +func TestAPlanIsKeptAdvancedAndResumedFromTheStore(t *testing.T) { + inv := ForTest(t) + ctx := t.Context() + p := Plan{ID: "plan-1", Repository: "novox/mesh-tools", Commit: "abc", Created: time.Now().UTC(), + State: PlanBuilding, Tiers: [][]string{{"mesh-tools"}, {"builder"}, {"shop"}}, + Modules: map[string]*PlanModule{"mesh-tools": {}, "builder": {}, "shop": {}}} + if err := inv.SavePlan(ctx, p); err != nil { + t.Fatal(err) + } + open, err := inv.OpenPlans(ctx) + if err != nil || len(open) != 1 || open[0].ID != "plan-1" || len(open[0].Tiers) != 3 { + t.Fatalf("the plan was not kept whole: %v %+v", err, open) + } + // Another controller picks it up where it was left: a tier advanced and a module built. + now := time.Now().UTC() + resumed := open[0] + resumed.Tier = 1 + resumed.Modules["mesh-tools"].State = "built" + resumed.Modules["mesh-tools"].BuiltAt = &now + resumed.State = PlanRolling + resumed.Note = "tier 0 built; waiting for builder on anchor to be applied" + if err := inv.SavePlan(ctx, resumed); err != nil { + t.Fatal(err) + } + again, err := inv.PlanByID(ctx, "plan-1") + if err != nil || again.Tier != 1 || again.Modules["mesh-tools"].State != "built" || again.State != PlanRolling { + t.Fatalf("the advanced plan did not come back as left: %v %+v", err, again) + } + again.State = PlanDone + if err := inv.SavePlan(ctx, again); err != nil { + t.Fatal(err) + } + if open, _ = inv.OpenPlans(ctx); len(open) != 0 { + t.Fatalf("a done plan is not open: %+v", open) + } + if recent, _ := inv.RecentPlans(ctx, 5); len(recent) != 1 || recent[0].State != PlanDone { + t.Fatalf("a done plan is still among the recent ones: %+v", recent) + } +}