97 lines
4.6 KiB
Go
97 lines
4.6 KiB
Go
package catalogue
|
|
|
|
import (
|
|
"reflect"
|
|
"strings"
|
|
"testing"
|
|
)
|
|
|
|
// A collection is declared and filled by the client (novox/hq ADR 0349 §13, design 57 L1, issue 684): a collector
|
|
// names a collection it collects, a contributor an item from a template of its own, and a handed composition plans
|
|
// both for the node's provisioner client and renders neither. The three old namespaces read as collections of their
|
|
// own name. Each file is filled one way: a piece of the other form on the machine is said as not placed.
|
|
|
|
const (
|
|
collectorZsh = `{"module":"zsh","version":"1","moved":true,
|
|
"claims":[{"name":"node-login-shell","scope":"node"}],
|
|
"collections":[{"name":"widgets","comment":"#"}],
|
|
"build":{"artifacts":[{"name":"files","kind":"archive","from":"files"}]},
|
|
"resources":[{"id":"rc","type":"file","path":"${machine:account-home}/.zshrc","owner":"${machine:account}",
|
|
"mode":"0644","template":"files/zshrc"}]}`
|
|
zshrcText = "# zsh\n${shell:zsh:normal}${collected:widgets}"
|
|
contributorText = "source ${machine:account-home}/.p10k.zsh\n"
|
|
contributorP10k = `{"module":"prompt","version":"1","moved":true,
|
|
"items":[{"collection":"shell:zsh:normal","template":"files/zsh"}],
|
|
"build":{"artifacts":[{"name":"files","kind":"archive","from":"files"}]}}`
|
|
oldFormAliases = `{"module":"aliases","version":"1",
|
|
"shell":[{"for":"zsh","slot":"normal","code":"alias ll='ls -l'\n"}]}`
|
|
)
|
|
|
|
func builtWith(module string, texts map[string]string) []Built {
|
|
return []Built{{Name: "files", Kind: ArtifactArchive,
|
|
Reference: ArtifactStoreScheme + module + "/files/blobs/sha256:" + strings.Repeat("e", 64),
|
|
Digest: "sha256:" + strings.Repeat("e", 64), Texts: texts}}
|
|
}
|
|
|
|
func collectionsOn(t *testing.T) Resolution {
|
|
t.Helper()
|
|
zsh := held(t, collectorZsh, builtWith("zsh", map[string]string{"zshrc": zshrcText}))
|
|
prompt := held(t, contributorP10k, builtWith("prompt", map[string]string{"zsh": contributorText}))
|
|
aliases, err := decodeForTest([]byte(oldFormAliases))
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r, err := Resolve(shelf(zsh, prompt, aliases), []string{"zsh", "prompt", "aliases"}, workstation(), World{})
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
r.Account = "op"
|
|
return r
|
|
}
|
|
|
|
func TestAContributorsBuildKeepsItsItemsTemplateAndText(t *testing.T) {
|
|
m := held(t, contributorP10k, builtWith("prompt", map[string]string{"zsh": contributorText}))
|
|
if m.Handed == nil || !reflect.DeepEqual(m.Handed.Items, map[string]string{"shell:zsh:normal": "zsh"}) {
|
|
t.Fatalf("the build kept %+v", m.Handed)
|
|
}
|
|
if !reflect.DeepEqual(m.Items, []Item{{Collection: "shell:zsh:normal", Content: contributorText}}) {
|
|
t.Fatalf("the held items are %+v: the template's text, read back", m.Items)
|
|
}
|
|
}
|
|
|
|
func TestAHandedCollectorAndContributorArePlannedAndNeitherIsRendered(t *testing.T) {
|
|
c, got := composeWith(t, collectionsOn(t), handingTo("store:5000"))
|
|
if strings.Contains(got, ".p10k.zsh") || strings.Contains(got, "alias ll") {
|
|
t.Fatalf("the controller rendered a contribution into a handed collector: %s", got)
|
|
}
|
|
zsh, prompt := c.Plans["zsh"], c.Plans["prompt"]
|
|
wantCollections := []PlanCollection{{Name: "shell:zsh:normal", Comment: "#"}, {Name: "widgets", Comment: "#"}}
|
|
if !reflect.DeepEqual(zsh.Collections, wantCollections) || len(zsh.Items) != 0 {
|
|
t.Fatalf("zsh's plan collects %+v and contributes %+v", zsh.Collections, zsh.Items)
|
|
}
|
|
if !reflect.DeepEqual(prompt.Items, []PlanItem{{Collection: "shell:zsh:normal", Template: "zsh"}}) ||
|
|
len(prompt.Files) != 0 || prompt.Placement["machine:account-home"] != "/home/op" {
|
|
t.Fatalf("prompt's plan is %+v: its item, by template, and the placement its template names", prompt)
|
|
}
|
|
// The old form on the same machine is not placed, and said so.
|
|
if len(c.Unplaced) != 1 || !strings.Contains(c.Unplaced[0], "aliases's shell:zsh:normal is not placed") {
|
|
t.Fatalf("unplaced: %v", c.Unplaced)
|
|
}
|
|
}
|
|
|
|
// A collector filled the old way holds the old forms and each moved contributor's item, rendered from the text the
|
|
// mesh holds as its old form was (design 57 L2, issue 681), so the file loses no line where nothing is handed; a
|
|
// collection of the new form stays empty.
|
|
func TestACollectorFilledTheOldWayHoldsTheOldFormsAndEachHeldItem(t *testing.T) {
|
|
c, got := composeWith(t, collectionsOn(t), Rendering{ArtifactStore: "store:5000"})
|
|
if c.Plans != nil {
|
|
t.Fatalf("handed on a machine that cannot take it: %v", c.Plans)
|
|
}
|
|
if !strings.Contains(got, `"content":"# zsh\n# aliases\nalias ll='ls -l'\n# prompt\nsource /home/op/.p10k.zsh\n"`) {
|
|
t.Fatalf("the old way does not hold the old forms and the held item in module order: %s", got)
|
|
}
|
|
if len(c.Unplaced) != 0 {
|
|
t.Fatalf("unplaced: %v", c.Unplaced)
|
|
}
|
|
}
|