123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809 |
- package validator_test
- import (
- "fmt"
- "reflect"
- "testing"
- "time"
- "gopkg.in/bluesuncorp/go-validate-yourself.v4"
- . "gopkg.in/check.v1"
- )
- type I interface {
- Foo() string
- }
- type Impl struct {
- F string `validate:"len=3"`
- }
- func (i *Impl) Foo() string {
- return i.F
- }
- type SubTest struct {
- Test string `validate:"required"`
- }
- type TestInterface struct {
- Iface I
- }
- type TestString struct {
- BlankTag string `validate:""`
- Required string `validate:"required"`
- Len string `validate:"len=10"`
- Min string `validate:"min=1"`
- Max string `validate:"max=10"`
- MinMax string `validate:"min=1,max=10"`
- Lt string `validate:"lt=10"`
- Lte string `validate:"lte=10"`
- Gt string `validate:"gt=10"`
- Gte string `validate:"gte=10"`
- OmitEmpty string `validate:"omitempty,min=1,max=10"`
- Sub *SubTest
- SubIgnore *SubTest `validate:"-"`
- Anonymous struct {
- A string `validate:"required"`
- }
- Iface I
- }
- type TestInt32 struct {
- Required int `validate:"required"`
- Len int `validate:"len=10"`
- Min int `validate:"min=1"`
- Max int `validate:"max=10"`
- MinMax int `validate:"min=1,max=10"`
- Lt int `validate:"lt=10"`
- Lte int `validate:"lte=10"`
- Gt int `validate:"gt=10"`
- Gte int `validate:"gte=10"`
- OmitEmpty int `validate:"omitempty,min=1,max=10"`
- }
- type TestUint64 struct {
- Required uint64 `validate:"required"`
- Len uint64 `validate:"len=10"`
- Min uint64 `validate:"min=1"`
- Max uint64 `validate:"max=10"`
- MinMax uint64 `validate:"min=1,max=10"`
- OmitEmpty uint64 `validate:"omitempty,min=1,max=10"`
- }
- type TestFloat64 struct {
- Required float64 `validate:"required"`
- Len float64 `validate:"len=10"`
- Min float64 `validate:"min=1"`
- Max float64 `validate:"max=10"`
- MinMax float64 `validate:"min=1,max=10"`
- Lte float64 `validate:"lte=10"`
- OmitEmpty float64 `validate:"omitempty,min=1,max=10"`
- }
- type TestSlice struct {
- Required []int `validate:"required"`
- Len []int `validate:"len=10"`
- Min []int `validate:"min=1"`
- Max []int `validate:"max=10"`
- MinMax []int `validate:"min=1,max=10"`
- OmitEmpty []int `validate:"omitempty,min=1,max=10"`
- }
- func Test(t *testing.T) { TestingT(t) }
- type MySuite struct{}
- var _ = Suite(&MySuite{})
- var myValidator = validator.NewValidator("validate", validator.BakedInValidators)
- func AssetStruct(s *validator.StructValidationErrors, structFieldName string, expectedStructName string, c *C) *validator.StructValidationErrors {
- val, ok := s.StructErrors[structFieldName]
- c.Assert(ok, Equals, true)
- c.Assert(val, NotNil)
- c.Assert(val.Struct, Equals, expectedStructName)
- return val
- }
- func AssertFieldError(s *validator.StructValidationErrors, field string, expectedTag string, c *C) {
- val, ok := s.Errors[field]
- c.Assert(ok, Equals, true)
- c.Assert(val, NotNil)
- c.Assert(val.Field, Equals, field)
- c.Assert(val.ErrorTag, Equals, expectedTag)
- }
- func AssertMapFieldError(s map[string]*validator.FieldValidationError, field string, expectedTag string, c *C) {
- val, ok := s[field]
- c.Assert(ok, Equals, true)
- c.Assert(val, NotNil)
- c.Assert(val.Field, Equals, field)
- c.Assert(val.ErrorTag, Equals, expectedTag)
- }
- func newValidatorFunc(val interface{}, current interface{}, field interface{}, param string) bool {
- return true
- }
- func isEqualFunc(val interface{}, current interface{}, field interface{}, param string) bool {
- return current.(string) == field.(string)
- }
- func (ms *MySuite) TestStructOnlyValidation(c *C) {
- type Inner struct {
- Test string `validate:"len=5"`
- }
- type Outer struct {
- InnerStruct *Inner `validate:"required,structonly"`
- }
- outer := &Outer{
- InnerStruct: nil,
- }
- errs := myValidator.ValidateStruct(outer).Flatten()
- c.Assert(errs, NotNil)
- inner := &Inner{
- Test: "1234",
- }
- outer = &Outer{
- InnerStruct: inner,
- }
- errs = myValidator.ValidateStruct(outer).Flatten()
- c.Assert(errs, IsNil)
- }
- func (ms *MySuite) TestGtField(c *C) {
- type TimeTest struct {
- Start *time.Time `validate:"required,gt"`
- End *time.Time `validate:"required,gt,gtfield=Start"`
- }
- now := time.Now()
- start := now.Add(time.Hour * 24)
- end := start.Add(time.Hour * 24)
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "End", "gtfield", c)
- err3 := myValidator.ValidateFieldByTagAndValue(&start, &end, "gtfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(&end, &start, "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,gtfield=Val1"`
- }
- intTest := &IntTest{
- Val1: 1,
- Val2: 5,
- }
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
- intTest = &IntTest{
- Val1: 5,
- Val2: 1,
- }
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtfield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "gtfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,gtfield=Val1"`
- }
- uIntTest := &UIntTest{
- Val1: 1,
- Val2: 5,
- }
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
- uIntTest = &UIntTest{
- Val1: 5,
- Val2: 1,
- }
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtfield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "gtfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,gtfield=Val1"`
- }
- floatTest := &FloatTest{
- Val1: 1,
- Val2: 5,
- }
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
- floatTest = &FloatTest{
- Val1: 5,
- Val2: 1,
- }
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtfield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "gtfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "gtfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtfield")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 1, "gtfield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, "T", "gtfield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, start, "gtfield") }, PanicMatches, "Bad Top Level field type")
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,gtfield=NonExistantField"`
- }
- timeTest2 := &TimeTest2{
- Start: &start,
- End: &end,
- }
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
- }
- func (ms *MySuite) TestLtField(c *C) {
- type TimeTest struct {
- Start *time.Time `validate:"required,lt,ltfield=End"`
- End *time.Time `validate:"required,lt"`
- }
- now := time.Now()
- start := now.Add(time.Hour * 24 * -1 * 2)
- end := start.Add(time.Hour * 24)
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Start", "ltfield", c)
- err3 := myValidator.ValidateFieldByTagAndValue(&end, &start, "ltfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(&start, &end, "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,ltfield=Val1"`
- }
- intTest := &IntTest{
- Val1: 5,
- Val2: 1,
- }
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
- intTest = &IntTest{
- Val1: 1,
- Val2: 5,
- }
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltfield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "ltfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,ltfield=Val1"`
- }
- uIntTest := &UIntTest{
- Val1: 5,
- Val2: 1,
- }
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
- uIntTest = &UIntTest{
- Val1: 1,
- Val2: 5,
- }
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltfield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "ltfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,ltfield=Val1"`
- }
- floatTest := &FloatTest{
- Val1: 5,
- Val2: 1,
- }
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
- floatTest = &FloatTest{
- Val1: 1,
- Val2: 5,
- }
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltfield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "ltfield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "ltfield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltfield")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 5, "ltfield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, "T", "ltfield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, end, "ltfield") }, PanicMatches, "Bad Top Level field type")
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,ltfield=NonExistantField"`
- }
- timeTest2 := &TimeTest2{
- Start: &end,
- End: &start,
- }
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
- }
- func (ms *MySuite) TestLteField(c *C) {
- type TimeTest struct {
- Start *time.Time `validate:"required,lte,ltefield=End"`
- End *time.Time `validate:"required,lte"`
- }
- now := time.Now()
- start := now.Add(time.Hour * 24 * -1 * 2)
- end := start.Add(time.Hour * 24)
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Start", "ltefield", c)
- err3 := myValidator.ValidateFieldByTagAndValue(&end, &start, "ltefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(&start, &end, "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,ltefield=Val1"`
- }
- intTest := &IntTest{
- Val1: 5,
- Val2: 1,
- }
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
- intTest = &IntTest{
- Val1: 1,
- Val2: 5,
- }
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltefield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "ltefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,ltefield=Val1"`
- }
- uIntTest := &UIntTest{
- Val1: 5,
- Val2: 1,
- }
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
- uIntTest = &UIntTest{
- Val1: 1,
- Val2: 5,
- }
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltefield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "ltefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,ltefield=Val1"`
- }
- floatTest := &FloatTest{
- Val1: 5,
- Val2: 1,
- }
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
- floatTest = &FloatTest{
- Val1: 1,
- Val2: 5,
- }
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "ltefield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "ltefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "ltefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "ltefield")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 5, "ltefield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, "T", "ltefield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, end, "ltefield") }, PanicMatches, "Bad Top Level field type")
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,ltefield=NonExistantField"`
- }
- timeTest2 := &TimeTest2{
- Start: &end,
- End: &start,
- }
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
- }
- func (ms *MySuite) TestGteField(c *C) {
- type TimeTest struct {
- Start *time.Time `validate:"required,gte"`
- End *time.Time `validate:"required,gte,gtefield=Start"`
- }
- now := time.Now()
- start := now.Add(time.Hour * 24)
- end := start.Add(time.Hour * 24)
- timeTest := &TimeTest{
- Start: &start,
- End: &end,
- }
- errs := myValidator.ValidateStruct(timeTest)
- c.Assert(errs, IsNil)
- timeTest = &TimeTest{
- Start: &end,
- End: &start,
- }
- errs2 := myValidator.ValidateStruct(timeTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "End", "gtefield", c)
- err3 := myValidator.ValidateFieldByTagAndValue(&start, &end, "gtefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(&end, &start, "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
- type IntTest struct {
- Val1 int `validate:"required"`
- Val2 int `validate:"required,gtefield=Val1"`
- }
- intTest := &IntTest{
- Val1: 1,
- Val2: 5,
- }
- errs = myValidator.ValidateStruct(intTest)
- c.Assert(errs, IsNil)
- intTest = &IntTest{
- Val1: 5,
- Val2: 1,
- }
- errs2 = myValidator.ValidateStruct(intTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtefield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "gtefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
- type UIntTest struct {
- Val1 uint `validate:"required"`
- Val2 uint `validate:"required,gtefield=Val1"`
- }
- uIntTest := &UIntTest{
- Val1: 1,
- Val2: 5,
- }
- errs = myValidator.ValidateStruct(uIntTest)
- c.Assert(errs, IsNil)
- uIntTest = &UIntTest{
- Val1: 5,
- Val2: 1,
- }
- errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtefield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "gtefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
- type FloatTest struct {
- Val1 float64 `validate:"required"`
- Val2 float64 `validate:"required,gtefield=Val1"`
- }
- floatTest := &FloatTest{
- Val1: 1,
- Val2: 5,
- }
- errs = myValidator.ValidateStruct(floatTest)
- c.Assert(errs, IsNil)
- floatTest = &FloatTest{
- Val1: 5,
- Val2: 1,
- }
- errs2 = myValidator.ValidateStruct(floatTest).Flatten()
- c.Assert(errs2, NotNil)
- AssertMapFieldError(errs2, "Val2", "gtefield", c)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "gtefield")
- c.Assert(err3, IsNil)
- err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "gtefield")
- c.Assert(err3, NotNil)
- c.Assert(err3.ErrorTag, Equals, "gtefield")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 1, "gtefield") }, PanicMatches, "struct not passed for cross validation")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, "T", "gtefield") }, PanicMatches, "Bad field type string")
- c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, start, "gtefield") }, PanicMatches, "Bad Top Level field type")
- type TimeTest2 struct {
- Start *time.Time `validate:"required"`
- End *time.Time `validate:"required,gtefield=NonExistantField"`
- }
- timeTest2 := &TimeTest2{
- Start: &start,
- End: &end,
- }
- c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
- }
- func (ms *MySuite) TestValidateByTagAndValue(c *C) {
- val := "test"
- field := "test"
- err := myValidator.ValidateFieldByTagAndValue(val, field, "required")
- c.Assert(err, IsNil)
- myValidator.AddFunction("isequaltestfunc", isEqualFunc)
- err = myValidator.ValidateFieldByTagAndValue(val, field, "isequaltestfunc")
- c.Assert(err, IsNil)
- val = "unequal"
- err = myValidator.ValidateFieldByTagAndValue(val, field, "isequaltestfunc")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "isequaltestfunc")
- }
- func (ms *MySuite) TestAddFunctions(c *C) {
- validate := validator.NewValidator("validateme", validator.BakedInValidators)
- err := validate.AddFunction("new", newValidatorFunc)
- c.Assert(err, IsNil)
- err = validate.AddFunction("", newValidatorFunc)
- c.Assert(err, NotNil)
- validate.AddFunction("new", nil)
- c.Assert(err, NotNil)
- err = validate.AddFunction("new", newValidatorFunc)
- c.Assert(err, IsNil)
- }
- func (ms *MySuite) TestChangeTag(c *C) {
- validate := validator.NewValidator("validateme", validator.BakedInValidators)
- validate.SetTag("val")
- type Test struct {
- Name string `val:"len=4"`
- }
- s := &Test{
- Name: "TEST",
- }
- err := validate.ValidateStruct(s)
- c.Assert(err, IsNil)
- // validator.SetTag("v")
- // validator.SetTag("validate")
- }
- func (ms *MySuite) TestUnexposedStruct(c *C) {
- type Test struct {
- Name string
- unexposed struct {
- A string `validate:"required"`
- }
- }
- s := &Test{
- Name: "TEST",
- }
- err := myValidator.ValidateStruct(s)
- c.Assert(err, IsNil)
- }
- func (ms *MySuite) TestBadParams(c *C) {
- i := 1
- err := myValidator.ValidateFieldByTag(i, "-")
- c.Assert(err, IsNil)
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "len=a") }, PanicMatches, "strconv.ParseInt: parsing \"a\": invalid syntax")
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "len=a") }, PanicMatches, "strconv.ParseInt: parsing \"a\": invalid syntax")
- var ui uint = 1
- c.Assert(func() { myValidator.ValidateFieldByTag(ui, "len=a") }, PanicMatches, "strconv.ParseUint: parsing \"a\": invalid syntax")
- f := 1.23
- c.Assert(func() { myValidator.ValidateFieldByTag(f, "len=a") }, PanicMatches, "strconv.ParseFloat: parsing \"a\": invalid syntax")
- }
- func (ms *MySuite) TestLength(c *C) {
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "len") }, PanicMatches, "Bad field type bool")
- }
- func (ms *MySuite) TestIsGt(c *C) {
- myMap := map[string]string{}
- err := myValidator.ValidateFieldByTag(myMap, "gt=0")
- c.Assert(err, NotNil)
- f := 1.23
- err = myValidator.ValidateFieldByTag(f, "gt=5")
- c.Assert(err, NotNil)
- var ui uint = 5
- err = myValidator.ValidateFieldByTag(ui, "gt=10")
- c.Assert(err, NotNil)
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "gt") }, PanicMatches, "Bad field type bool")
- t := time.Now().UTC()
- t = t.Add(time.Hour * 24)
- err = myValidator.ValidateFieldByTag(t, "gt")
- c.Assert(err, IsNil)
- t2 := time.Now().UTC()
- err = myValidator.ValidateFieldByTag(t2, "gt")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "gt")
- type Test struct {
- Now *time.Time `validate:"gt"`
- }
- s := &Test{
- Now: &t,
- }
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
- s = &Test{
- Now: &t2,
- }
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
- }
- func (ms *MySuite) TestIsGte(c *C) {
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "gte") }, PanicMatches, "Bad field type bool")
- t := time.Now().UTC()
- t = t.Add(time.Hour * 24)
- err := myValidator.ValidateFieldByTag(t, "gte")
- c.Assert(err, IsNil)
- t2 := time.Now().UTC()
- err = myValidator.ValidateFieldByTag(t2, "gte")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "gte")
- c.Assert(err.Type, Equals, reflect.TypeOf(time.Time{}))
- type Test struct {
- Now *time.Time `validate:"gte"`
- }
- s := &Test{
- Now: &t,
- }
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
- s = &Test{
- Now: &t2,
- }
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
- }
- func (ms *MySuite) TestIsLt(c *C) {
- myMap := map[string]string{}
- err := myValidator.ValidateFieldByTag(myMap, "lt=0")
- c.Assert(err, NotNil)
- f := 1.23
- err = myValidator.ValidateFieldByTag(f, "lt=0")
- c.Assert(err, NotNil)
- var ui uint = 5
- err = myValidator.ValidateFieldByTag(ui, "lt=0")
- c.Assert(err, NotNil)
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "lt") }, PanicMatches, "Bad field type bool")
- t := time.Now().UTC()
- err = myValidator.ValidateFieldByTag(t, "lt")
- c.Assert(err, IsNil)
- t2 := time.Now().UTC()
- t2 = t2.Add(time.Hour * 24)
- err = myValidator.ValidateFieldByTag(t2, "lt")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "lt")
- type Test struct {
- Now *time.Time `validate:"lt"`
- }
- s := &Test{
- Now: &t,
- }
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
- s = &Test{
- Now: &t2,
- }
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
- }
- func (ms *MySuite) TestIsLte(c *C) {
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "lte") }, PanicMatches, "Bad field type bool")
- t := time.Now().UTC()
- err := myValidator.ValidateFieldByTag(t, "lte")
- c.Assert(err, IsNil)
- t2 := time.Now().UTC()
- t2 = t2.Add(time.Hour * 24)
- err = myValidator.ValidateFieldByTag(t2, "lte")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "lte")
- type Test struct {
- Now *time.Time `validate:"lte"`
- }
- s := &Test{
- Now: &t,
- }
- errs := myValidator.ValidateStruct(s)
- c.Assert(errs, IsNil)
- s = &Test{
- Now: &t2,
- }
- errs = myValidator.ValidateStruct(s)
- c.Assert(errs, NotNil)
- }
- func (ms *MySuite) TestUrl(c *C) {
- var tests = []struct {
- param string
- expected bool
- }{
- {"http://foo.bar#com", true},
- {"http://foobar.com", true},
- {"https://foobar.com", true},
- {"foobar.com", false},
- {"http://foobar.coffee/", true},
- {"http://foobar.中文网/", true},
- {"http://foobar.org/", true},
- {"http://foobar.org:8080/", true},
- {"ftp://foobar.ru/", true},
- {"http://user:pass@www.foobar.com/", true},
- {"http://127.0.0.1/", true},
- {"http://duckduckgo.com/?q=%2F", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com/?foo=bar#baz=qux", true},
- {"http://foobar.com?foo=bar", true},
- {"http://www.xn--froschgrn-x9a.net/", true},
- {"", false},
- {"xyz://foobar.com", true},
- {"invalid.", false},
- {".com", false},
- {"rtmp://foobar.com", true},
- {"http://www.foo_bar.com/", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com#baz=qux", true},
- {"http://foobar.com/t$-_.+!*\\'(),", true},
- {"http://www.foobar.com/~foobar", true},
- {"http://www.-foobar.com/", true},
- {"http://www.foo---bar.com/", true},
- {"mailto:someone@example.com", true},
- {"irc://irc.server.org/channel", true},
- {"irc://#channel@network", true},
- {"/abs/test/dir", false},
- {"./rel/test/dir", false},
- }
- for _, test := range tests {
- err := myValidator.ValidateFieldByTag(test.param, "url")
- if test.expected == true {
- c.Assert(err, IsNil)
- } else {
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "url")
- }
- }
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "url") }, PanicMatches, "Bad field type int")
- }
- func (ms *MySuite) TestUri(c *C) {
- var tests = []struct {
- param string
- expected bool
- }{
- {"http://foo.bar#com", true},
- {"http://foobar.com", true},
- {"https://foobar.com", true},
- {"foobar.com", false},
- {"http://foobar.coffee/", true},
- {"http://foobar.中文网/", true},
- {"http://foobar.org/", true},
- {"http://foobar.org:8080/", true},
- {"ftp://foobar.ru/", true},
- {"http://user:pass@www.foobar.com/", true},
- {"http://127.0.0.1/", true},
- {"http://duckduckgo.com/?q=%2F", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com/?foo=bar#baz=qux", true},
- {"http://foobar.com?foo=bar", true},
- {"http://www.xn--froschgrn-x9a.net/", true},
- {"", false},
- {"xyz://foobar.com", true},
- {"invalid.", false},
- {".com", false},
- {"rtmp://foobar.com", true},
- {"http://www.foo_bar.com/", true},
- {"http://localhost:3000/", true},
- {"http://foobar.com#baz=qux", true},
- {"http://foobar.com/t$-_.+!*\\'(),", true},
- {"http://www.foobar.com/~foobar", true},
- {"http://www.-foobar.com/", true},
- {"http://www.foo---bar.com/", true},
- {"mailto:someone@example.com", true},
- {"irc://irc.server.org/channel", true},
- {"irc://#channel@network", true},
- {"/abs/test/dir", true},
- {"./rel/test/dir", false},
- }
- for _, test := range tests {
- err := myValidator.ValidateFieldByTag(test.param, "uri")
- if test.expected == true {
- c.Assert(err, IsNil)
- } else {
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "uri")
- }
- }
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "uri") }, PanicMatches, "Bad field type int")
- }
- func (ms *MySuite) TestOrTag(c *C) {
- s := "rgba(0,31,255,0.5)"
- err := myValidator.ValidateFieldByTag(s, "rgb|rgba")
- c.Assert(err, IsNil)
- s = "rgba(0,31,255,0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=18")
- c.Assert(err, IsNil)
- s = "this ain't right"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb|rgba")
- s = "this ain't right"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=10")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb|rgba|len")
- s = "this is right"
- err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=13")
- c.Assert(err, IsNil)
- s = ""
- err = myValidator.ValidateFieldByTag(s, "omitempty,rgb|rgba")
- c.Assert(err, IsNil)
- }
- func (ms *MySuite) TestHsla(c *C) {
- s := "hsla(360,100%,100%,1)"
- err := myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, IsNil)
- s = "hsla(360,100%,100%,0.5)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, IsNil)
- s = "hsla(0,0%,0%, 0)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, IsNil)
- s = "hsl(361,100%,50%,1)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
- s = "hsl(361,100%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
- s = "hsla(361,100%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
- s = "hsla(360,101%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
- s = "hsla(360,100%,101%)"
- err = myValidator.ValidateFieldByTag(s, "hsla")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsla")
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hsla") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestHsl(c *C) {
- s := "hsl(360,100%,50%)"
- err := myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, IsNil)
- s = "hsl(0,0%,0%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, IsNil)
- s = "hsl(361,100%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
- s = "hsl(361,101%,50%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
- s = "hsl(361,100%,101%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
- s = "hsl(-10,100%,100%)"
- err = myValidator.ValidateFieldByTag(s, "hsl")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hsl")
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hsl") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestRgba(c *C) {
- s := "rgba(0,31,255,0.5)"
- err := myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, IsNil)
- s = "rgba(0,31,255,0.12)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, IsNil)
- s = "rgba( 0, 31, 255, 0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, IsNil)
- s = "rgb(0, 31, 255)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgba")
- s = "rgb(1,349,275,0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgba")
- s = "rgb(01,31,255,0.5)"
- err = myValidator.ValidateFieldByTag(s, "rgba")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgba")
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "rgba") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestRgb(c *C) {
- s := "rgb(0,31,255)"
- err := myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, IsNil)
- s = "rgb(0, 31, 255)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, IsNil)
- s = "rgb(1,349,275)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb")
- s = "rgb(01,31,255)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb")
- s = "rgba(0,31,255)"
- err = myValidator.ValidateFieldByTag(s, "rgb")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "rgb")
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "rgb") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestEmail(c *C) {
- s := "test@mail.com"
- err := myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, IsNil)
- s = ""
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
- s = "test@email"
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
- s = "test@email."
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
- s = "@email.com"
- err = myValidator.ValidateFieldByTag(s, "email")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "email")
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "email") }, PanicMatches, "interface conversion: interface is bool, not string")
- }
- func (ms *MySuite) TestHexColor(c *C) {
- s := "#fff"
- err := myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, IsNil)
- s = "#c2c2c2"
- err = myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, IsNil)
- s = "fff"
- err = myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hexcolor")
- s = "fffFF"
- err = myValidator.ValidateFieldByTag(s, "hexcolor")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hexcolor")
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hexcolor") }, PanicMatches, "interface conversion: interface is bool, not string")
- }
- func (ms *MySuite) TestHexadecimal(c *C) {
- s := "ff0044"
- err := myValidator.ValidateFieldByTag(s, "hexadecimal")
- c.Assert(err, IsNil)
- s = "abcdefg"
- err = myValidator.ValidateFieldByTag(s, "hexadecimal")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "hexadecimal")
- i := true
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "hexadecimal") }, PanicMatches, "interface conversion: interface is bool, not string")
- }
- func (ms *MySuite) TestNumber(c *C) {
- s := "1"
- err := myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, IsNil)
- s = "+1"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- s = "-1"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- s = "1.12"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- s = "+1.12"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- s = "-1.12"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- s = "1."
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- s = "1.o"
- err = myValidator.ValidateFieldByTag(s, "number")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "number")
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "number") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestNumeric(c *C) {
- s := "1"
- err := myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
- s = "+1"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
- s = "-1"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
- s = "1.12"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
- s = "+1.12"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
- s = "-1.12"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, IsNil)
- s = "1."
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "numeric")
- s = "1.o"
- err = myValidator.ValidateFieldByTag(s, "numeric")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "numeric")
- i := 1
- c.Assert(func() { myValidator.ValidateFieldByTag(i, "numeric") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestAlphaNumeric(c *C) {
- s := "abcd123"
- err := myValidator.ValidateFieldByTag(s, "alphanum")
- c.Assert(err, IsNil)
- s = "abc!23"
- err = myValidator.ValidateFieldByTag(s, "alphanum")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "alphanum")
- c.Assert(func() { myValidator.ValidateFieldByTag(1, "alphanum") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestAlpha(c *C) {
- s := "abcd"
- err := myValidator.ValidateFieldByTag(s, "alpha")
- c.Assert(err, IsNil)
- s = "abc1"
- err = myValidator.ValidateFieldByTag(s, "alpha")
- c.Assert(err, NotNil)
- c.Assert(err.ErrorTag, Equals, "alpha")
- c.Assert(func() { myValidator.ValidateFieldByTag(1, "alpha") }, PanicMatches, "interface conversion: interface is int, not string")
- }
- func (ms *MySuite) TestFlattening(c *C) {
- tSuccess := &TestString{
- Required: "Required",
- Len: "length==10",
- Min: "min=1",
- Max: "1234567890",
- MinMax: "12345",
- Lt: "012345678",
- Lte: "0123456789",
- Gt: "01234567890",
- Gte: "0123456789",
- OmitEmpty: "",
- Sub: &SubTest{
- Test: "1",
- },
- SubIgnore: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "1",
- },
- Iface: &Impl{
- F: "123",
- },
- }
- err1 := myValidator.ValidateStruct(tSuccess).Flatten()
- c.Assert(err1, IsNil)
- tFail := &TestString{
- Required: "",
- Len: "",
- Min: "",
- Max: "12345678901",
- MinMax: "",
- OmitEmpty: "12345678901",
- Sub: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "",
- },
- Iface: &Impl{
- F: "12",
- },
- }
- err2 := myValidator.ValidateStruct(tFail).Flatten()
- // Assert Top Level
- c.Assert(err2, NotNil)
- // Assert Fields
- AssertMapFieldError(err2, "Len", "len", c)
- AssertMapFieldError(err2, "Gt", "gt", c)
- AssertMapFieldError(err2, "Gte", "gte", c)
- // Assert Struct Field
- AssertMapFieldError(err2, "Sub.Test", "required", c)
- // Assert Anonymous Struct Field
- AssertMapFieldError(err2, "Anonymous.A", "required", c)
- // Assert Interface Field
- AssertMapFieldError(err2, "Iface.F", "len", c)
- }
- func (ms *MySuite) TestStructStringValidation(c *C) {
- tSuccess := &TestString{
- Required: "Required",
- Len: "length==10",
- Min: "min=1",
- Max: "1234567890",
- MinMax: "12345",
- Lt: "012345678",
- Lte: "0123456789",
- Gt: "01234567890",
- Gte: "0123456789",
- OmitEmpty: "",
- Sub: &SubTest{
- Test: "1",
- },
- SubIgnore: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "1",
- },
- Iface: &Impl{
- F: "123",
- },
- }
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
- tFail := &TestString{
- Required: "",
- Len: "",
- Min: "",
- Max: "12345678901",
- MinMax: "",
- Lt: "0123456789",
- Lte: "01234567890",
- Gt: "1",
- Gte: "1",
- OmitEmpty: "12345678901",
- Sub: &SubTest{
- Test: "",
- },
- Anonymous: struct {
- A string `validate:"required"`
- }{
- A: "",
- },
- Iface: &Impl{
- F: "12",
- },
- }
- err = myValidator.ValidateStruct(tFail)
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestString")
- c.Assert(len(err.Errors), Equals, 10)
- c.Assert(len(err.StructErrors), Equals, 3)
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "Gt", "gt", c)
- AssertFieldError(err, "Gte", "gte", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
- // Assert Anonymous embedded struct
- AssetStruct(err, "Anonymous", "", c)
- // Assert SubTest embedded struct
- val := AssetStruct(err, "Sub", "SubTest", c)
- c.Assert(len(val.Errors), Equals, 1)
- c.Assert(len(val.StructErrors), Equals, 0)
- AssertFieldError(val, "Test", "required", c)
- errors := err.Error()
- c.Assert(errors, NotNil)
- }
- func (ms *MySuite) TestStructInt32Validation(c *C) {
- tSuccess := &TestInt32{
- Required: 1,
- Len: 10,
- Min: 1,
- Max: 10,
- MinMax: 5,
- Lt: 9,
- Lte: 10,
- Gt: 11,
- Gte: 10,
- OmitEmpty: 0,
- }
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
- tFail := &TestInt32{
- Required: 0,
- Len: 11,
- Min: -1,
- Max: 11,
- MinMax: -1,
- Lt: 10,
- Lte: 11,
- Gt: 10,
- Gte: 9,
- OmitEmpty: 11,
- }
- err = myValidator.ValidateStruct(tFail)
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestInt32")
- c.Assert(len(err.Errors), Equals, 10)
- c.Assert(len(err.StructErrors), Equals, 0)
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "Lt", "lt", c)
- AssertFieldError(err, "Lte", "lte", c)
- AssertFieldError(err, "Gt", "gt", c)
- AssertFieldError(err, "Gte", "gte", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
- }
- func (ms *MySuite) TestStructUint64Validation(c *C) {
- tSuccess := &TestUint64{
- Required: 1,
- Len: 10,
- Min: 1,
- Max: 10,
- MinMax: 5,
- OmitEmpty: 0,
- }
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
- tFail := &TestUint64{
- Required: 0,
- Len: 11,
- Min: 0,
- Max: 11,
- MinMax: 0,
- OmitEmpty: 11,
- }
- err = myValidator.ValidateStruct(tFail)
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestUint64")
- c.Assert(len(err.Errors), Equals, 6)
- c.Assert(len(err.StructErrors), Equals, 0)
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
- }
- func (ms *MySuite) TestStructFloat64Validation(c *C) {
- tSuccess := &TestFloat64{
- Required: 1,
- Len: 10,
- Min: 1,
- Max: 10,
- MinMax: 5,
- OmitEmpty: 0,
- }
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
- tFail := &TestFloat64{
- Required: 0,
- Len: 11,
- Min: 0,
- Max: 11,
- MinMax: 0,
- OmitEmpty: 11,
- }
- err = myValidator.ValidateStruct(tFail)
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestFloat64")
- c.Assert(len(err.Errors), Equals, 6)
- c.Assert(len(err.StructErrors), Equals, 0)
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
- }
- func (ms *MySuite) TestStructSliceValidation(c *C) {
- tSuccess := &TestSlice{
- Required: []int{1},
- Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
- Min: []int{1, 2},
- Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
- MinMax: []int{1, 2, 3, 4, 5},
- OmitEmpty: []int{},
- }
- err := myValidator.ValidateStruct(tSuccess)
- c.Assert(err, IsNil)
- tFail := &TestSlice{
- Required: []int{},
- Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
- Min: []int{},
- Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
- MinMax: []int{},
- OmitEmpty: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
- }
- err = myValidator.ValidateStruct(tFail)
- // Assert Top Level
- c.Assert(err, NotNil)
- c.Assert(err.Struct, Equals, "TestSlice")
- c.Assert(len(err.Errors), Equals, 6)
- c.Assert(len(err.StructErrors), Equals, 0)
- // Assert Fields
- AssertFieldError(err, "Required", "required", c)
- AssertFieldError(err, "Len", "len", c)
- AssertFieldError(err, "Min", "min", c)
- AssertFieldError(err, "Max", "max", c)
- AssertFieldError(err, "MinMax", "min", c)
- AssertFieldError(err, "OmitEmpty", "max", c)
- }
- func (ms *MySuite) TestInvalidStruct(c *C) {
- s := &SubTest{
- Test: "1",
- }
- c.Assert(func() { myValidator.ValidateStruct(s.Test) }, PanicMatches, "interface passed for validation is not a struct")
- }
- func (ms *MySuite) TestInvalidField(c *C) {
- s := &SubTest{
- Test: "1",
- }
- c.Assert(func() { myValidator.ValidateFieldByTag(s, "required") }, PanicMatches, "Invalid field passed to ValidateFieldWithTag")
- }
- func (ms *MySuite) TestInvalidTagField(c *C) {
- s := &SubTest{
- Test: "1",
- }
- c.Assert(func() { myValidator.ValidateFieldByTag(s.Test, "") }, PanicMatches, fmt.Sprintf("Invalid validation tag on field %s", ""))
- }
- func (ms *MySuite) TestInvalidValidatorFunction(c *C) {
- s := &SubTest{
- Test: "1",
- }
- c.Assert(func() { myValidator.ValidateFieldByTag(s.Test, "zzxxBadFunction") }, PanicMatches, fmt.Sprintf("Undefined validation function on field %s", ""))
- }
|