102 lines
4.8 KiB
Go
102 lines
4.8 KiB
Go
//go:build integration
|
|
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"strings"
|
|
"testing"
|
|
|
|
"github.com/novox/mesh-controller/internal/catalogue"
|
|
)
|
|
|
|
func TestTheMergeGateJudgesEachManifestAgainstTheListOfTheTree(t *testing.T) {
|
|
withoutAPublishedList(t)
|
|
f, manifests := templatedMesh(t)
|
|
|
|
v := gateJudged(t, f, writeTheList(t, aTree(t, withEdit(manifests, "notifier",
|
|
notifierFallingBackTo("font-size", "number"))), theFirstKeys), "modules/notifier/module.json")
|
|
if v.Verdict == "fail" || v.Modules["notifier"] != "changed" {
|
|
t.Fatalf("a module naming font-size on the tree's list failed the gate (%v):\n%s", v.Modules, v.Report())
|
|
}
|
|
for _, c := range []struct{ manifest, list, says string }{
|
|
{notifierFallingBackTo("font-scale", "number"), theFirstKeys, `"font-scale", which is not on the list`},
|
|
{notifierFallingBackTo("font-size", "string"), theFirstKeys, "which is a number"},
|
|
{inlineNotifier, `{"font-size": {"type": "number", "description": "points", "unit": "pt"}}`, `unknown field "unit"`},
|
|
} {
|
|
v := gateJudged(t, f, writeTheList(t, aTree(t, withEdit(manifests, "notifier", c.manifest)), c.list),
|
|
"modules/notifier/module.json", catalogue.PredefinedFile)
|
|
if v.Verdict != "fail" || !strings.Contains(v.Report(), c.says) {
|
|
t.Errorf("wanted the gate to fail saying %q:\n%s", c.says, v.Report())
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestRegistrationPublishesTheNewestTrunkListAndJudgesEveryModuleAgainstIt(t *testing.T) {
|
|
withoutAPublishedList(t)
|
|
open := aMesh(t)
|
|
ctx := t.Context()
|
|
|
|
// A manifest naming font-size registers, and its build's list is published.
|
|
if _, _, err := takeIn(ctx, open.inventory, asTheOperator(t, open.inventory,
|
|
catalogueBuild("b-1", notifierFallingBackTo("font-size", "number"), theFirstKeys, 10))); err != nil {
|
|
t.Fatalf("a module naming font-size was not registered: %v", err)
|
|
}
|
|
kept, has, err := open.inventory.PredefinedKept(ctx)
|
|
if err != nil || !has || kept.Generation != 10 || kept.Build != "b-1" {
|
|
t.Fatalf("the list was not published: %+v %v %v", kept, has, err)
|
|
}
|
|
if got := catalogue.PublishedPredefined(); len(got) != 2 {
|
|
t.Fatalf("the controller judges against %v, not the list published", got)
|
|
}
|
|
|
|
// One naming a key not on the list, or of another type, is refused and never enters the catalogue.
|
|
for i, c := range []struct{ manifest, says string }{
|
|
{notifierFallingBackTo("font-scale", "number"), "not on the list"},
|
|
{notifierFallingBackTo("font-size", "string"), "which is a number"},
|
|
} {
|
|
id := []string{"b-2", "b-3"}[i]
|
|
if _, _, err := takeIn(ctx, open.inventory, catalogueBuild(id, c.manifest, theFirstKeys, 10)); err == nil ||
|
|
!strings.Contains(err.Error(), c.says) {
|
|
t.Errorf("wanted the registration refused saying %q, got %v", c.says, err)
|
|
}
|
|
}
|
|
src, err := open.inventory.SourceOf(ctx, "notifier")
|
|
if err != nil || src.BuiltFrom != strings.Repeat("1", 12) {
|
|
t.Fatalf("a refused build replaced the registered one: %+v %v", src, err)
|
|
}
|
|
|
|
// A newer build's list, which drops agent-managed-settings, replaces the published one.
|
|
smaller := `{"font-size": {"type": "number", "description": "points", "minimum": 6, "maximum": 72}}`
|
|
if _, _, err := takeIn(ctx, open.inventory, catalogueBuild("b-4",
|
|
notifierFallingBackTo("font-size", "number"), smaller, 12)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
// The older build's outcome heard later registers nothing new about the list: the newer stands.
|
|
if _, _, err := takeIn(ctx, open.inventory, catalogueBuild("b-5",
|
|
notifierFallingBackTo("font-size", "number"), theFirstKeys, 11)); err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
kept, _, _ = open.inventory.PredefinedKept(ctx)
|
|
if kept.Build != "b-4" || len(kept.Keys) != 1 || len(catalogue.PublishedPredefined()) != 1 {
|
|
t.Fatalf("an older build's list heard later replaced the newer one: %+v", kept)
|
|
}
|
|
|
|
// A build of another repository publishes nothing, and its manifest is judged against the published list.
|
|
other := catalogueBuild("b-6", notifierFallingBackTo("font-size", "number"), theFirstKeys, 99)
|
|
other.Repository, other.Source.Repository = "http://forge.internal:20000/novox/notifier.git", "novox/notifier"
|
|
other.Manifest = json.RawMessage(strings.Replace(notifierFallingBackTo("font-size", "number"), `"notifier"`,
|
|
`"chimes"`, 1))
|
|
if _, _, err := takeIn(ctx, open.inventory, asTheOperator(t, open.inventory, other)); err != nil {
|
|
t.Fatalf("a module of another repository naming a published key: %v", err)
|
|
}
|
|
if kept, _, _ = open.inventory.PredefinedKept(ctx); kept.Build != "b-4" {
|
|
t.Fatalf("a build of another repository published its list: %+v", kept)
|
|
}
|
|
other.ID, other.Manifest = "b-7", json.RawMessage(strings.Replace(notifierFallingBackTo("agent-managed-settings",
|
|
"number"), `"notifier"`, `"chimes"`, 1))
|
|
if _, _, err := takeIn(ctx, open.inventory, other); err == nil || !strings.Contains(err.Error(), "not on the list") {
|
|
t.Fatalf("a key only another repository's list holds was registered: %v", err)
|
|
}
|
|
}
|