@@ -18,12 +18,17 @@ package analysis_test
18
18
import (
19
19
. "github.com/onsi/ginkgo/v2"
20
20
. "github.com/onsi/gomega"
21
+ "gopkg.in/yaml.v3"
21
22
22
23
goanalysis "golang.org/x/tools/go/analysis"
23
24
"k8s.io/apimachinery/pkg/util/sets"
25
+ "k8s.io/apimachinery/pkg/util/validation/field"
24
26
25
27
"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"
26
30
"sigs.k8s.io/kube-api-linter/pkg/config"
31
+ "sigs.k8s.io/kube-api-linter/pkg/markers"
27
32
)
28
33
29
34
var _ = Describe ("Registry" , func () {
@@ -136,4 +141,105 @@ var _ = Describe("Registry", func() {
136
141
}),
137
142
)
138
143
})
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
+ })
139
236
})
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
+ }
0 commit comments