package inventory import ( "testing" "github.com/novox/mesh-controller/internal/catalogue" ) // The list of predefined keys the controller keeps (novox/hq ADR 0348 ยง7 and its check "a newer trunk build's // list replaces the published one, and an older build's list heard later does not"; design 57 package K2). func listOf(t *testing.T, text string) catalogue.PredefinedList { t.Helper() l, err := catalogue.ParsePredefined([]byte(text)) if err != nil { t.Fatal(err) } return l } func TestANewerBuildsListReplacesTheKeptOneAndAnOlderOneHeardLaterDoesNot(t *testing.T) { inv := ForTest(t) ctx := t.Context() if _, has, err := inv.PredefinedKept(ctx); err != nil || has { t.Fatalf("a fresh store keeps a list: %v %v", has, err) } older := PredefinedRecord{Keys: listOf(t, `{"font-size": {"type": "number", "description": "points"}}`), Repository: "novox/mesh-catalog", Commit: "aaaa", Generation: 100, Build: "b-older"} newer := PredefinedRecord{Keys: listOf(t, `{"font-size": {"type": "number", "description": "points"}, "agent-managed-settings": {"type": "object", "description": "a JSON object", "trusted": true}}`), Repository: "novox/mesh-catalog", Commit: "bbbb", Generation: 101, Build: "b-newer"} if kept, err := inv.KeepPredefined(ctx, older); err != nil || !kept { t.Fatalf("the first list was not kept: %v %v", kept, err) } if kept, err := inv.KeepPredefined(ctx, newer); err != nil || !kept { t.Fatalf("a newer build's list did not replace the kept one: %v %v", kept, err) } // The older build's outcome heard after the newer one's. if kept, err := inv.KeepPredefined(ctx, older); err != nil || kept { t.Fatalf("an older build's list heard later replaced the newer one: %v %v", kept, err) } // Nor one of the same generation: the one kept stands. same := newer same.Keys, same.Build = older.Keys, "b-again" if kept, err := inv.KeepPredefined(ctx, same); err != nil || kept { t.Fatalf("a list of the same generation replaced the kept one: %v %v", kept, err) } got, has, err := inv.PredefinedKept(ctx) if err != nil || !has { t.Fatal(has, err) } if got.Build != "b-newer" || got.Commit != "bbbb" || got.Generation != 101 || len(got.Keys) != 2 || !got.Keys["agent-managed-settings"].Trusted { t.Fatalf("kept %+v", got) } // A build that could not say its generation, or carried a wrong list, is never kept. unordered := newer unordered.Generation = 0 if kept, err := inv.KeepPredefined(ctx, unordered); err == nil || kept { t.Fatalf("a list without a generation was kept: %v", err) } wrong := newer wrong.Generation, wrong.Keys = 200, catalogue.PredefinedList{"accent": {Type: "object", Description: "x"}} if kept, err := inv.KeepPredefined(ctx, wrong); err == nil || kept { t.Fatalf("a wrong list was kept: %v", err) } }