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