67 lines
2.5 KiB
Go
67 lines
2.5 KiB
Go
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)
|
|
}
|
|
}
|