Skip to content

Commit 2f10a08

Browse files
committed
Add validation of linter configuration
1 parent e605c58 commit 2f10a08

File tree

2 files changed

+149
-0
lines changed

2 files changed

+149
-0
lines changed

pkg/validation/linters_config.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func ValidateLintersConfig(lc config.LintersConfig, fldPath *field.Path) field.E
3232
fieldErrors = append(fieldErrors, validateConditionsConfig(lc.Conditions, fldPath.Child("conditions"))...)
3333
fieldErrors = append(fieldErrors, validateJSONTagsConfig(lc.JSONTags, fldPath.Child("jsonTags"))...)
3434
fieldErrors = append(fieldErrors, validateNoMapsConfig(lc.NoMaps, fldPath.Child("nomaps"))...)
35+
fieldErrors = append(fieldErrors, validateOptionalFieldsConfig(lc.OptionalFields, fldPath.Child("optionalFields"))...)
3536
fieldErrors = append(fieldErrors, validateOptionalOrRequiredConfig(lc.OptionalOrRequired, fldPath.Child("optionalOrRequired"))...)
3637
fieldErrors = append(fieldErrors, validateRequiredFieldsConfig(lc.RequiredFields, fldPath.Child("requiredFields"))...)
3738

@@ -90,6 +91,48 @@ func validateNoMapsConfig(nmc config.NoMapsConfig, fldPath *field.Path) field.Er
9091
return fieldErrors
9192
}
9293

94+
// validateOptionalFieldsConfig is used to validate the configuration in the config.OptionalFieldsConfig struct.
95+
func validateOptionalFieldsConfig(ofc config.OptionalFieldsConfig, fldPath *field.Path) field.ErrorList {
96+
fieldErrors := field.ErrorList{}
97+
98+
fieldErrors = append(fieldErrors, validateOptionFieldsPointers(ofc.Pointers, fldPath.Child("pointers"))...)
99+
fieldErrors = append(fieldErrors, validateOptionFieldsOmitEmpty(ofc.OmitEmpty, fldPath.Child("omitEmpty"))...)
100+
101+
return fieldErrors
102+
}
103+
104+
// validateOptionFieldsPointers is used to validate the configuration in the config.OptionalFieldsPointers struct.
105+
func validateOptionFieldsPointers(opc config.OptionalFieldsPointers, fldPath *field.Path) field.ErrorList {
106+
fieldErrors := field.ErrorList{}
107+
108+
switch opc.Preference {
109+
case "", config.OptionalFieldsPointerPreferenceAlways, config.OptionalFieldsPointerPreferenceWhenRequired:
110+
default:
111+
fieldErrors = append(fieldErrors, field.Invalid(fldPath.Child("preference"), opc.Preference, fmt.Sprintf("invalid value, must be one of %q, %q or omitted", config.OptionalFieldsPointerPreferenceAlways, config.OptionalFieldsPointerPreferenceWhenRequired)))
112+
}
113+
114+
switch opc.Policy {
115+
case "", config.OptionalFieldsPointerPolicySuggestFix, config.OptionalFieldsPointerPolicyWarn:
116+
default:
117+
fieldErrors = append(fieldErrors, field.Invalid(fldPath.Child("policy"), opc.Policy, fmt.Sprintf("invalid value, must be one of %q, %q or omitted", config.OptionalFieldsPointerPolicySuggestFix, config.OptionalFieldsPointerPolicyWarn)))
118+
}
119+
120+
return fieldErrors
121+
}
122+
123+
// validateOptionFieldsOmitEmpty is used to validate the configuration in the config.OptionalFieldsOmitEmpty struct.
124+
func validateOptionFieldsOmitEmpty(oec config.OptionalFieldsOmitEmpty, fldPath *field.Path) field.ErrorList {
125+
fieldErrors := field.ErrorList{}
126+
127+
switch oec.Policy {
128+
case "", config.OptionalFieldsOmitEmptyPolicyIgnore, config.OptionalFieldsOmitEmptyPolicySuggestFix:
129+
default:
130+
fieldErrors = append(fieldErrors, field.Invalid(fldPath.Child("policy"), oec.Policy, fmt.Sprintf("invalid value, must be one of %q, %q or omitted", config.OptionalFieldsOmitEmptyPolicyIgnore, config.OptionalFieldsOmitEmptyPolicySuggestFix)))
131+
}
132+
133+
return fieldErrors
134+
}
135+
93136
// validateOptionalOrRequiredConfig is used to validate the configuration in the config.OptionalOrRequiredConfig struct.
94137
func validateOptionalOrRequiredConfig(oorc config.OptionalOrRequiredConfig, fldPath *field.Path) field.ErrorList {
95138
fieldErrors := field.ErrorList{}

pkg/validation/linters_config_test.go

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,112 @@ var _ = Describe("LintersConfig", func() {
221221
expectedErr: `lintersConfig.nomaps.policy: Invalid value: "invalid": invalid value, must be one of "Enforce", "AllowStringToStringMaps", "Ignore" or omitted`,
222222
}),
223223

224+
// OptionalFieldsConfig validation
225+
Entry("With a valid OptionalFieldsConfig", validateLintersConfigTableInput{
226+
config: config.LintersConfig{
227+
OptionalFields: config.OptionalFieldsConfig{
228+
Pointers: config.OptionalFieldsPointers{
229+
Preference: "",
230+
Policy: "",
231+
},
232+
OmitEmpty: config.OptionalFieldsOmitEmpty{
233+
Policy: "",
234+
},
235+
},
236+
},
237+
expectedErr: "",
238+
}),
239+
Entry("With a valid OptionalFieldsConfig: Pointer Preference Always", validateLintersConfigTableInput{
240+
config: config.LintersConfig{
241+
OptionalFields: config.OptionalFieldsConfig{
242+
Pointers: config.OptionalFieldsPointers{
243+
Preference: config.OptionalFieldsPointerPreferenceAlways,
244+
},
245+
},
246+
},
247+
expectedErr: "",
248+
}),
249+
Entry("With a valid OptionalFieldsConfig: Pointer Preference WhenRequired", validateLintersConfigTableInput{
250+
config: config.LintersConfig{
251+
OptionalFields: config.OptionalFieldsConfig{
252+
Pointers: config.OptionalFieldsPointers{
253+
Preference: config.OptionalFieldsPointerPreferenceWhenRequired,
254+
},
255+
},
256+
},
257+
expectedErr: "",
258+
}),
259+
Entry("With an invalid OptionalFieldsConfig: Pointer Preference", validateLintersConfigTableInput{
260+
config: config.LintersConfig{
261+
OptionalFields: config.OptionalFieldsConfig{
262+
Pointers: config.OptionalFieldsPointers{
263+
Preference: "invalid",
264+
},
265+
},
266+
},
267+
expectedErr: "lintersConfig.optionalFields.pointers.preference: Invalid value: \"invalid\": invalid value, must be one of \"Always\", \"WhenRequired\" or omitted",
268+
}),
269+
Entry("With a valid OptionalFieldsConfig: Pointer Policy SuggestFix", validateLintersConfigTableInput{
270+
config: config.LintersConfig{
271+
OptionalFields: config.OptionalFieldsConfig{
272+
Pointers: config.OptionalFieldsPointers{
273+
Policy: config.OptionalFieldsPointerPolicySuggestFix,
274+
},
275+
},
276+
},
277+
expectedErr: "",
278+
}),
279+
Entry("With a valid OptionalFieldsConfig: Pointer Policy Warn", validateLintersConfigTableInput{
280+
config: config.LintersConfig{
281+
OptionalFields: config.OptionalFieldsConfig{
282+
Pointers: config.OptionalFieldsPointers{
283+
Policy: config.OptionalFieldsPointerPolicyWarn,
284+
},
285+
},
286+
},
287+
expectedErr: "",
288+
}),
289+
Entry("With an invalid OptionalFieldsConfig: Pointer Policy", validateLintersConfigTableInput{
290+
config: config.LintersConfig{
291+
OptionalFields: config.OptionalFieldsConfig{
292+
Pointers: config.OptionalFieldsPointers{
293+
Policy: "invalid",
294+
},
295+
},
296+
},
297+
expectedErr: "lintersConfig.optionalFields.pointers.policy: Invalid value: \"invalid\": invalid value, must be one of \"SuggestFix\", \"Warn\" or omitted",
298+
}),
299+
Entry("With a valid OptionalFieldsConfig: OmitEmpty Policy Ignore", validateLintersConfigTableInput{
300+
config: config.LintersConfig{
301+
OptionalFields: config.OptionalFieldsConfig{
302+
OmitEmpty: config.OptionalFieldsOmitEmpty{
303+
Policy: config.OptionalFieldsOmitEmptyPolicyIgnore,
304+
},
305+
},
306+
},
307+
expectedErr: "",
308+
}),
309+
Entry("With a valid OptionalFieldsConfig: OmitEmpty Policy SuggestFix", validateLintersConfigTableInput{
310+
config: config.LintersConfig{
311+
OptionalFields: config.OptionalFieldsConfig{
312+
OmitEmpty: config.OptionalFieldsOmitEmpty{
313+
Policy: config.OptionalFieldsOmitEmptyPolicySuggestFix,
314+
},
315+
},
316+
},
317+
expectedErr: "",
318+
}),
319+
Entry("With an invalid OptionalFieldsConfig: OmitEmpty Policy", validateLintersConfigTableInput{
320+
config: config.LintersConfig{
321+
OptionalFields: config.OptionalFieldsConfig{
322+
OmitEmpty: config.OptionalFieldsOmitEmpty{
323+
Policy: "invalid",
324+
},
325+
},
326+
},
327+
expectedErr: "lintersConfig.optionalFields.omitEmpty.policy: Invalid value: \"invalid\": invalid value, must be one of \"Ignore\", \"SuggestFix\" or omitted",
328+
}),
329+
224330
// OptionalOrRequiredConfig validation
225331
Entry("With a valid OptionalOrRequiredConfig", validateLintersConfigTableInput{
226332
config: config.LintersConfig{

0 commit comments

Comments
 (0)