2026-11-09 20:41:54 +00:00
|
|
|
package consumers_test
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"fmt"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
|
|
configkit "go.maximumdirect.net/configkit"
|
|
|
|
|
"go.maximumdirect.net/configkit/examples/consumers"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
func Example_mainRelativeCompanions() {
|
|
|
|
|
result, err := consumers.LoadCompanionConfig(fixture("main-relative", "main.yml"), "live")
|
|
|
|
|
if err != nil {
|
|
|
|
|
fmt.Println(err)
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
fmt.Println(result.Config.Mode, result.Config.Prompts)
|
|
|
|
|
// Output: overlay [{shared operator replacement } {bundled bundled text } {local local text transitive detail}]
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func TestMainRelativeStrictPeers(t *testing.T) {
|
|
|
|
|
root := t.TempDir()
|
|
|
|
|
for name, contents := range map[string]string{
|
|
|
|
|
"main.yml": "mode: main\n", "prompts.yml": "id: duplicate\ntext: first\n", "operator/second.yml": "id: duplicate\ntext: second\n",
|
|
|
|
|
} {
|
|
|
|
|
file := filepath.Join(root, name)
|
|
|
|
|
if err := os.MkdirAll(filepath.Dir(file), 0700); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if err := os.WriteFile(file, []byte(contents), 0600); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
_, err := consumers.LoadCompanionConfig(filepath.Join(root, "main.yml"), "")
|
|
|
|
|
if err == nil {
|
|
|
|
|
t.Fatal("duplicate peer identities succeeded")
|
|
|
|
|
}
|
|
|
|
|
for _, d := range err.(*configkit.LoadError).Diagnostics() {
|
|
|
|
|
if d.Code == configkit.CodeComposeConflict {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
t.Fatalf("diagnostics = %#v", err.(*configkit.LoadError).Diagnostics())
|
|
|
|
|
}
|
2026-11-09 20:44:32 +00:00
|
|
|
|
|
|
|
|
func TestMainRelativeOptionalResources(t *testing.T) {
|
|
|
|
|
for _, tc := range []struct {
|
|
|
|
|
name string
|
|
|
|
|
file, directory, empty bool
|
|
|
|
|
count int
|
|
|
|
|
}{
|
|
|
|
|
{"neither", false, false, false, 2}, {"file", true, false, false, 3},
|
|
|
|
|
{"directory", false, true, false, 3}, {"both", true, true, false, 4}, {"empty directory", false, false, true, 2},
|
|
|
|
|
} {
|
|
|
|
|
t.Run(tc.name, func(t *testing.T) {
|
|
|
|
|
root := t.TempDir()
|
|
|
|
|
if err := os.WriteFile(filepath.Join(root, "main.yml"), []byte("mode: main\n"), 0600); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
if tc.file {
|
|
|
|
|
if err := os.WriteFile(filepath.Join(root, "prompts.yml"), []byte("id: file\ntext: file\n"), 0600); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if tc.directory || tc.empty {
|
|
|
|
|
if err := os.Mkdir(filepath.Join(root, "operator"), 0700); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if tc.directory {
|
|
|
|
|
if err := os.WriteFile(filepath.Join(root, "operator", "item.yaml"), []byte("id: directory\ntext: directory\n"), 0600); err != nil {
|
|
|
|
|
t.Fatal(err)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
result, err := consumers.LoadCompanionConfig(filepath.Join(root, "main.yml"), "")
|
|
|
|
|
if err != nil {
|
|
|
|
|
t.Fatalf("%v: %#v", err, err.(*configkit.LoadError).Diagnostics())
|
|
|
|
|
}
|
|
|
|
|
if len(result.Config.Prompts) != tc.count {
|
|
|
|
|
t.Fatalf("prompts = %#v", result.Config.Prompts)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
|
|
|
|
}
|