package configkit_test import ( "errors" "testing" configkit "go.maximumdirect.net/configkit" ) func TestFacadeResolutionPresenceUsesDynamicEntryShape(t *testing.T) { t.Parallel() type configuration struct { Shape any `yaml:"shape"` } tests := []struct { name string input string keyPresent bool }{ {name: "mapping key", input: "shape: {'0': input}\n", keyPresent: true}, {name: "sequence index", input: "shape: [input]\n", keyPresent: false}, } for _, test := range tests { t.Run(test.name, func(t *testing.T) { parsed, err := configkit.ParsePath("/shape/0") if err != nil { t.Fatal(err) } _, err = configkit.Load(configkit.Bytes("dynamic.yml", []byte(test.input)), configkit.Options[configuration]{ Definition: configkit.Definition[configuration]{ Resolve: func(_ *configuration, resolution *configkit.Resolution) error { check := func(path configkit.Path, want bool) error { info, found := resolution.EntryInfo(path) explicit := resolution.IsExplicit(path) if found != want || explicit != want || (found && info.Explicit != explicit) { return errors.New("resolution presence disagrees with dynamic entry shape") } return nil } for _, checkPath := range []struct { path configkit.Path want bool }{ {path: configkit.Keys("shape", "0"), want: test.keyPresent}, {path: configkit.Keys("shape").Index(0), want: !test.keyPresent}, {path: parsed, want: true}, {path: configkit.Keys("shape", "missing"), want: false}, } { if err := check(checkPath.path, checkPath.want); err != nil { return err } } return nil }, }, }) if err != nil { t.Fatal(err) } }) } }