70 lines
2.9 KiB
Go
70 lines
2.9 KiB
Go
package configkit_test
|
|
|
|
import (
|
|
"fmt"
|
|
"testing"
|
|
"testing/fstest"
|
|
|
|
configkit "gitea.maximumdirect.net/eric/ConfigKit"
|
|
)
|
|
|
|
func TestFacadeItemScopesDoNotReinterpretGlobalRegistrations(t *testing.T) {
|
|
t.Parallel()
|
|
for _, layered := range []bool{false, true} {
|
|
for _, dynamic := range []bool{false, true} {
|
|
for _, missingOuterID := range []bool{false, true} {
|
|
t.Run(fmt.Sprintf("layered=%t/dynamic=%t/missing-outer-id=%t", layered, dynamic, missingOuterID), func(t *testing.T) {
|
|
payload := "prompts: [{text: helper}]\n"
|
|
unused := configkit.SequenceIdentityAt(configkit.Keys("prompts"), "id")
|
|
if dynamic {
|
|
payload = "catalog: {local: {prompts: [{text: helper}]}}\n"
|
|
unused = configkit.SequenceIdentityMatching(configkit.SequenceSelector{
|
|
configkit.SequenceLiteralKey("catalog"), configkit.SequenceAnyMappingKey(), configkit.SequenceLiteralKey("prompts"),
|
|
}, "id")
|
|
}
|
|
item := "configkit: {imports: [{path: helper.yml}, {path: child.yml, destination: [children], placement: sequence-item}]}\n"
|
|
if !missingOuterID {
|
|
item += "id: outer\n"
|
|
}
|
|
files := configkit.NewFilesystem("items", fstest.MapFS{
|
|
"main.yml": {Data: []byte("configkit: {imports: [{path: item.yml, destination: [items], placement: sequence-item}]}\n")},
|
|
"item.yml": {Data: []byte(item)}, "helper.yml": {Data: []byte(payload)},
|
|
"child.yml": {Data: []byte("id: child\nconfigkit: {imports: [{path: child-helper.yml}]}\n")},
|
|
"child-helper.yml": {Data: []byte(payload)},
|
|
})
|
|
definition := configkit.Definition[map[string]any]{SequenceIdentities: []configkit.SequenceIdentity{
|
|
unused, configkit.SequenceIdentityAt(configkit.Keys("items"), "id"),
|
|
}}
|
|
var result *configkit.Result[map[string]any]
|
|
var err error
|
|
if layered {
|
|
result, err = configkit.LoadLayered(configkit.Input{Source: files.File("main.yml"), Imports: true}, configkit.LayeredOptions[map[string]any]{Definition: definition})
|
|
} else {
|
|
result, err = configkit.Load(files.File("main.yml"), configkit.Options[map[string]any]{Imports: true, Definition: definition})
|
|
}
|
|
if missingOuterID {
|
|
failure := requireFacadeLoadError(t, err)
|
|
if result != nil || len(failure.Diagnostics()) != 1 || failure.Diagnostics()[0].Code != configkit.CodeComposeInvalid || failure.Diagnostics()[0].Path.String() != "/items/0/id" {
|
|
t.Fatalf("outer constraint diagnostics = %#v", failure.Diagnostics())
|
|
}
|
|
return
|
|
}
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
for _, record := range []configkit.Path{configkit.Keys("items").Index(0), configkit.Keys("items").Index(0).Key("children").Index(0)} {
|
|
path := record
|
|
if dynamic {
|
|
path = path.Key("catalog").Key("local")
|
|
}
|
|
info, found := result.Metadata().Lookup(path.Key("prompts").Index(0).Key("text"))
|
|
if !found || !info.Explicit {
|
|
t.Fatalf("nested helper payload lost at %s", path)
|
|
}
|
|
}
|
|
})
|
|
}
|
|
}
|
|
}
|
|
}
|