Files
ConfigKit/facade_version_test.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)
}
}