Files
mesh-controller/internal/inventory/predefined_test.go
T
mesh-adminandClaude Opus 5.5 9f2e16ff70 Keep the newest trunk build's list of predefined keys, and prove each refusal
The list itself, read strictly (catalogue/predefined.go); the controller keeps a catalogue trunk build's list in its store when its commit's generation is larger than the one kept (migration 0098), so an older build's list heard later never replaces a newer one, and loads it with its store (hq ADR 0348 clause 7, issue 661). Part 2 of 2: the new files.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 05:46:49 +00:00

70 lines
2.7 KiB
Go

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