diff --git a/validation/validation.go b/validation/validation.go index f2d94687..465a006f 100644 --- a/validation/validation.go +++ b/validation/validation.go @@ -245,9 +245,14 @@ func (v *Validation) ZipCode(obj interface{}, key string) *Result { } func (v *Validation) apply(chk Validator, obj interface{}) *Result { - if reflect.TypeOf(obj).Kind() == reflect.Ptr { + validatorName := reflect.TypeOf(chk).Name() + if nil == obj { + if chk.IsSatisfied(obj) { + return &Result{Ok: true} + } + } else if reflect.TypeOf(obj).Kind() == reflect.Ptr { if reflect.ValueOf(obj).IsNil() { - if "Required" != chk.GetKey() { + if "Required" != validatorName { return &Result{Ok: true} } } else { diff --git a/validation/validation_test.go b/validation/validation_test.go index bf612015..ef2cc095 100644 --- a/validation/validation_test.go +++ b/validation/validation_test.go @@ -442,3 +442,56 @@ func TestSkipValid(t *testing.T) { t.Fatal("validation should be passed") } } + +func TestPointer(t *testing.T) { + type User struct { + ID int + + Email *string `valid:"Email"` + ReqEmail *string `valid:"Required;Email"` + } + + u := User{ + ReqEmail: nil, + Email: nil, + } + + valid := Validation{} + b, err := valid.Valid(u) + if err != nil { + t.Fatal(err) + } + if b { + t.Fatal("validation should not be passed") + } + + validEmail := "a@a.com" + u = User{ + ReqEmail: &validEmail, + Email: nil, + } + + valid = Validation{RequiredFirst: true} + b, err = valid.Valid(u) + if err != nil { + t.Fatal(err) + } + if !b { + t.Fatal("validation should be passed") + } + + invalidEmail := "a@a" + u = User{ + ReqEmail: &validEmail, + Email: &invalidEmail, + } + + valid = Validation{} + b, err = valid.Valid(u) + if err != nil { + t.Fatal(err) + } + if b { + t.Fatal("validation should not be passed") + } +}