diff --git a/README.md b/README.md index 8b730b6..9d0a79e 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ Package validator ================= [![Join the chat at https://gitter.im/go-playground/validator](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/go-playground/validator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -![Project status](https://img.shields.io/badge/version-10.11.0-green.svg) +![Project status](https://img.shields.io/badge/version-10.11.1-green.svg) [![Build Status](https://travis-ci.org/go-playground/validator.svg?branch=master)](https://travis-ci.org/go-playground/validator) [![Coverage Status](https://coveralls.io/repos/go-playground/validator/badge.svg?branch=master&service=github)](https://coveralls.io/github/go-playground/validator?branch=master) [![Go Report Card](https://goreportcard.com/badge/github.com/go-playground/validator)](https://goreportcard.com/report/github.com/go-playground/validator) diff --git a/baked_in.go b/baked_in.go index f2f0939..c9b1db4 100644 --- a/baked_in.go +++ b/baked_in.go @@ -1484,10 +1484,15 @@ func isAlphaUnicode(fl FieldLevel) bool { return alphaUnicodeRegex.MatchString(fl.Field().String()) } -// isBoolean is the validation function for validating if the current field's value can be safely converted to a boolean. +// isBoolean is the validation function for validating if the current field's value is a valid boolean value or can be safely converted to a boolean value. func isBoolean(fl FieldLevel) bool { - _, err := strconv.ParseBool(fl.Field().String()) - return err == nil + switch fl.Field().Kind() { + case reflect.Bool: + return true + default: + _, err := strconv.ParseBool(fl.Field().String()) + return err == nil + } } // isDefault is the opposite of required aka hasValue diff --git a/validator_test.go b/validator_test.go index 1ebdea5..7e314d6 100644 --- a/validator_test.go +++ b/validator_test.go @@ -8302,6 +8302,43 @@ func TestNumeric(t *testing.T) { errs = validate.Var(i, "numeric") Equal(t, errs, nil) } +func TestBoolean(t *testing.T) { + validate := New() + + b := true + errs := validate.Var(b, "boolean") + Equal(t, errs, nil) + + b = false + errs = validate.Var(b, "boolean") + Equal(t, errs, nil) + + s := "true" + errs = validate.Var(s, "boolean") + Equal(t, errs, nil) + + s = "false" + errs = validate.Var(s, "boolean") + Equal(t, errs, nil) + + s = "0" + errs = validate.Var(s, "boolean") + Equal(t, errs, nil) + + s = "1" + errs = validate.Var(s, "boolean") + Equal(t, errs, nil) + + s = "xyz" + errs = validate.Var(s, "boolean") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "boolean") + + s = "1." + errs = validate.Var(s, "boolean") + NotEqual(t, errs, nil) + AssertError(t, errs, "", "", "", "", "boolean") +} func TestAlphaNumeric(t *testing.T) { validate := New() @@ -12264,25 +12301,25 @@ func TestCreditCardFormatValidation(t *testing.T) { } func TestMultiOrOperatorGroup(t *testing.T) { - tests := []struct { - Value int `validate:"eq=1|gte=5,eq=1|lt=7"` - expected bool - }{ - {1, true}, {2, false}, {5, true}, {6, true}, {8, false}, - } - - validate := New() - - for i, test := range tests { - errs := validate.Struct(test) - if test.expected { - if !IsEqual(errs, nil) { - t.Fatalf("Index: %d multi_group_of_OR_operators failed Error: %s", i, errs) - } - } else { - if IsEqual(errs, nil) { - t.Fatalf("Index: %d multi_group_of_OR_operators should have errs", i) - } - } - } - } + tests := []struct { + Value int `validate:"eq=1|gte=5,eq=1|lt=7"` + expected bool + }{ + {1, true}, {2, false}, {5, true}, {6, true}, {8, false}, + } + + validate := New() + + for i, test := range tests { + errs := validate.Struct(test) + if test.expected { + if !IsEqual(errs, nil) { + t.Fatalf("Index: %d multi_group_of_OR_operators failed Error: %s", i, errs) + } + } else { + if IsEqual(errs, nil) { + t.Fatalf("Index: %d multi_group_of_OR_operators should have errs", i) + } + } + } +}