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) } }