diff --git a/validator.go b/validator.go index b2ccb952e..ccd2a5590 100644 --- a/validator.go +++ b/validator.go @@ -610,7 +610,7 @@ func (v *Validate) fieldWithNameAndValue(val interface{}, current interface{}, f var valueField reflect.Value // This is a double check if coming from validate.Struct but need to be here in case function is called directly - if tag == noValidationTag { + if tag == noValidationTag || tag == "" { return nil } diff --git a/validator_test.go b/validator_test.go index da195dc1f..8bfff9b2c 100644 --- a/validator_test.go +++ b/validator_test.go @@ -231,6 +231,18 @@ func AssertMapFieldError(t *testing.T, s map[string]*FieldError, field string, e EqualSkip(t, 2, val.Tag, expectedTag) } +func TestBadKeyValidation(t *testing.T) { + type Test struct { + Name string `validate:"required, "` + } + + tst := &Test{ + Name: "test", + } + + PanicMatches(t, func() { validate.Struct(tst) }, "Invalid validation tag on field Name") +} + func TestFlattenValidation(t *testing.T) { type Inner struct { @@ -606,13 +618,29 @@ func TestInterfaceErrValidation(t *testing.T) { Equal(t, err.IsPlaceholderErr, false) Equal(t, err.IsSliceOrArray, false) Equal(t, len(err.SliceOrArrayErrs), 0) + + type MyStruct struct { + A, B string + C interface{} + } + + var a MyStruct + + a.A = "value" + a.C = "nu" + + errs = validate.Struct(a) + Equal(t, errs, nil) } func TestMapDiveValidation(t *testing.T) { + n := map[int]interface{}{0: nil} + err := validate.Field(n, "omitempty,required") + m := map[int]string{0: "ok", 3: "", 4: "ok"} - err := validate.Field(m, "len=3,dive,required") + err = validate.Field(m, "len=3,dive,required") NotEqual(t, err, nil) Equal(t, err.IsPlaceholderErr, true) Equal(t, err.IsMap, true)