package configkit_test import ( "testing" configkit "go.maximumdirect.net/configkit" ) func TestMainRelativeOptions(t *testing.T) { if configkit.MainRelative() == configkit.MainRelative() { t.Fatal("binding descriptions must be distinct") } invalid := &configkit.FilesystemContext{BaseDir: "relative", Root: "relative"} cases := []struct { name string main configkit.Input underlay configkit.Input overlay string overlayContext, fallback *configkit.FilesystemContext wantError bool }{ {name: "binding on main", main: configkit.Input{Source: configkit.NoSource(), MainRelative: configkit.MainRelative()}, wantError: true}, {name: "binding on file", underlay: configkit.Input{Source: configkit.File("missing"), MainRelative: configkit.MainRelative()}, wantError: true}, {name: "invalid fallback", underlay: configkit.Input{Source: configkit.NoSource(), MainRelative: &configkit.MainRelativeContext{Fallback: invalid}}, wantError: true}, {name: "shadowed binding", underlay: configkit.Input{Source: configkit.NoSource(), Filesystem: &configkit.FilesystemContext{Root: t.TempDir()}, MainRelative: &configkit.MainRelativeContext{Fallback: invalid}}}, {name: "inactive overlay fallback", fallback: invalid}, {name: "invalid explicit overlay", overlay: "test", overlayContext: invalid, fallback: &configkit.FilesystemContext{Root: t.TempDir(), BaseDir: t.TempDir()}, wantError: true}, } for _, tc := range cases { t.Run(tc.name, func(t *testing.T) { main := tc.main if tc.name != "binding on main" { main.Source = configkit.NoSource() } opts := configkit.LayeredOptions[layeredFacadeConfig]{Overlay: tc.overlay, OverlayFilesystem: tc.overlayContext, OverlayFallback: tc.fallback} if tc.name == "binding on file" || tc.name == "invalid fallback" || tc.name == "shadowed binding" { opts.Underlays = []configkit.Underlay{{Inputs: []configkit.Input{tc.underlay}}} } _, err := configkit.LoadLayered(main, opts) if (err != nil) != tc.wantError { t.Fatalf("error = %v, want error %v", err, tc.wantError) } }) } }