Preserve missing version checker validation
This commit is contained in:
66
facade_version_test.go
Normal file
66
facade_version_test.go
Normal file
@@ -0,0 +1,66 @@
|
||||
package configkit_test
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
configkit "gitea.maximumdirect.net/eric/ConfigKit"
|
||||
)
|
||||
|
||||
type versionCountingReader struct {
|
||||
*strings.Reader
|
||||
reads int
|
||||
}
|
||||
|
||||
func (r *versionCountingReader) Read(data []byte) (int, error) {
|
||||
r.reads++
|
||||
return r.Reader.Read(data)
|
||||
}
|
||||
|
||||
func TestFacadeRejectsMissingVersionCheckerBeforeReading(t *testing.T) {
|
||||
t.Parallel()
|
||||
type configuration struct {
|
||||
Version string `yaml:"version"`
|
||||
}
|
||||
reader := &versionCountingReader{Reader: strings.NewReader("version: v1\n")}
|
||||
source := configkit.Reader("version.yml", reader)
|
||||
var defaults, resolutions, validations, checks int
|
||||
options := configkit.Options[configuration]{Definition: configkit.Definition[configuration]{
|
||||
Version: &configkit.VersionRule{Path: configkit.Keys("version")},
|
||||
Defaults: func() configuration { defaults++; return configuration{} },
|
||||
Resolve: func(*configuration, *configkit.Resolution) error { resolutions++; return nil },
|
||||
Validate: func(*configuration, *configkit.Validation) { validations++ },
|
||||
}}
|
||||
result, err := configkit.Load(source, options)
|
||||
var loadError *configkit.LoadError
|
||||
if result != nil || !errors.As(err, &loadError) {
|
||||
t.Fatalf("missing checker: result = %v, error = %v", result, err)
|
||||
}
|
||||
diagnostics := loadError.Diagnostics()
|
||||
if len(diagnostics) != 1 || diagnostics[0].Code != configkit.CodeOptionsInvalid {
|
||||
t.Fatalf("diagnostics = %v", diagnostics)
|
||||
}
|
||||
if reader.reads != 0 || defaults != 0 || resolutions != 0 || validations != 0 {
|
||||
t.Fatalf("invalid options performed work: reads=%d defaults=%d resolve=%d validate=%d", reader.reads, defaults, resolutions, validations)
|
||||
}
|
||||
options.Definition.Version.Check = func(version configkit.Version, validation *configkit.Validation) error {
|
||||
checks++
|
||||
if version != (configkit.Version{Present: true, Text: "v1"}) {
|
||||
t.Errorf("version = %#v", version)
|
||||
}
|
||||
validation.Warning(configkit.Keys("version"), "version accepted")
|
||||
return nil
|
||||
}
|
||||
result, err = configkit.Load(source, options)
|
||||
if err != nil || result == nil || result.Config.Version != "v1" {
|
||||
t.Fatalf("reuse with checker: result = %v, error = %v", result, err)
|
||||
}
|
||||
if checks != 1 || defaults != 1 || resolutions != 1 || validations != 1 {
|
||||
t.Fatalf("callback counts: check=%d defaults=%d resolve=%d validate=%d", checks, defaults, resolutions, validations)
|
||||
}
|
||||
diagnostics = result.Diagnostics()
|
||||
if len(diagnostics) != 1 || diagnostics[0].Code != configkit.CodeVersionWarning {
|
||||
t.Fatalf("version callback diagnostics = %v", diagnostics)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user