Skip to content

Commit a057db4

Browse files
committed
Ensure validation testing in registry initialization
1 parent 4a81895 commit a057db4

File tree

4 files changed

+108
-331
lines changed

4 files changed

+108
-331
lines changed

pkg/analysis/registry_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,17 @@ package analysis_test
1818
import (
1919
. "github.com/onsi/ginkgo/v2"
2020
. "github.com/onsi/gomega"
21+
"gopkg.in/yaml.v3"
2122

2223
goanalysis "golang.org/x/tools/go/analysis"
2324
"k8s.io/apimachinery/pkg/util/sets"
25+
"k8s.io/apimachinery/pkg/util/validation/field"
2426

2527
"sigs.k8s.io/kube-api-linter/pkg/analysis"
28+
"sigs.k8s.io/kube-api-linter/pkg/analysis/jsontags"
29+
"sigs.k8s.io/kube-api-linter/pkg/analysis/optionalorrequired"
2630
"sigs.k8s.io/kube-api-linter/pkg/config"
31+
"sigs.k8s.io/kube-api-linter/pkg/markers"
2732
)
2833

2934
var _ = Describe("Registry", func() {
@@ -136,4 +141,105 @@ var _ = Describe("Registry", func() {
136141
}),
137142
)
138143
})
144+
145+
Context("ValidateLintersConfig", func() {
146+
type validateLintersConfigTableInput struct {
147+
linters config.Linters
148+
config config.LintersConfig
149+
expectedErr string
150+
}
151+
152+
DescribeTable("Validate Linters Configuration", func(in validateLintersConfigTableInput) {
153+
r := analysis.NewRegistry()
154+
errs := r.ValidateLintersConfig(in.linters, in.config, field.NewPath("lintersConfig"))
155+
if len(in.expectedErr) > 0 {
156+
Expect(errs.ToAggregate()).To(MatchError(in.expectedErr))
157+
} else {
158+
Expect(errs).To(HaveLen(0), "No errors were expected")
159+
}
160+
},
161+
Entry("Empty config", validateLintersConfigTableInput{
162+
linters: config.Linters{},
163+
config: config.LintersConfig{},
164+
expectedErr: "",
165+
}),
166+
167+
Entry("With a valid JSONTagsConfig JSONTagRegex", validateLintersConfigTableInput{
168+
linters: config.Linters{},
169+
config: config.LintersConfig{
170+
"jsontags": toYaml(jsontags.JSONTagsConfig{
171+
JSONTagRegex: "^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*$",
172+
}),
173+
},
174+
}),
175+
Entry("With an invalid JSONTagsConfig JSONTagRegex", validateLintersConfigTableInput{
176+
config: config.LintersConfig{
177+
"jsontags": toYaml(jsontags.JSONTagsConfig{
178+
JSONTagRegex: "^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*",
179+
}),
180+
},
181+
expectedErr: "lintersConfig.jsontags.jsonTagRegex: Invalid value: \"^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*\": invalid regex: error parsing regexp: missing closing ): `^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*`",
182+
}),
183+
Entry("With a valid JSONTagsConfig JSONTagRegex (legacy field name)", validateLintersConfigTableInput{
184+
linters: config.Linters{},
185+
config: config.LintersConfig{
186+
"jsonTags": toYaml(jsontags.JSONTagsConfig{
187+
JSONTagRegex: "^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*)*$",
188+
}),
189+
},
190+
}),
191+
Entry("With an invalid JSONTagsConfig JSONTagRegex (legacy field name)", validateLintersConfigTableInput{
192+
config: config.LintersConfig{
193+
"jsonTags": toYaml(jsontags.JSONTagsConfig{
194+
JSONTagRegex: "^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*",
195+
}),
196+
},
197+
expectedErr: "lintersConfig.jsontags.jsonTagRegex: Invalid value: \"^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*\": invalid regex: error parsing regexp: missing closing ): `^[a-z][a-z0-9]*(?:[A-Z][a-z0-9]*`",
198+
}),
199+
200+
Entry("With a valid OptionalOrRequiredConfig (legacy field name)", validateLintersConfigTableInput{
201+
config: config.LintersConfig{
202+
"optionalOrRequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
203+
PreferredOptionalMarker: markers.OptionalMarker,
204+
PreferredRequiredMarker: markers.RequiredMarker,
205+
}),
206+
},
207+
expectedErr: "",
208+
}),
209+
Entry("With kubebuilder preferred markers (legacy field name)", validateLintersConfigTableInput{
210+
config: config.LintersConfig{
211+
"optionalOrRequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
212+
PreferredOptionalMarker: markers.KubebuilderOptionalMarker,
213+
PreferredRequiredMarker: markers.KubebuilderRequiredMarker,
214+
}),
215+
},
216+
expectedErr: "",
217+
}),
218+
Entry("With invalid preferred optional marker (legacy field name)", validateLintersConfigTableInput{
219+
config: config.LintersConfig{
220+
"optionalOrRequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
221+
PreferredOptionalMarker: "invalid",
222+
}),
223+
},
224+
expectedErr: "lintersConfig.optionalorrequired.preferredOptionalMarker: Invalid value: \"invalid\": invalid value, must be one of \"optional\", \"kubebuilder:validation:Optional\" or omitted",
225+
}),
226+
Entry("With invalid preferred required marker (legacy field name)", validateLintersConfigTableInput{
227+
config: config.LintersConfig{
228+
"optionalOrRequired": toYaml(optionalorrequired.OptionalOrRequiredConfig{
229+
PreferredRequiredMarker: "invalid",
230+
}),
231+
},
232+
expectedErr: "lintersConfig.optionalorrequired.preferredRequiredMarker: Invalid value: \"invalid\": invalid value, must be one of \"required\", \"kubebuilder:validation:Required\" or omitted",
233+
}),
234+
)
235+
})
139236
})
237+
238+
func toYaml(v any) []byte {
239+
yaml, err := yaml.Marshal(v)
240+
if err != nil {
241+
panic(err)
242+
}
243+
244+
return yaml
245+
}

pkg/validation/config.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package validation
1717

1818
import (
1919
"k8s.io/apimachinery/pkg/util/validation/field"
20+
"sigs.k8s.io/kube-api-linter/pkg/analysis"
2021
"sigs.k8s.io/kube-api-linter/pkg/config"
2122
)
2223

@@ -30,7 +31,7 @@ func ValidateGolangCIConfig(g config.GolangCIConfig, fldPath *field.Path) error
3031
var fieldErrors field.ErrorList
3132

3233
fieldErrors = append(fieldErrors, ValidateLinters(g.Linters, fldPath.Child("linters"))...)
33-
fieldErrors = append(fieldErrors, ValidateLintersConfig(g.Linters, g.LintersConfig, fldPath.Child("lintersConfig"))...)
34+
fieldErrors = append(fieldErrors, analysis.NewRegistry().ValidateLintersConfig(g.Linters, g.LintersConfig, fldPath.Child("lintersConfig"))...)
3435

3536
return fieldErrors.ToAggregate()
3637
}

pkg/validation/linters_config.go

Lines changed: 0 additions & 28 deletions
This file was deleted.

0 commit comments

Comments
 (0)