Codebase list golang-github-go-playground-validator-v10 / 27a1d3f
Merge pull request #81 from bluesuncorp/v5-development Fix Issue with nested struct as pointer being nil Dean Karn 8 years ago
2 changed file(s) with 114 addition(s) and 4 deletion(s). Raw diff Collapse all Expand all
2626 tagKeySeparator = "="
2727 structOnlyTag = "structonly"
2828 omitempty = "omitempty"
29 required = "required"
2930 fieldErrMsg = "Field validation for \"%s\" failed on the \"%s\" tag"
3031 structErrMsg = "Struct:%s\n"
3132 )
389390 continue
390391 }
391392
393 if valueField.Kind() == reflect.Ptr && valueField.IsNil() {
394
395 if strings.Contains(cField.tag, omitempty) {
396 continue
397 }
398
399 if strings.Contains(cField.tag, required) {
400
401 validationErrors.Errors[cField.name] = &FieldError{
402 Field: cField.name,
403 Tag: required,
404 Value: valueField.Interface(),
405 }
406
407 continue
408 }
409 }
410
392411 if structErrors := v.structRecursive(top, valueField.Interface(), valueField.Interface()); structErrors != nil {
393412 validationErrors.StructErrors[cField.name] = structErrors
394413 // free up memory map no longer needed
223223 NotEqualSkip(t, 2, val, nil)
224224 EqualSkip(t, 2, val.Field, field)
225225 EqualSkip(t, 2, val.Tag, expectedTag)
226 }
227
228 func TestNilStructPointerValidation(t *testing.T) {
229 type Inner struct {
230 Data string
231 }
232
233 type Outer struct {
234 Inner *Inner `validate:"omitempty"`
235 }
236
237 inner := &Inner{
238 Data: "test",
239 }
240
241 outer := &Outer{
242 Inner: inner,
243 }
244
245 errs := validate.Struct(outer)
246 Equal(t, errs, nil)
247
248 outer = &Outer{
249 Inner: nil,
250 }
251
252 errs = validate.Struct(outer)
253 Equal(t, errs, nil)
254
255 type Inner2 struct {
256 Data string
257 }
258
259 type Outer2 struct {
260 Inner2 *Inner2 `validate:"required"`
261 }
262
263 inner2 := &Inner2{
264 Data: "test",
265 }
266
267 outer2 := &Outer2{
268 Inner2: inner2,
269 }
270
271 errs = validate.Struct(outer2)
272 Equal(t, errs, nil)
273
274 outer2 = &Outer2{
275 Inner2: nil,
276 }
277
278 errs = validate.Struct(outer2)
279 NotEqual(t, errs, nil)
280
281 type Inner3 struct {
282 Data string
283 }
284
285 type Outer3 struct {
286 Inner3 *Inner3
287 }
288
289 inner3 := &Inner3{
290 Data: "test",
291 }
292
293 outer3 := &Outer3{
294 Inner3: inner3,
295 }
296
297 errs = validate.Struct(outer3)
298 Equal(t, errs, nil)
299
300 type Inner4 struct {
301 Data string
302 }
303
304 type Outer4 struct {
305 Inner4 *Inner4 `validate:"-"`
306 }
307
308 inner4 := &Inner4{
309 Data: "test",
310 }
311
312 outer4 := &Outer4{
313 Inner4: inner4,
314 }
315
316 errs = validate.Struct(outer4)
317 Equal(t, errs, nil)
226318 }
227319
228320 func TestSSNValidation(t *testing.T) {
10991191 InnerStruct: nil,
11001192 }
11011193
1102 errs := validate.Struct(outer).Flatten()
1194 errs := validate.Struct(outer)
11031195 NotEqual(t, errs, nil)
11041196
11051197 inner := &Inner{
11101202 InnerStruct: inner,
11111203 }
11121204
1113 errs = validate.Struct(outer).Flatten()
1114 NotEqual(t, errs, nil)
1115 Equal(t, len(errs), 0)
1205 errs = validate.Struct(outer)
1206 Equal(t, errs, nil)
11161207 }
11171208
11181209 func TestGtField(t *testing.T) {