validator_test.go 43 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809
  1. package validator_test
  2. import (
  3. "fmt"
  4. "reflect"
  5. "testing"
  6. "time"
  7. "gopkg.in/bluesuncorp/go-validate-yourself.v4"
  8. . "gopkg.in/check.v1"
  9. )
  10. type I interface {
  11. Foo() string
  12. }
  13. type Impl struct {
  14. F string `validate:"len=3"`
  15. }
  16. func (i *Impl) Foo() string {
  17. return i.F
  18. }
  19. type SubTest struct {
  20. Test string `validate:"required"`
  21. }
  22. type TestInterface struct {
  23. Iface I
  24. }
  25. type TestString struct {
  26. BlankTag string `validate:""`
  27. Required string `validate:"required"`
  28. Len string `validate:"len=10"`
  29. Min string `validate:"min=1"`
  30. Max string `validate:"max=10"`
  31. MinMax string `validate:"min=1,max=10"`
  32. Lt string `validate:"lt=10"`
  33. Lte string `validate:"lte=10"`
  34. Gt string `validate:"gt=10"`
  35. Gte string `validate:"gte=10"`
  36. OmitEmpty string `validate:"omitempty,min=1,max=10"`
  37. Sub *SubTest
  38. SubIgnore *SubTest `validate:"-"`
  39. Anonymous struct {
  40. A string `validate:"required"`
  41. }
  42. Iface I
  43. }
  44. type TestInt32 struct {
  45. Required int `validate:"required"`
  46. Len int `validate:"len=10"`
  47. Min int `validate:"min=1"`
  48. Max int `validate:"max=10"`
  49. MinMax int `validate:"min=1,max=10"`
  50. Lt int `validate:"lt=10"`
  51. Lte int `validate:"lte=10"`
  52. Gt int `validate:"gt=10"`
  53. Gte int `validate:"gte=10"`
  54. OmitEmpty int `validate:"omitempty,min=1,max=10"`
  55. }
  56. type TestUint64 struct {
  57. Required uint64 `validate:"required"`
  58. Len uint64 `validate:"len=10"`
  59. Min uint64 `validate:"min=1"`
  60. Max uint64 `validate:"max=10"`
  61. MinMax uint64 `validate:"min=1,max=10"`
  62. OmitEmpty uint64 `validate:"omitempty,min=1,max=10"`
  63. }
  64. type TestFloat64 struct {
  65. Required float64 `validate:"required"`
  66. Len float64 `validate:"len=10"`
  67. Min float64 `validate:"min=1"`
  68. Max float64 `validate:"max=10"`
  69. MinMax float64 `validate:"min=1,max=10"`
  70. Lte float64 `validate:"lte=10"`
  71. OmitEmpty float64 `validate:"omitempty,min=1,max=10"`
  72. }
  73. type TestSlice struct {
  74. Required []int `validate:"required"`
  75. Len []int `validate:"len=10"`
  76. Min []int `validate:"min=1"`
  77. Max []int `validate:"max=10"`
  78. MinMax []int `validate:"min=1,max=10"`
  79. OmitEmpty []int `validate:"omitempty,min=1,max=10"`
  80. }
  81. func Test(t *testing.T) { TestingT(t) }
  82. type MySuite struct{}
  83. var _ = Suite(&MySuite{})
  84. var myValidator = validator.NewValidator("validate", validator.BakedInValidators)
  85. func AssetStruct(s *validator.StructValidationErrors, structFieldName string, expectedStructName string, c *C) *validator.StructValidationErrors {
  86. val, ok := s.StructErrors[structFieldName]
  87. c.Assert(ok, Equals, true)
  88. c.Assert(val, NotNil)
  89. c.Assert(val.Struct, Equals, expectedStructName)
  90. return val
  91. }
  92. func AssertFieldError(s *validator.StructValidationErrors, field string, expectedTag string, c *C) {
  93. val, ok := s.Errors[field]
  94. c.Assert(ok, Equals, true)
  95. c.Assert(val, NotNil)
  96. c.Assert(val.Field, Equals, field)
  97. c.Assert(val.ErrorTag, Equals, expectedTag)
  98. }
  99. func AssertMapFieldError(s map[string]*validator.FieldValidationError, field string, expectedTag string, c *C) {
  100. val, ok := s[field]
  101. c.Assert(ok, Equals, true)
  102. c.Assert(val, NotNil)
  103. c.Assert(val.Field, Equals, field)
  104. c.Assert(val.ErrorTag, Equals, expectedTag)
  105. }
  106. func newValidatorFunc(val interface{}, current interface{}, field interface{}, param string) bool {
  107. return true
  108. }
  109. func isEqualFunc(val interface{}, current interface{}, field interface{}, param string) bool {
  110. return current.(string) == field.(string)
  111. }
  112. func (ms *MySuite) TestStructOnlyValidation(c *C) {
  113. type Inner struct {
  114. Test string `validate:"len=5"`
  115. }
  116. type Outer struct {
  117. InnerStruct *Inner `validate:"required,structonly"`
  118. }
  119. outer := &Outer{
  120. InnerStruct: nil,
  121. }
  122. errs := myValidator.ValidateStruct(outer).Flatten()
  123. c.Assert(errs, NotNil)
  124. inner := &Inner{
  125. Test: "1234",
  126. }
  127. outer = &Outer{
  128. InnerStruct: inner,
  129. }
  130. errs = myValidator.ValidateStruct(outer).Flatten()
  131. c.Assert(errs, IsNil)
  132. }
  133. func (ms *MySuite) TestGtField(c *C) {
  134. type TimeTest struct {
  135. Start *time.Time `validate:"required,gt"`
  136. End *time.Time `validate:"required,gt,gtfield=Start"`
  137. }
  138. now := time.Now()
  139. start := now.Add(time.Hour * 24)
  140. end := start.Add(time.Hour * 24)
  141. timeTest := &TimeTest{
  142. Start: &start,
  143. End: &end,
  144. }
  145. errs := myValidator.ValidateStruct(timeTest)
  146. c.Assert(errs, IsNil)
  147. timeTest = &TimeTest{
  148. Start: &end,
  149. End: &start,
  150. }
  151. errs2 := myValidator.ValidateStruct(timeTest).Flatten()
  152. c.Assert(errs2, NotNil)
  153. AssertMapFieldError(errs2, "End", "gtfield", c)
  154. err3 := myValidator.ValidateFieldByTagAndValue(&start, &end, "gtfield")
  155. c.Assert(err3, IsNil)
  156. err3 = myValidator.ValidateFieldByTagAndValue(&end, &start, "gtfield")
  157. c.Assert(err3, NotNil)
  158. c.Assert(err3.ErrorTag, Equals, "gtfield")
  159. type IntTest struct {
  160. Val1 int `validate:"required"`
  161. Val2 int `validate:"required,gtfield=Val1"`
  162. }
  163. intTest := &IntTest{
  164. Val1: 1,
  165. Val2: 5,
  166. }
  167. errs = myValidator.ValidateStruct(intTest)
  168. c.Assert(errs, IsNil)
  169. intTest = &IntTest{
  170. Val1: 5,
  171. Val2: 1,
  172. }
  173. errs2 = myValidator.ValidateStruct(intTest).Flatten()
  174. c.Assert(errs2, NotNil)
  175. AssertMapFieldError(errs2, "Val2", "gtfield", c)
  176. err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "gtfield")
  177. c.Assert(err3, IsNil)
  178. err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "gtfield")
  179. c.Assert(err3, NotNil)
  180. c.Assert(err3.ErrorTag, Equals, "gtfield")
  181. type UIntTest struct {
  182. Val1 uint `validate:"required"`
  183. Val2 uint `validate:"required,gtfield=Val1"`
  184. }
  185. uIntTest := &UIntTest{
  186. Val1: 1,
  187. Val2: 5,
  188. }
  189. errs = myValidator.ValidateStruct(uIntTest)
  190. c.Assert(errs, IsNil)
  191. uIntTest = &UIntTest{
  192. Val1: 5,
  193. Val2: 1,
  194. }
  195. errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
  196. c.Assert(errs2, NotNil)
  197. AssertMapFieldError(errs2, "Val2", "gtfield", c)
  198. err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "gtfield")
  199. c.Assert(err3, IsNil)
  200. err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "gtfield")
  201. c.Assert(err3, NotNil)
  202. c.Assert(err3.ErrorTag, Equals, "gtfield")
  203. type FloatTest struct {
  204. Val1 float64 `validate:"required"`
  205. Val2 float64 `validate:"required,gtfield=Val1"`
  206. }
  207. floatTest := &FloatTest{
  208. Val1: 1,
  209. Val2: 5,
  210. }
  211. errs = myValidator.ValidateStruct(floatTest)
  212. c.Assert(errs, IsNil)
  213. floatTest = &FloatTest{
  214. Val1: 5,
  215. Val2: 1,
  216. }
  217. errs2 = myValidator.ValidateStruct(floatTest).Flatten()
  218. c.Assert(errs2, NotNil)
  219. AssertMapFieldError(errs2, "Val2", "gtfield", c)
  220. err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "gtfield")
  221. c.Assert(err3, IsNil)
  222. err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "gtfield")
  223. c.Assert(err3, NotNil)
  224. c.Assert(err3.ErrorTag, Equals, "gtfield")
  225. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 1, "gtfield") }, PanicMatches, "struct not passed for cross validation")
  226. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, "T", "gtfield") }, PanicMatches, "Bad field type string")
  227. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, start, "gtfield") }, PanicMatches, "Bad Top Level field type")
  228. type TimeTest2 struct {
  229. Start *time.Time `validate:"required"`
  230. End *time.Time `validate:"required,gtfield=NonExistantField"`
  231. }
  232. timeTest2 := &TimeTest2{
  233. Start: &start,
  234. End: &end,
  235. }
  236. c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
  237. }
  238. func (ms *MySuite) TestLtField(c *C) {
  239. type TimeTest struct {
  240. Start *time.Time `validate:"required,lt,ltfield=End"`
  241. End *time.Time `validate:"required,lt"`
  242. }
  243. now := time.Now()
  244. start := now.Add(time.Hour * 24 * -1 * 2)
  245. end := start.Add(time.Hour * 24)
  246. timeTest := &TimeTest{
  247. Start: &start,
  248. End: &end,
  249. }
  250. errs := myValidator.ValidateStruct(timeTest)
  251. c.Assert(errs, IsNil)
  252. timeTest = &TimeTest{
  253. Start: &end,
  254. End: &start,
  255. }
  256. errs2 := myValidator.ValidateStruct(timeTest).Flatten()
  257. c.Assert(errs2, NotNil)
  258. AssertMapFieldError(errs2, "Start", "ltfield", c)
  259. err3 := myValidator.ValidateFieldByTagAndValue(&end, &start, "ltfield")
  260. c.Assert(err3, IsNil)
  261. err3 = myValidator.ValidateFieldByTagAndValue(&start, &end, "ltfield")
  262. c.Assert(err3, NotNil)
  263. c.Assert(err3.ErrorTag, Equals, "ltfield")
  264. type IntTest struct {
  265. Val1 int `validate:"required"`
  266. Val2 int `validate:"required,ltfield=Val1"`
  267. }
  268. intTest := &IntTest{
  269. Val1: 5,
  270. Val2: 1,
  271. }
  272. errs = myValidator.ValidateStruct(intTest)
  273. c.Assert(errs, IsNil)
  274. intTest = &IntTest{
  275. Val1: 1,
  276. Val2: 5,
  277. }
  278. errs2 = myValidator.ValidateStruct(intTest).Flatten()
  279. c.Assert(errs2, NotNil)
  280. AssertMapFieldError(errs2, "Val2", "ltfield", c)
  281. err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "ltfield")
  282. c.Assert(err3, IsNil)
  283. err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "ltfield")
  284. c.Assert(err3, NotNil)
  285. c.Assert(err3.ErrorTag, Equals, "ltfield")
  286. type UIntTest struct {
  287. Val1 uint `validate:"required"`
  288. Val2 uint `validate:"required,ltfield=Val1"`
  289. }
  290. uIntTest := &UIntTest{
  291. Val1: 5,
  292. Val2: 1,
  293. }
  294. errs = myValidator.ValidateStruct(uIntTest)
  295. c.Assert(errs, IsNil)
  296. uIntTest = &UIntTest{
  297. Val1: 1,
  298. Val2: 5,
  299. }
  300. errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
  301. c.Assert(errs2, NotNil)
  302. AssertMapFieldError(errs2, "Val2", "ltfield", c)
  303. err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "ltfield")
  304. c.Assert(err3, IsNil)
  305. err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "ltfield")
  306. c.Assert(err3, NotNil)
  307. c.Assert(err3.ErrorTag, Equals, "ltfield")
  308. type FloatTest struct {
  309. Val1 float64 `validate:"required"`
  310. Val2 float64 `validate:"required,ltfield=Val1"`
  311. }
  312. floatTest := &FloatTest{
  313. Val1: 5,
  314. Val2: 1,
  315. }
  316. errs = myValidator.ValidateStruct(floatTest)
  317. c.Assert(errs, IsNil)
  318. floatTest = &FloatTest{
  319. Val1: 1,
  320. Val2: 5,
  321. }
  322. errs2 = myValidator.ValidateStruct(floatTest).Flatten()
  323. c.Assert(errs2, NotNil)
  324. AssertMapFieldError(errs2, "Val2", "ltfield", c)
  325. err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "ltfield")
  326. c.Assert(err3, IsNil)
  327. err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "ltfield")
  328. c.Assert(err3, NotNil)
  329. c.Assert(err3.ErrorTag, Equals, "ltfield")
  330. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 5, "ltfield") }, PanicMatches, "struct not passed for cross validation")
  331. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, "T", "ltfield") }, PanicMatches, "Bad field type string")
  332. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, end, "ltfield") }, PanicMatches, "Bad Top Level field type")
  333. type TimeTest2 struct {
  334. Start *time.Time `validate:"required"`
  335. End *time.Time `validate:"required,ltfield=NonExistantField"`
  336. }
  337. timeTest2 := &TimeTest2{
  338. Start: &end,
  339. End: &start,
  340. }
  341. c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
  342. }
  343. func (ms *MySuite) TestLteField(c *C) {
  344. type TimeTest struct {
  345. Start *time.Time `validate:"required,lte,ltefield=End"`
  346. End *time.Time `validate:"required,lte"`
  347. }
  348. now := time.Now()
  349. start := now.Add(time.Hour * 24 * -1 * 2)
  350. end := start.Add(time.Hour * 24)
  351. timeTest := &TimeTest{
  352. Start: &start,
  353. End: &end,
  354. }
  355. errs := myValidator.ValidateStruct(timeTest)
  356. c.Assert(errs, IsNil)
  357. timeTest = &TimeTest{
  358. Start: &end,
  359. End: &start,
  360. }
  361. errs2 := myValidator.ValidateStruct(timeTest).Flatten()
  362. c.Assert(errs2, NotNil)
  363. AssertMapFieldError(errs2, "Start", "ltefield", c)
  364. err3 := myValidator.ValidateFieldByTagAndValue(&end, &start, "ltefield")
  365. c.Assert(err3, IsNil)
  366. err3 = myValidator.ValidateFieldByTagAndValue(&start, &end, "ltefield")
  367. c.Assert(err3, NotNil)
  368. c.Assert(err3.ErrorTag, Equals, "ltefield")
  369. type IntTest struct {
  370. Val1 int `validate:"required"`
  371. Val2 int `validate:"required,ltefield=Val1"`
  372. }
  373. intTest := &IntTest{
  374. Val1: 5,
  375. Val2: 1,
  376. }
  377. errs = myValidator.ValidateStruct(intTest)
  378. c.Assert(errs, IsNil)
  379. intTest = &IntTest{
  380. Val1: 1,
  381. Val2: 5,
  382. }
  383. errs2 = myValidator.ValidateStruct(intTest).Flatten()
  384. c.Assert(errs2, NotNil)
  385. AssertMapFieldError(errs2, "Val2", "ltefield", c)
  386. err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "ltefield")
  387. c.Assert(err3, IsNil)
  388. err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "ltefield")
  389. c.Assert(err3, NotNil)
  390. c.Assert(err3.ErrorTag, Equals, "ltefield")
  391. type UIntTest struct {
  392. Val1 uint `validate:"required"`
  393. Val2 uint `validate:"required,ltefield=Val1"`
  394. }
  395. uIntTest := &UIntTest{
  396. Val1: 5,
  397. Val2: 1,
  398. }
  399. errs = myValidator.ValidateStruct(uIntTest)
  400. c.Assert(errs, IsNil)
  401. uIntTest = &UIntTest{
  402. Val1: 1,
  403. Val2: 5,
  404. }
  405. errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
  406. c.Assert(errs2, NotNil)
  407. AssertMapFieldError(errs2, "Val2", "ltefield", c)
  408. err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "ltefield")
  409. c.Assert(err3, IsNil)
  410. err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "ltefield")
  411. c.Assert(err3, NotNil)
  412. c.Assert(err3.ErrorTag, Equals, "ltefield")
  413. type FloatTest struct {
  414. Val1 float64 `validate:"required"`
  415. Val2 float64 `validate:"required,ltefield=Val1"`
  416. }
  417. floatTest := &FloatTest{
  418. Val1: 5,
  419. Val2: 1,
  420. }
  421. errs = myValidator.ValidateStruct(floatTest)
  422. c.Assert(errs, IsNil)
  423. floatTest = &FloatTest{
  424. Val1: 1,
  425. Val2: 5,
  426. }
  427. errs2 = myValidator.ValidateStruct(floatTest).Flatten()
  428. c.Assert(errs2, NotNil)
  429. AssertMapFieldError(errs2, "Val2", "ltefield", c)
  430. err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "ltefield")
  431. c.Assert(err3, IsNil)
  432. err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "ltefield")
  433. c.Assert(err3, NotNil)
  434. c.Assert(err3.ErrorTag, Equals, "ltefield")
  435. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 5, "ltefield") }, PanicMatches, "struct not passed for cross validation")
  436. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, "T", "ltefield") }, PanicMatches, "Bad field type string")
  437. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(1, end, "ltefield") }, PanicMatches, "Bad Top Level field type")
  438. type TimeTest2 struct {
  439. Start *time.Time `validate:"required"`
  440. End *time.Time `validate:"required,ltefield=NonExistantField"`
  441. }
  442. timeTest2 := &TimeTest2{
  443. Start: &end,
  444. End: &start,
  445. }
  446. c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
  447. }
  448. func (ms *MySuite) TestGteField(c *C) {
  449. type TimeTest struct {
  450. Start *time.Time `validate:"required,gte"`
  451. End *time.Time `validate:"required,gte,gtefield=Start"`
  452. }
  453. now := time.Now()
  454. start := now.Add(time.Hour * 24)
  455. end := start.Add(time.Hour * 24)
  456. timeTest := &TimeTest{
  457. Start: &start,
  458. End: &end,
  459. }
  460. errs := myValidator.ValidateStruct(timeTest)
  461. c.Assert(errs, IsNil)
  462. timeTest = &TimeTest{
  463. Start: &end,
  464. End: &start,
  465. }
  466. errs2 := myValidator.ValidateStruct(timeTest).Flatten()
  467. c.Assert(errs2, NotNil)
  468. AssertMapFieldError(errs2, "End", "gtefield", c)
  469. err3 := myValidator.ValidateFieldByTagAndValue(&start, &end, "gtefield")
  470. c.Assert(err3, IsNil)
  471. err3 = myValidator.ValidateFieldByTagAndValue(&end, &start, "gtefield")
  472. c.Assert(err3, NotNil)
  473. c.Assert(err3.ErrorTag, Equals, "gtefield")
  474. type IntTest struct {
  475. Val1 int `validate:"required"`
  476. Val2 int `validate:"required,gtefield=Val1"`
  477. }
  478. intTest := &IntTest{
  479. Val1: 1,
  480. Val2: 5,
  481. }
  482. errs = myValidator.ValidateStruct(intTest)
  483. c.Assert(errs, IsNil)
  484. intTest = &IntTest{
  485. Val1: 5,
  486. Val2: 1,
  487. }
  488. errs2 = myValidator.ValidateStruct(intTest).Flatten()
  489. c.Assert(errs2, NotNil)
  490. AssertMapFieldError(errs2, "Val2", "gtefield", c)
  491. err3 = myValidator.ValidateFieldByTagAndValue(int(1), int(5), "gtefield")
  492. c.Assert(err3, IsNil)
  493. err3 = myValidator.ValidateFieldByTagAndValue(int(5), int(1), "gtefield")
  494. c.Assert(err3, NotNil)
  495. c.Assert(err3.ErrorTag, Equals, "gtefield")
  496. type UIntTest struct {
  497. Val1 uint `validate:"required"`
  498. Val2 uint `validate:"required,gtefield=Val1"`
  499. }
  500. uIntTest := &UIntTest{
  501. Val1: 1,
  502. Val2: 5,
  503. }
  504. errs = myValidator.ValidateStruct(uIntTest)
  505. c.Assert(errs, IsNil)
  506. uIntTest = &UIntTest{
  507. Val1: 5,
  508. Val2: 1,
  509. }
  510. errs2 = myValidator.ValidateStruct(uIntTest).Flatten()
  511. c.Assert(errs2, NotNil)
  512. AssertMapFieldError(errs2, "Val2", "gtefield", c)
  513. err3 = myValidator.ValidateFieldByTagAndValue(uint(1), uint(5), "gtefield")
  514. c.Assert(err3, IsNil)
  515. err3 = myValidator.ValidateFieldByTagAndValue(uint(5), uint(1), "gtefield")
  516. c.Assert(err3, NotNil)
  517. c.Assert(err3.ErrorTag, Equals, "gtefield")
  518. type FloatTest struct {
  519. Val1 float64 `validate:"required"`
  520. Val2 float64 `validate:"required,gtefield=Val1"`
  521. }
  522. floatTest := &FloatTest{
  523. Val1: 1,
  524. Val2: 5,
  525. }
  526. errs = myValidator.ValidateStruct(floatTest)
  527. c.Assert(errs, IsNil)
  528. floatTest = &FloatTest{
  529. Val1: 5,
  530. Val2: 1,
  531. }
  532. errs2 = myValidator.ValidateStruct(floatTest).Flatten()
  533. c.Assert(errs2, NotNil)
  534. AssertMapFieldError(errs2, "Val2", "gtefield", c)
  535. err3 = myValidator.ValidateFieldByTagAndValue(float32(1), float32(5), "gtefield")
  536. c.Assert(err3, IsNil)
  537. err3 = myValidator.ValidateFieldByTagAndValue(float32(5), float32(1), "gtefield")
  538. c.Assert(err3, NotNil)
  539. c.Assert(err3.ErrorTag, Equals, "gtefield")
  540. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(nil, 1, "gtefield") }, PanicMatches, "struct not passed for cross validation")
  541. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, "T", "gtefield") }, PanicMatches, "Bad field type string")
  542. c.Assert(func() { myValidator.ValidateFieldByTagAndValue(5, start, "gtefield") }, PanicMatches, "Bad Top Level field type")
  543. type TimeTest2 struct {
  544. Start *time.Time `validate:"required"`
  545. End *time.Time `validate:"required,gtefield=NonExistantField"`
  546. }
  547. timeTest2 := &TimeTest2{
  548. Start: &start,
  549. End: &end,
  550. }
  551. c.Assert(func() { myValidator.ValidateStruct(timeTest2) }, PanicMatches, "Field \"NonExistantField\" not found in struct")
  552. }
  553. func (ms *MySuite) TestValidateByTagAndValue(c *C) {
  554. val := "test"
  555. field := "test"
  556. err := myValidator.ValidateFieldByTagAndValue(val, field, "required")
  557. c.Assert(err, IsNil)
  558. myValidator.AddFunction("isequaltestfunc", isEqualFunc)
  559. err = myValidator.ValidateFieldByTagAndValue(val, field, "isequaltestfunc")
  560. c.Assert(err, IsNil)
  561. val = "unequal"
  562. err = myValidator.ValidateFieldByTagAndValue(val, field, "isequaltestfunc")
  563. c.Assert(err, NotNil)
  564. c.Assert(err.ErrorTag, Equals, "isequaltestfunc")
  565. }
  566. func (ms *MySuite) TestAddFunctions(c *C) {
  567. validate := validator.NewValidator("validateme", validator.BakedInValidators)
  568. err := validate.AddFunction("new", newValidatorFunc)
  569. c.Assert(err, IsNil)
  570. err = validate.AddFunction("", newValidatorFunc)
  571. c.Assert(err, NotNil)
  572. validate.AddFunction("new", nil)
  573. c.Assert(err, NotNil)
  574. err = validate.AddFunction("new", newValidatorFunc)
  575. c.Assert(err, IsNil)
  576. }
  577. func (ms *MySuite) TestChangeTag(c *C) {
  578. validate := validator.NewValidator("validateme", validator.BakedInValidators)
  579. validate.SetTag("val")
  580. type Test struct {
  581. Name string `val:"len=4"`
  582. }
  583. s := &Test{
  584. Name: "TEST",
  585. }
  586. err := validate.ValidateStruct(s)
  587. c.Assert(err, IsNil)
  588. // validator.SetTag("v")
  589. // validator.SetTag("validate")
  590. }
  591. func (ms *MySuite) TestUnexposedStruct(c *C) {
  592. type Test struct {
  593. Name string
  594. unexposed struct {
  595. A string `validate:"required"`
  596. }
  597. }
  598. s := &Test{
  599. Name: "TEST",
  600. }
  601. err := myValidator.ValidateStruct(s)
  602. c.Assert(err, IsNil)
  603. }
  604. func (ms *MySuite) TestBadParams(c *C) {
  605. i := 1
  606. err := myValidator.ValidateFieldByTag(i, "-")
  607. c.Assert(err, IsNil)
  608. c.Assert(func() { myValidator.ValidateFieldByTag(i, "len=a") }, PanicMatches, "strconv.ParseInt: parsing \"a\": invalid syntax")
  609. c.Assert(func() { myValidator.ValidateFieldByTag(i, "len=a") }, PanicMatches, "strconv.ParseInt: parsing \"a\": invalid syntax")
  610. var ui uint = 1
  611. c.Assert(func() { myValidator.ValidateFieldByTag(ui, "len=a") }, PanicMatches, "strconv.ParseUint: parsing \"a\": invalid syntax")
  612. f := 1.23
  613. c.Assert(func() { myValidator.ValidateFieldByTag(f, "len=a") }, PanicMatches, "strconv.ParseFloat: parsing \"a\": invalid syntax")
  614. }
  615. func (ms *MySuite) TestLength(c *C) {
  616. i := true
  617. c.Assert(func() { myValidator.ValidateFieldByTag(i, "len") }, PanicMatches, "Bad field type bool")
  618. }
  619. func (ms *MySuite) TestIsGt(c *C) {
  620. myMap := map[string]string{}
  621. err := myValidator.ValidateFieldByTag(myMap, "gt=0")
  622. c.Assert(err, NotNil)
  623. f := 1.23
  624. err = myValidator.ValidateFieldByTag(f, "gt=5")
  625. c.Assert(err, NotNil)
  626. var ui uint = 5
  627. err = myValidator.ValidateFieldByTag(ui, "gt=10")
  628. c.Assert(err, NotNil)
  629. i := true
  630. c.Assert(func() { myValidator.ValidateFieldByTag(i, "gt") }, PanicMatches, "Bad field type bool")
  631. t := time.Now().UTC()
  632. t = t.Add(time.Hour * 24)
  633. err = myValidator.ValidateFieldByTag(t, "gt")
  634. c.Assert(err, IsNil)
  635. t2 := time.Now().UTC()
  636. err = myValidator.ValidateFieldByTag(t2, "gt")
  637. c.Assert(err, NotNil)
  638. c.Assert(err.ErrorTag, Equals, "gt")
  639. type Test struct {
  640. Now *time.Time `validate:"gt"`
  641. }
  642. s := &Test{
  643. Now: &t,
  644. }
  645. errs := myValidator.ValidateStruct(s)
  646. c.Assert(errs, IsNil)
  647. s = &Test{
  648. Now: &t2,
  649. }
  650. errs = myValidator.ValidateStruct(s)
  651. c.Assert(errs, NotNil)
  652. }
  653. func (ms *MySuite) TestIsGte(c *C) {
  654. i := true
  655. c.Assert(func() { myValidator.ValidateFieldByTag(i, "gte") }, PanicMatches, "Bad field type bool")
  656. t := time.Now().UTC()
  657. t = t.Add(time.Hour * 24)
  658. err := myValidator.ValidateFieldByTag(t, "gte")
  659. c.Assert(err, IsNil)
  660. t2 := time.Now().UTC()
  661. err = myValidator.ValidateFieldByTag(t2, "gte")
  662. c.Assert(err, NotNil)
  663. c.Assert(err.ErrorTag, Equals, "gte")
  664. c.Assert(err.Type, Equals, reflect.TypeOf(time.Time{}))
  665. type Test struct {
  666. Now *time.Time `validate:"gte"`
  667. }
  668. s := &Test{
  669. Now: &t,
  670. }
  671. errs := myValidator.ValidateStruct(s)
  672. c.Assert(errs, IsNil)
  673. s = &Test{
  674. Now: &t2,
  675. }
  676. errs = myValidator.ValidateStruct(s)
  677. c.Assert(errs, NotNil)
  678. }
  679. func (ms *MySuite) TestIsLt(c *C) {
  680. myMap := map[string]string{}
  681. err := myValidator.ValidateFieldByTag(myMap, "lt=0")
  682. c.Assert(err, NotNil)
  683. f := 1.23
  684. err = myValidator.ValidateFieldByTag(f, "lt=0")
  685. c.Assert(err, NotNil)
  686. var ui uint = 5
  687. err = myValidator.ValidateFieldByTag(ui, "lt=0")
  688. c.Assert(err, NotNil)
  689. i := true
  690. c.Assert(func() { myValidator.ValidateFieldByTag(i, "lt") }, PanicMatches, "Bad field type bool")
  691. t := time.Now().UTC()
  692. err = myValidator.ValidateFieldByTag(t, "lt")
  693. c.Assert(err, IsNil)
  694. t2 := time.Now().UTC()
  695. t2 = t2.Add(time.Hour * 24)
  696. err = myValidator.ValidateFieldByTag(t2, "lt")
  697. c.Assert(err, NotNil)
  698. c.Assert(err.ErrorTag, Equals, "lt")
  699. type Test struct {
  700. Now *time.Time `validate:"lt"`
  701. }
  702. s := &Test{
  703. Now: &t,
  704. }
  705. errs := myValidator.ValidateStruct(s)
  706. c.Assert(errs, IsNil)
  707. s = &Test{
  708. Now: &t2,
  709. }
  710. errs = myValidator.ValidateStruct(s)
  711. c.Assert(errs, NotNil)
  712. }
  713. func (ms *MySuite) TestIsLte(c *C) {
  714. i := true
  715. c.Assert(func() { myValidator.ValidateFieldByTag(i, "lte") }, PanicMatches, "Bad field type bool")
  716. t := time.Now().UTC()
  717. err := myValidator.ValidateFieldByTag(t, "lte")
  718. c.Assert(err, IsNil)
  719. t2 := time.Now().UTC()
  720. t2 = t2.Add(time.Hour * 24)
  721. err = myValidator.ValidateFieldByTag(t2, "lte")
  722. c.Assert(err, NotNil)
  723. c.Assert(err.ErrorTag, Equals, "lte")
  724. type Test struct {
  725. Now *time.Time `validate:"lte"`
  726. }
  727. s := &Test{
  728. Now: &t,
  729. }
  730. errs := myValidator.ValidateStruct(s)
  731. c.Assert(errs, IsNil)
  732. s = &Test{
  733. Now: &t2,
  734. }
  735. errs = myValidator.ValidateStruct(s)
  736. c.Assert(errs, NotNil)
  737. }
  738. func (ms *MySuite) TestUrl(c *C) {
  739. var tests = []struct {
  740. param string
  741. expected bool
  742. }{
  743. {"http://foo.bar#com", true},
  744. {"http://foobar.com", true},
  745. {"https://foobar.com", true},
  746. {"foobar.com", false},
  747. {"http://foobar.coffee/", true},
  748. {"http://foobar.中文网/", true},
  749. {"http://foobar.org/", true},
  750. {"http://foobar.org:8080/", true},
  751. {"ftp://foobar.ru/", true},
  752. {"http://user:pass@www.foobar.com/", true},
  753. {"http://127.0.0.1/", true},
  754. {"http://duckduckgo.com/?q=%2F", true},
  755. {"http://localhost:3000/", true},
  756. {"http://foobar.com/?foo=bar#baz=qux", true},
  757. {"http://foobar.com?foo=bar", true},
  758. {"http://www.xn--froschgrn-x9a.net/", true},
  759. {"", false},
  760. {"xyz://foobar.com", true},
  761. {"invalid.", false},
  762. {".com", false},
  763. {"rtmp://foobar.com", true},
  764. {"http://www.foo_bar.com/", true},
  765. {"http://localhost:3000/", true},
  766. {"http://foobar.com#baz=qux", true},
  767. {"http://foobar.com/t$-_.+!*\\'(),", true},
  768. {"http://www.foobar.com/~foobar", true},
  769. {"http://www.-foobar.com/", true},
  770. {"http://www.foo---bar.com/", true},
  771. {"mailto:someone@example.com", true},
  772. {"irc://irc.server.org/channel", true},
  773. {"irc://#channel@network", true},
  774. {"/abs/test/dir", false},
  775. {"./rel/test/dir", false},
  776. }
  777. for _, test := range tests {
  778. err := myValidator.ValidateFieldByTag(test.param, "url")
  779. if test.expected == true {
  780. c.Assert(err, IsNil)
  781. } else {
  782. c.Assert(err, NotNil)
  783. c.Assert(err.ErrorTag, Equals, "url")
  784. }
  785. }
  786. i := 1
  787. c.Assert(func() { myValidator.ValidateFieldByTag(i, "url") }, PanicMatches, "Bad field type int")
  788. }
  789. func (ms *MySuite) TestUri(c *C) {
  790. var tests = []struct {
  791. param string
  792. expected bool
  793. }{
  794. {"http://foo.bar#com", true},
  795. {"http://foobar.com", true},
  796. {"https://foobar.com", true},
  797. {"foobar.com", false},
  798. {"http://foobar.coffee/", true},
  799. {"http://foobar.中文网/", true},
  800. {"http://foobar.org/", true},
  801. {"http://foobar.org:8080/", true},
  802. {"ftp://foobar.ru/", true},
  803. {"http://user:pass@www.foobar.com/", true},
  804. {"http://127.0.0.1/", true},
  805. {"http://duckduckgo.com/?q=%2F", true},
  806. {"http://localhost:3000/", true},
  807. {"http://foobar.com/?foo=bar#baz=qux", true},
  808. {"http://foobar.com?foo=bar", true},
  809. {"http://www.xn--froschgrn-x9a.net/", true},
  810. {"", false},
  811. {"xyz://foobar.com", true},
  812. {"invalid.", false},
  813. {".com", false},
  814. {"rtmp://foobar.com", true},
  815. {"http://www.foo_bar.com/", true},
  816. {"http://localhost:3000/", true},
  817. {"http://foobar.com#baz=qux", true},
  818. {"http://foobar.com/t$-_.+!*\\'(),", true},
  819. {"http://www.foobar.com/~foobar", true},
  820. {"http://www.-foobar.com/", true},
  821. {"http://www.foo---bar.com/", true},
  822. {"mailto:someone@example.com", true},
  823. {"irc://irc.server.org/channel", true},
  824. {"irc://#channel@network", true},
  825. {"/abs/test/dir", true},
  826. {"./rel/test/dir", false},
  827. }
  828. for _, test := range tests {
  829. err := myValidator.ValidateFieldByTag(test.param, "uri")
  830. if test.expected == true {
  831. c.Assert(err, IsNil)
  832. } else {
  833. c.Assert(err, NotNil)
  834. c.Assert(err.ErrorTag, Equals, "uri")
  835. }
  836. }
  837. i := 1
  838. c.Assert(func() { myValidator.ValidateFieldByTag(i, "uri") }, PanicMatches, "Bad field type int")
  839. }
  840. func (ms *MySuite) TestOrTag(c *C) {
  841. s := "rgba(0,31,255,0.5)"
  842. err := myValidator.ValidateFieldByTag(s, "rgb|rgba")
  843. c.Assert(err, IsNil)
  844. s = "rgba(0,31,255,0.5)"
  845. err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=18")
  846. c.Assert(err, IsNil)
  847. s = "this ain't right"
  848. err = myValidator.ValidateFieldByTag(s, "rgb|rgba")
  849. c.Assert(err, NotNil)
  850. c.Assert(err.ErrorTag, Equals, "rgb|rgba")
  851. s = "this ain't right"
  852. err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=10")
  853. c.Assert(err, NotNil)
  854. c.Assert(err.ErrorTag, Equals, "rgb|rgba|len")
  855. s = "this is right"
  856. err = myValidator.ValidateFieldByTag(s, "rgb|rgba|len=13")
  857. c.Assert(err, IsNil)
  858. s = ""
  859. err = myValidator.ValidateFieldByTag(s, "omitempty,rgb|rgba")
  860. c.Assert(err, IsNil)
  861. }
  862. func (ms *MySuite) TestHsla(c *C) {
  863. s := "hsla(360,100%,100%,1)"
  864. err := myValidator.ValidateFieldByTag(s, "hsla")
  865. c.Assert(err, IsNil)
  866. s = "hsla(360,100%,100%,0.5)"
  867. err = myValidator.ValidateFieldByTag(s, "hsla")
  868. c.Assert(err, IsNil)
  869. s = "hsla(0,0%,0%, 0)"
  870. err = myValidator.ValidateFieldByTag(s, "hsla")
  871. c.Assert(err, IsNil)
  872. s = "hsl(361,100%,50%,1)"
  873. err = myValidator.ValidateFieldByTag(s, "hsla")
  874. c.Assert(err, NotNil)
  875. c.Assert(err.ErrorTag, Equals, "hsla")
  876. s = "hsl(361,100%,50%)"
  877. err = myValidator.ValidateFieldByTag(s, "hsla")
  878. c.Assert(err, NotNil)
  879. c.Assert(err.ErrorTag, Equals, "hsla")
  880. s = "hsla(361,100%,50%)"
  881. err = myValidator.ValidateFieldByTag(s, "hsla")
  882. c.Assert(err, NotNil)
  883. c.Assert(err.ErrorTag, Equals, "hsla")
  884. s = "hsla(360,101%,50%)"
  885. err = myValidator.ValidateFieldByTag(s, "hsla")
  886. c.Assert(err, NotNil)
  887. c.Assert(err.ErrorTag, Equals, "hsla")
  888. s = "hsla(360,100%,101%)"
  889. err = myValidator.ValidateFieldByTag(s, "hsla")
  890. c.Assert(err, NotNil)
  891. c.Assert(err.ErrorTag, Equals, "hsla")
  892. i := 1
  893. c.Assert(func() { myValidator.ValidateFieldByTag(i, "hsla") }, PanicMatches, "interface conversion: interface is int, not string")
  894. }
  895. func (ms *MySuite) TestHsl(c *C) {
  896. s := "hsl(360,100%,50%)"
  897. err := myValidator.ValidateFieldByTag(s, "hsl")
  898. c.Assert(err, IsNil)
  899. s = "hsl(0,0%,0%)"
  900. err = myValidator.ValidateFieldByTag(s, "hsl")
  901. c.Assert(err, IsNil)
  902. s = "hsl(361,100%,50%)"
  903. err = myValidator.ValidateFieldByTag(s, "hsl")
  904. c.Assert(err, NotNil)
  905. c.Assert(err.ErrorTag, Equals, "hsl")
  906. s = "hsl(361,101%,50%)"
  907. err = myValidator.ValidateFieldByTag(s, "hsl")
  908. c.Assert(err, NotNil)
  909. c.Assert(err.ErrorTag, Equals, "hsl")
  910. s = "hsl(361,100%,101%)"
  911. err = myValidator.ValidateFieldByTag(s, "hsl")
  912. c.Assert(err, NotNil)
  913. c.Assert(err.ErrorTag, Equals, "hsl")
  914. s = "hsl(-10,100%,100%)"
  915. err = myValidator.ValidateFieldByTag(s, "hsl")
  916. c.Assert(err, NotNil)
  917. c.Assert(err.ErrorTag, Equals, "hsl")
  918. i := 1
  919. c.Assert(func() { myValidator.ValidateFieldByTag(i, "hsl") }, PanicMatches, "interface conversion: interface is int, not string")
  920. }
  921. func (ms *MySuite) TestRgba(c *C) {
  922. s := "rgba(0,31,255,0.5)"
  923. err := myValidator.ValidateFieldByTag(s, "rgba")
  924. c.Assert(err, IsNil)
  925. s = "rgba(0,31,255,0.12)"
  926. err = myValidator.ValidateFieldByTag(s, "rgba")
  927. c.Assert(err, IsNil)
  928. s = "rgba( 0, 31, 255, 0.5)"
  929. err = myValidator.ValidateFieldByTag(s, "rgba")
  930. c.Assert(err, IsNil)
  931. s = "rgb(0, 31, 255)"
  932. err = myValidator.ValidateFieldByTag(s, "rgba")
  933. c.Assert(err, NotNil)
  934. c.Assert(err.ErrorTag, Equals, "rgba")
  935. s = "rgb(1,349,275,0.5)"
  936. err = myValidator.ValidateFieldByTag(s, "rgba")
  937. c.Assert(err, NotNil)
  938. c.Assert(err.ErrorTag, Equals, "rgba")
  939. s = "rgb(01,31,255,0.5)"
  940. err = myValidator.ValidateFieldByTag(s, "rgba")
  941. c.Assert(err, NotNil)
  942. c.Assert(err.ErrorTag, Equals, "rgba")
  943. i := 1
  944. c.Assert(func() { myValidator.ValidateFieldByTag(i, "rgba") }, PanicMatches, "interface conversion: interface is int, not string")
  945. }
  946. func (ms *MySuite) TestRgb(c *C) {
  947. s := "rgb(0,31,255)"
  948. err := myValidator.ValidateFieldByTag(s, "rgb")
  949. c.Assert(err, IsNil)
  950. s = "rgb(0, 31, 255)"
  951. err = myValidator.ValidateFieldByTag(s, "rgb")
  952. c.Assert(err, IsNil)
  953. s = "rgb(1,349,275)"
  954. err = myValidator.ValidateFieldByTag(s, "rgb")
  955. c.Assert(err, NotNil)
  956. c.Assert(err.ErrorTag, Equals, "rgb")
  957. s = "rgb(01,31,255)"
  958. err = myValidator.ValidateFieldByTag(s, "rgb")
  959. c.Assert(err, NotNil)
  960. c.Assert(err.ErrorTag, Equals, "rgb")
  961. s = "rgba(0,31,255)"
  962. err = myValidator.ValidateFieldByTag(s, "rgb")
  963. c.Assert(err, NotNil)
  964. c.Assert(err.ErrorTag, Equals, "rgb")
  965. i := 1
  966. c.Assert(func() { myValidator.ValidateFieldByTag(i, "rgb") }, PanicMatches, "interface conversion: interface is int, not string")
  967. }
  968. func (ms *MySuite) TestEmail(c *C) {
  969. s := "test@mail.com"
  970. err := myValidator.ValidateFieldByTag(s, "email")
  971. c.Assert(err, IsNil)
  972. s = ""
  973. err = myValidator.ValidateFieldByTag(s, "email")
  974. c.Assert(err, NotNil)
  975. c.Assert(err.ErrorTag, Equals, "email")
  976. s = "test@email"
  977. err = myValidator.ValidateFieldByTag(s, "email")
  978. c.Assert(err, NotNil)
  979. c.Assert(err.ErrorTag, Equals, "email")
  980. s = "test@email."
  981. err = myValidator.ValidateFieldByTag(s, "email")
  982. c.Assert(err, NotNil)
  983. c.Assert(err.ErrorTag, Equals, "email")
  984. s = "@email.com"
  985. err = myValidator.ValidateFieldByTag(s, "email")
  986. c.Assert(err, NotNil)
  987. c.Assert(err.ErrorTag, Equals, "email")
  988. i := true
  989. c.Assert(func() { myValidator.ValidateFieldByTag(i, "email") }, PanicMatches, "interface conversion: interface is bool, not string")
  990. }
  991. func (ms *MySuite) TestHexColor(c *C) {
  992. s := "#fff"
  993. err := myValidator.ValidateFieldByTag(s, "hexcolor")
  994. c.Assert(err, IsNil)
  995. s = "#c2c2c2"
  996. err = myValidator.ValidateFieldByTag(s, "hexcolor")
  997. c.Assert(err, IsNil)
  998. s = "fff"
  999. err = myValidator.ValidateFieldByTag(s, "hexcolor")
  1000. c.Assert(err, NotNil)
  1001. c.Assert(err.ErrorTag, Equals, "hexcolor")
  1002. s = "fffFF"
  1003. err = myValidator.ValidateFieldByTag(s, "hexcolor")
  1004. c.Assert(err, NotNil)
  1005. c.Assert(err.ErrorTag, Equals, "hexcolor")
  1006. i := true
  1007. c.Assert(func() { myValidator.ValidateFieldByTag(i, "hexcolor") }, PanicMatches, "interface conversion: interface is bool, not string")
  1008. }
  1009. func (ms *MySuite) TestHexadecimal(c *C) {
  1010. s := "ff0044"
  1011. err := myValidator.ValidateFieldByTag(s, "hexadecimal")
  1012. c.Assert(err, IsNil)
  1013. s = "abcdefg"
  1014. err = myValidator.ValidateFieldByTag(s, "hexadecimal")
  1015. c.Assert(err, NotNil)
  1016. c.Assert(err.ErrorTag, Equals, "hexadecimal")
  1017. i := true
  1018. c.Assert(func() { myValidator.ValidateFieldByTag(i, "hexadecimal") }, PanicMatches, "interface conversion: interface is bool, not string")
  1019. }
  1020. func (ms *MySuite) TestNumber(c *C) {
  1021. s := "1"
  1022. err := myValidator.ValidateFieldByTag(s, "number")
  1023. c.Assert(err, IsNil)
  1024. s = "+1"
  1025. err = myValidator.ValidateFieldByTag(s, "number")
  1026. c.Assert(err, NotNil)
  1027. c.Assert(err.ErrorTag, Equals, "number")
  1028. s = "-1"
  1029. err = myValidator.ValidateFieldByTag(s, "number")
  1030. c.Assert(err, NotNil)
  1031. c.Assert(err.ErrorTag, Equals, "number")
  1032. s = "1.12"
  1033. err = myValidator.ValidateFieldByTag(s, "number")
  1034. c.Assert(err, NotNil)
  1035. c.Assert(err.ErrorTag, Equals, "number")
  1036. s = "+1.12"
  1037. err = myValidator.ValidateFieldByTag(s, "number")
  1038. c.Assert(err, NotNil)
  1039. c.Assert(err.ErrorTag, Equals, "number")
  1040. s = "-1.12"
  1041. err = myValidator.ValidateFieldByTag(s, "number")
  1042. c.Assert(err, NotNil)
  1043. c.Assert(err.ErrorTag, Equals, "number")
  1044. s = "1."
  1045. err = myValidator.ValidateFieldByTag(s, "number")
  1046. c.Assert(err, NotNil)
  1047. c.Assert(err.ErrorTag, Equals, "number")
  1048. s = "1.o"
  1049. err = myValidator.ValidateFieldByTag(s, "number")
  1050. c.Assert(err, NotNil)
  1051. c.Assert(err.ErrorTag, Equals, "number")
  1052. i := 1
  1053. c.Assert(func() { myValidator.ValidateFieldByTag(i, "number") }, PanicMatches, "interface conversion: interface is int, not string")
  1054. }
  1055. func (ms *MySuite) TestNumeric(c *C) {
  1056. s := "1"
  1057. err := myValidator.ValidateFieldByTag(s, "numeric")
  1058. c.Assert(err, IsNil)
  1059. s = "+1"
  1060. err = myValidator.ValidateFieldByTag(s, "numeric")
  1061. c.Assert(err, IsNil)
  1062. s = "-1"
  1063. err = myValidator.ValidateFieldByTag(s, "numeric")
  1064. c.Assert(err, IsNil)
  1065. s = "1.12"
  1066. err = myValidator.ValidateFieldByTag(s, "numeric")
  1067. c.Assert(err, IsNil)
  1068. s = "+1.12"
  1069. err = myValidator.ValidateFieldByTag(s, "numeric")
  1070. c.Assert(err, IsNil)
  1071. s = "-1.12"
  1072. err = myValidator.ValidateFieldByTag(s, "numeric")
  1073. c.Assert(err, IsNil)
  1074. s = "1."
  1075. err = myValidator.ValidateFieldByTag(s, "numeric")
  1076. c.Assert(err, NotNil)
  1077. c.Assert(err.ErrorTag, Equals, "numeric")
  1078. s = "1.o"
  1079. err = myValidator.ValidateFieldByTag(s, "numeric")
  1080. c.Assert(err, NotNil)
  1081. c.Assert(err.ErrorTag, Equals, "numeric")
  1082. i := 1
  1083. c.Assert(func() { myValidator.ValidateFieldByTag(i, "numeric") }, PanicMatches, "interface conversion: interface is int, not string")
  1084. }
  1085. func (ms *MySuite) TestAlphaNumeric(c *C) {
  1086. s := "abcd123"
  1087. err := myValidator.ValidateFieldByTag(s, "alphanum")
  1088. c.Assert(err, IsNil)
  1089. s = "abc!23"
  1090. err = myValidator.ValidateFieldByTag(s, "alphanum")
  1091. c.Assert(err, NotNil)
  1092. c.Assert(err.ErrorTag, Equals, "alphanum")
  1093. c.Assert(func() { myValidator.ValidateFieldByTag(1, "alphanum") }, PanicMatches, "interface conversion: interface is int, not string")
  1094. }
  1095. func (ms *MySuite) TestAlpha(c *C) {
  1096. s := "abcd"
  1097. err := myValidator.ValidateFieldByTag(s, "alpha")
  1098. c.Assert(err, IsNil)
  1099. s = "abc1"
  1100. err = myValidator.ValidateFieldByTag(s, "alpha")
  1101. c.Assert(err, NotNil)
  1102. c.Assert(err.ErrorTag, Equals, "alpha")
  1103. c.Assert(func() { myValidator.ValidateFieldByTag(1, "alpha") }, PanicMatches, "interface conversion: interface is int, not string")
  1104. }
  1105. func (ms *MySuite) TestFlattening(c *C) {
  1106. tSuccess := &TestString{
  1107. Required: "Required",
  1108. Len: "length==10",
  1109. Min: "min=1",
  1110. Max: "1234567890",
  1111. MinMax: "12345",
  1112. Lt: "012345678",
  1113. Lte: "0123456789",
  1114. Gt: "01234567890",
  1115. Gte: "0123456789",
  1116. OmitEmpty: "",
  1117. Sub: &SubTest{
  1118. Test: "1",
  1119. },
  1120. SubIgnore: &SubTest{
  1121. Test: "",
  1122. },
  1123. Anonymous: struct {
  1124. A string `validate:"required"`
  1125. }{
  1126. A: "1",
  1127. },
  1128. Iface: &Impl{
  1129. F: "123",
  1130. },
  1131. }
  1132. err1 := myValidator.ValidateStruct(tSuccess).Flatten()
  1133. c.Assert(err1, IsNil)
  1134. tFail := &TestString{
  1135. Required: "",
  1136. Len: "",
  1137. Min: "",
  1138. Max: "12345678901",
  1139. MinMax: "",
  1140. OmitEmpty: "12345678901",
  1141. Sub: &SubTest{
  1142. Test: "",
  1143. },
  1144. Anonymous: struct {
  1145. A string `validate:"required"`
  1146. }{
  1147. A: "",
  1148. },
  1149. Iface: &Impl{
  1150. F: "12",
  1151. },
  1152. }
  1153. err2 := myValidator.ValidateStruct(tFail).Flatten()
  1154. // Assert Top Level
  1155. c.Assert(err2, NotNil)
  1156. // Assert Fields
  1157. AssertMapFieldError(err2, "Len", "len", c)
  1158. AssertMapFieldError(err2, "Gt", "gt", c)
  1159. AssertMapFieldError(err2, "Gte", "gte", c)
  1160. // Assert Struct Field
  1161. AssertMapFieldError(err2, "Sub.Test", "required", c)
  1162. // Assert Anonymous Struct Field
  1163. AssertMapFieldError(err2, "Anonymous.A", "required", c)
  1164. // Assert Interface Field
  1165. AssertMapFieldError(err2, "Iface.F", "len", c)
  1166. }
  1167. func (ms *MySuite) TestStructStringValidation(c *C) {
  1168. tSuccess := &TestString{
  1169. Required: "Required",
  1170. Len: "length==10",
  1171. Min: "min=1",
  1172. Max: "1234567890",
  1173. MinMax: "12345",
  1174. Lt: "012345678",
  1175. Lte: "0123456789",
  1176. Gt: "01234567890",
  1177. Gte: "0123456789",
  1178. OmitEmpty: "",
  1179. Sub: &SubTest{
  1180. Test: "1",
  1181. },
  1182. SubIgnore: &SubTest{
  1183. Test: "",
  1184. },
  1185. Anonymous: struct {
  1186. A string `validate:"required"`
  1187. }{
  1188. A: "1",
  1189. },
  1190. Iface: &Impl{
  1191. F: "123",
  1192. },
  1193. }
  1194. err := myValidator.ValidateStruct(tSuccess)
  1195. c.Assert(err, IsNil)
  1196. tFail := &TestString{
  1197. Required: "",
  1198. Len: "",
  1199. Min: "",
  1200. Max: "12345678901",
  1201. MinMax: "",
  1202. Lt: "0123456789",
  1203. Lte: "01234567890",
  1204. Gt: "1",
  1205. Gte: "1",
  1206. OmitEmpty: "12345678901",
  1207. Sub: &SubTest{
  1208. Test: "",
  1209. },
  1210. Anonymous: struct {
  1211. A string `validate:"required"`
  1212. }{
  1213. A: "",
  1214. },
  1215. Iface: &Impl{
  1216. F: "12",
  1217. },
  1218. }
  1219. err = myValidator.ValidateStruct(tFail)
  1220. // Assert Top Level
  1221. c.Assert(err, NotNil)
  1222. c.Assert(err.Struct, Equals, "TestString")
  1223. c.Assert(len(err.Errors), Equals, 10)
  1224. c.Assert(len(err.StructErrors), Equals, 3)
  1225. // Assert Fields
  1226. AssertFieldError(err, "Required", "required", c)
  1227. AssertFieldError(err, "Len", "len", c)
  1228. AssertFieldError(err, "Min", "min", c)
  1229. AssertFieldError(err, "Max", "max", c)
  1230. AssertFieldError(err, "MinMax", "min", c)
  1231. AssertFieldError(err, "Gt", "gt", c)
  1232. AssertFieldError(err, "Gte", "gte", c)
  1233. AssertFieldError(err, "OmitEmpty", "max", c)
  1234. // Assert Anonymous embedded struct
  1235. AssetStruct(err, "Anonymous", "", c)
  1236. // Assert SubTest embedded struct
  1237. val := AssetStruct(err, "Sub", "SubTest", c)
  1238. c.Assert(len(val.Errors), Equals, 1)
  1239. c.Assert(len(val.StructErrors), Equals, 0)
  1240. AssertFieldError(val, "Test", "required", c)
  1241. errors := err.Error()
  1242. c.Assert(errors, NotNil)
  1243. }
  1244. func (ms *MySuite) TestStructInt32Validation(c *C) {
  1245. tSuccess := &TestInt32{
  1246. Required: 1,
  1247. Len: 10,
  1248. Min: 1,
  1249. Max: 10,
  1250. MinMax: 5,
  1251. Lt: 9,
  1252. Lte: 10,
  1253. Gt: 11,
  1254. Gte: 10,
  1255. OmitEmpty: 0,
  1256. }
  1257. err := myValidator.ValidateStruct(tSuccess)
  1258. c.Assert(err, IsNil)
  1259. tFail := &TestInt32{
  1260. Required: 0,
  1261. Len: 11,
  1262. Min: -1,
  1263. Max: 11,
  1264. MinMax: -1,
  1265. Lt: 10,
  1266. Lte: 11,
  1267. Gt: 10,
  1268. Gte: 9,
  1269. OmitEmpty: 11,
  1270. }
  1271. err = myValidator.ValidateStruct(tFail)
  1272. // Assert Top Level
  1273. c.Assert(err, NotNil)
  1274. c.Assert(err.Struct, Equals, "TestInt32")
  1275. c.Assert(len(err.Errors), Equals, 10)
  1276. c.Assert(len(err.StructErrors), Equals, 0)
  1277. // Assert Fields
  1278. AssertFieldError(err, "Required", "required", c)
  1279. AssertFieldError(err, "Len", "len", c)
  1280. AssertFieldError(err, "Min", "min", c)
  1281. AssertFieldError(err, "Max", "max", c)
  1282. AssertFieldError(err, "MinMax", "min", c)
  1283. AssertFieldError(err, "Lt", "lt", c)
  1284. AssertFieldError(err, "Lte", "lte", c)
  1285. AssertFieldError(err, "Gt", "gt", c)
  1286. AssertFieldError(err, "Gte", "gte", c)
  1287. AssertFieldError(err, "OmitEmpty", "max", c)
  1288. }
  1289. func (ms *MySuite) TestStructUint64Validation(c *C) {
  1290. tSuccess := &TestUint64{
  1291. Required: 1,
  1292. Len: 10,
  1293. Min: 1,
  1294. Max: 10,
  1295. MinMax: 5,
  1296. OmitEmpty: 0,
  1297. }
  1298. err := myValidator.ValidateStruct(tSuccess)
  1299. c.Assert(err, IsNil)
  1300. tFail := &TestUint64{
  1301. Required: 0,
  1302. Len: 11,
  1303. Min: 0,
  1304. Max: 11,
  1305. MinMax: 0,
  1306. OmitEmpty: 11,
  1307. }
  1308. err = myValidator.ValidateStruct(tFail)
  1309. // Assert Top Level
  1310. c.Assert(err, NotNil)
  1311. c.Assert(err.Struct, Equals, "TestUint64")
  1312. c.Assert(len(err.Errors), Equals, 6)
  1313. c.Assert(len(err.StructErrors), Equals, 0)
  1314. // Assert Fields
  1315. AssertFieldError(err, "Required", "required", c)
  1316. AssertFieldError(err, "Len", "len", c)
  1317. AssertFieldError(err, "Min", "min", c)
  1318. AssertFieldError(err, "Max", "max", c)
  1319. AssertFieldError(err, "MinMax", "min", c)
  1320. AssertFieldError(err, "OmitEmpty", "max", c)
  1321. }
  1322. func (ms *MySuite) TestStructFloat64Validation(c *C) {
  1323. tSuccess := &TestFloat64{
  1324. Required: 1,
  1325. Len: 10,
  1326. Min: 1,
  1327. Max: 10,
  1328. MinMax: 5,
  1329. OmitEmpty: 0,
  1330. }
  1331. err := myValidator.ValidateStruct(tSuccess)
  1332. c.Assert(err, IsNil)
  1333. tFail := &TestFloat64{
  1334. Required: 0,
  1335. Len: 11,
  1336. Min: 0,
  1337. Max: 11,
  1338. MinMax: 0,
  1339. OmitEmpty: 11,
  1340. }
  1341. err = myValidator.ValidateStruct(tFail)
  1342. // Assert Top Level
  1343. c.Assert(err, NotNil)
  1344. c.Assert(err.Struct, Equals, "TestFloat64")
  1345. c.Assert(len(err.Errors), Equals, 6)
  1346. c.Assert(len(err.StructErrors), Equals, 0)
  1347. // Assert Fields
  1348. AssertFieldError(err, "Required", "required", c)
  1349. AssertFieldError(err, "Len", "len", c)
  1350. AssertFieldError(err, "Min", "min", c)
  1351. AssertFieldError(err, "Max", "max", c)
  1352. AssertFieldError(err, "MinMax", "min", c)
  1353. AssertFieldError(err, "OmitEmpty", "max", c)
  1354. }
  1355. func (ms *MySuite) TestStructSliceValidation(c *C) {
  1356. tSuccess := &TestSlice{
  1357. Required: []int{1},
  1358. Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
  1359. Min: []int{1, 2},
  1360. Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0},
  1361. MinMax: []int{1, 2, 3, 4, 5},
  1362. OmitEmpty: []int{},
  1363. }
  1364. err := myValidator.ValidateStruct(tSuccess)
  1365. c.Assert(err, IsNil)
  1366. tFail := &TestSlice{
  1367. Required: []int{},
  1368. Len: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
  1369. Min: []int{},
  1370. Max: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
  1371. MinMax: []int{},
  1372. OmitEmpty: []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1},
  1373. }
  1374. err = myValidator.ValidateStruct(tFail)
  1375. // Assert Top Level
  1376. c.Assert(err, NotNil)
  1377. c.Assert(err.Struct, Equals, "TestSlice")
  1378. c.Assert(len(err.Errors), Equals, 6)
  1379. c.Assert(len(err.StructErrors), Equals, 0)
  1380. // Assert Fields
  1381. AssertFieldError(err, "Required", "required", c)
  1382. AssertFieldError(err, "Len", "len", c)
  1383. AssertFieldError(err, "Min", "min", c)
  1384. AssertFieldError(err, "Max", "max", c)
  1385. AssertFieldError(err, "MinMax", "min", c)
  1386. AssertFieldError(err, "OmitEmpty", "max", c)
  1387. }
  1388. func (ms *MySuite) TestInvalidStruct(c *C) {
  1389. s := &SubTest{
  1390. Test: "1",
  1391. }
  1392. c.Assert(func() { myValidator.ValidateStruct(s.Test) }, PanicMatches, "interface passed for validation is not a struct")
  1393. }
  1394. func (ms *MySuite) TestInvalidField(c *C) {
  1395. s := &SubTest{
  1396. Test: "1",
  1397. }
  1398. c.Assert(func() { myValidator.ValidateFieldByTag(s, "required") }, PanicMatches, "Invalid field passed to ValidateFieldWithTag")
  1399. }
  1400. func (ms *MySuite) TestInvalidTagField(c *C) {
  1401. s := &SubTest{
  1402. Test: "1",
  1403. }
  1404. c.Assert(func() { myValidator.ValidateFieldByTag(s.Test, "") }, PanicMatches, fmt.Sprintf("Invalid validation tag on field %s", ""))
  1405. }
  1406. func (ms *MySuite) TestInvalidValidatorFunction(c *C) {
  1407. s := &SubTest{
  1408. Test: "1",
  1409. }
  1410. c.Assert(func() { myValidator.ValidateFieldByTag(s.Test, "zzxxBadFunction") }, PanicMatches, fmt.Sprintf("Undefined validation function on field %s", ""))
  1411. }