Snapshot import defaults at load preflight
This commit is contained in:
@@ -6,8 +6,6 @@ import (
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"gitea.maximumdirect.net/eric/ConfigKit/internal/engine"
|
||||
)
|
||||
|
||||
func TestImportDepthChecksSuffixAfterSaturation(t *testing.T) {
|
||||
@@ -125,20 +123,61 @@ func TestImportDefaultsPreserveEmptyPatternAndRequiredness(t *testing.T) {
|
||||
if sources := loadError.Sources(); len(sources) != 1 || len(sources[0].ImportSelections) != 0 {
|
||||
t.Fatalf("required empty selection was recorded as optional: %#v", sources)
|
||||
}
|
||||
}
|
||||
|
||||
recursiveMain := writeFacadeImportFile(t, directory, "recursive.yml", `configkit:
|
||||
func TestImportDefaultsAreSnapshottedBeforeOrdinaryAndLayeredCallbacks(t *testing.T) {
|
||||
type config struct {
|
||||
Version string `yaml:"version"`
|
||||
Imported string `yaml:"imported"`
|
||||
}
|
||||
for _, layered := range []bool{false, true} {
|
||||
t.Run(map[bool]string{false: "ordinary", true: "layered"}[layered], func(t *testing.T) {
|
||||
directory := t.TempDir()
|
||||
mainPath := writeFacadeImportFile(t, directory, "main.yml", `version: v1
|
||||
configkit:
|
||||
imports:
|
||||
- dir: recursive-files
|
||||
- dir: parts
|
||||
`)
|
||||
writeFacadeImportFile(t, directory, "recursive-files/nested/value.cfg", "value: selected\n")
|
||||
recursive := true
|
||||
patterns := []string{"*.cfg"}
|
||||
engineOptions := toEngineOptions(Options[config]{Imports: true, ImportDefaults: ImportDefaults{Recursive: &recursive, Pattern: patterns}})
|
||||
recursive = false
|
||||
patterns[0] = "["
|
||||
loadedEngine, err := engine.Load(File(recursiveMain).toEngine(), secretBinding(), engineOptions)
|
||||
if err != nil || loadedEngine.Config.Value != "selected" {
|
||||
t.Fatalf("load after mutating caller defaults = %#v, %v", loadedEngine, err)
|
||||
writeFacadeImportFile(t, directory, "parts/nested/value.cfg", "imported: selected\n")
|
||||
|
||||
recursive := true
|
||||
patterns := []string{"*.cfg"}
|
||||
definition := Definition[config]{Version: &VersionRule{
|
||||
Path: Keys("version"),
|
||||
Check: func(version Version, _ *Validation) error {
|
||||
if version != (Version{Present: true, Text: "v1"}) {
|
||||
t.Errorf("version callback received %#v", version)
|
||||
}
|
||||
recursive = false
|
||||
patterns[0] = "*.skip"
|
||||
return nil
|
||||
},
|
||||
}}
|
||||
load := func() (*Result[config], error) {
|
||||
defaults := ImportDefaults{Recursive: &recursive, Pattern: patterns}
|
||||
if layered {
|
||||
return LoadLayered(Input{Source: File(mainPath), Imports: true}, LayeredOptions[config]{
|
||||
Definition: definition, SourceVersionMode: SourceVersionModeIfPresent, ImportDefaults: defaults,
|
||||
})
|
||||
}
|
||||
return Load(File(mainPath), Options[config]{
|
||||
Definition: definition, SourceVersionMode: SourceVersionModeIfPresent, Imports: true, ImportDefaults: defaults,
|
||||
})
|
||||
}
|
||||
|
||||
first, err := load()
|
||||
if err != nil || first.Config.Imported != "selected" {
|
||||
t.Fatalf("load with pre-callback defaults = %#v, %v", first, err)
|
||||
}
|
||||
if recursive || patterns[0] != "*.skip" {
|
||||
t.Fatalf("version callback did not mutate caller defaults: recursive=%v pattern=%q", recursive, patterns[0])
|
||||
}
|
||||
|
||||
second, err := load()
|
||||
if err != nil || second.Config.Imported != "" {
|
||||
t.Fatalf("subsequent load reused earlier defaults: %#v, %v", second, err)
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user