github.com/wangyougui/gf/v2@v2.6.5/util/gvalid/gvalid_z_unit_feature_rule_test.go (about) 1 // Copyright GoFrame Author(https://goframe.org). All Rights Reserved. 2 // 3 // This Source Code Form is subject to the terms of the MIT License. 4 // If a copy of the MIT was not distributed with this file, 5 // You can obtain one at https://github.com/wangyougui/gf. 6 7 package gvalid_test 8 9 import ( 10 "testing" 11 "time" 12 13 "github.com/wangyougui/gf/v2/errors/gcode" 14 "github.com/wangyougui/gf/v2/errors/gerror" 15 "github.com/wangyougui/gf/v2/frame/g" 16 "github.com/wangyougui/gf/v2/os/gctx" 17 "github.com/wangyougui/gf/v2/os/gtime" 18 "github.com/wangyougui/gf/v2/test/gtest" 19 "github.com/wangyougui/gf/v2/util/gtag" 20 ) 21 22 var ( 23 ctx = gctx.New() 24 ) 25 26 func Test_Check(t *testing.T) { 27 gtest.C(t, func(t *gtest.T) { 28 rule := "abc:6,16" 29 val1 := 0 30 val2 := 7 31 val3 := 20 32 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 33 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 34 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 35 t.Assert(err1, "InvalidRules: abc:6,16") 36 t.Assert(err2, "InvalidRules: abc:6,16") 37 t.Assert(err3, "InvalidRules: abc:6,16") 38 }) 39 } 40 41 func Test_Array(t *testing.T) { 42 gtest.C(t, func(t *gtest.T) { 43 err := g.Validator().Data("1").Rules("array").Run(ctx) 44 t.Assert(err, "The value `1` is not of valid array type") 45 }) 46 gtest.C(t, func(t *gtest.T) { 47 err := g.Validator().Data("").Rules("array").Run(ctx) 48 t.Assert(err, "The value `` is not of valid array type") 49 }) 50 gtest.C(t, func(t *gtest.T) { 51 err := g.Validator().Data("[1,2,3]").Rules("array").Run(ctx) 52 t.Assert(err, "") 53 }) 54 gtest.C(t, func(t *gtest.T) { 55 err := g.Validator().Data("[]").Rules("array").Run(ctx) 56 t.Assert(err, "") 57 }) 58 gtest.C(t, func(t *gtest.T) { 59 err := g.Validator().Data([]int{1, 2, 3}).Rules("array").Run(ctx) 60 t.Assert(err, "") 61 }) 62 gtest.C(t, func(t *gtest.T) { 63 err := g.Validator().Data([]int{}).Rules("array").Run(ctx) 64 t.Assert(err, "") 65 }) 66 } 67 68 func Test_Required(t *testing.T) { 69 if m := g.Validator().Data("1").Rules("required").Run(ctx); m != nil { 70 t.Error(m) 71 } 72 if m := g.Validator().Data("").Rules("required").Run(ctx); m == nil { 73 t.Error(m) 74 } 75 if m := g.Validator().Data("").Assoc(map[string]interface{}{"id": 1, "age": 19}).Rules("required-if: id,1,age,18").Run(ctx); m == nil { 76 t.Error("Required校验失败") 77 } 78 if m := g.Validator().Data("").Assoc(map[string]interface{}{"id": 2, "age": 19}).Rules("required-if: id,1,age,18").Run(ctx); m != nil { 79 t.Error("Required校验失败") 80 } 81 } 82 83 func Test_RequiredIf(t *testing.T) { 84 gtest.C(t, func(t *gtest.T) { 85 rule := "required-if:id,1,age,18" 86 t.AssertNE(g.Validator().Data("").Assoc(g.Map{"id": 1}).Rules(rule).Run(ctx), nil) 87 t.Assert(g.Validator().Data("").Assoc(g.Map{"id": 0}).Rules(rule).Run(ctx), nil) 88 t.AssertNE(g.Validator().Data("").Assoc(g.Map{"age": 18}).Rules(rule).Run(ctx), nil) 89 t.Assert(g.Validator().Data("").Assoc(g.Map{"age": 20}).Rules(rule).Run(ctx), nil) 90 }) 91 } 92 93 func Test_RequiredUnless(t *testing.T) { 94 gtest.C(t, func(t *gtest.T) { 95 rule := "required-unless:id,1,age,18" 96 t.Assert(g.Validator().Data("").Assoc(g.Map{"id": 1}).Rules(rule).Run(ctx), nil) 97 t.AssertNE(g.Validator().Data("").Assoc(g.Map{"id": 0}).Rules(rule).Run(ctx), nil) 98 t.Assert(g.Validator().Data("").Assoc(g.Map{"age": 18}).Rules(rule).Run(ctx), nil) 99 t.AssertNE(g.Validator().Data("").Assoc(g.Map{"age": 20}).Rules(rule).Run(ctx), nil) 100 }) 101 } 102 103 func Test_RequiredWith(t *testing.T) { 104 gtest.C(t, func(t *gtest.T) { 105 rule := "required-with:id,name" 106 val1 := "" 107 params1 := g.Map{ 108 "age": 18, 109 } 110 params2 := g.Map{ 111 "id": 100, 112 } 113 params3 := g.Map{ 114 "id": 100, 115 "name": "john", 116 } 117 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 118 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 119 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 120 t.Assert(err1, nil) 121 t.AssertNE(err2, nil) 122 t.AssertNE(err3, nil) 123 }) 124 // time.Time 125 gtest.C(t, func(t *gtest.T) { 126 rule := "required-with:id,time" 127 val1 := "" 128 params1 := g.Map{ 129 "age": 18, 130 } 131 params2 := g.Map{ 132 "id": 100, 133 } 134 params3 := g.Map{ 135 "time": time.Time{}, 136 } 137 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 138 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 139 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 140 t.Assert(err1, nil) 141 t.AssertNE(err2, nil) 142 t.Assert(err3, nil) 143 }) 144 gtest.C(t, func(t *gtest.T) { 145 rule := "required-with:id,time" 146 val1 := "" 147 params1 := g.Map{ 148 "age": 18, 149 } 150 params2 := g.Map{ 151 "id": 100, 152 } 153 params3 := g.Map{ 154 "time": time.Now(), 155 } 156 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 157 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 158 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 159 t.Assert(err1, nil) 160 t.AssertNE(err2, nil) 161 t.AssertNE(err3, nil) 162 }) 163 // gtime.Time 164 gtest.C(t, func(t *gtest.T) { 165 type UserApiSearch struct { 166 Uid int64 `json:"uid"` 167 Nickname string `json:"nickname" v:"required-with:Uid"` 168 StartTime *gtime.Time `json:"start_time" v:"required-with:EndTime"` 169 EndTime *gtime.Time `json:"end_time" v:"required-with:StartTime"` 170 } 171 data := UserApiSearch{ 172 StartTime: nil, 173 EndTime: nil, 174 } 175 t.Assert(g.Validator().Data(data).Run(ctx), nil) 176 }) 177 gtest.C(t, func(t *gtest.T) { 178 type UserApiSearch struct { 179 Uid int64 `json:"uid"` 180 Nickname string `json:"nickname" v:"required-with:Uid"` 181 StartTime *gtime.Time `json:"start_time" v:"required-with:EndTime"` 182 EndTime *gtime.Time `json:"end_time" v:"required-with:StartTime"` 183 } 184 data := UserApiSearch{ 185 StartTime: nil, 186 EndTime: gtime.Now(), 187 } 188 t.AssertNE(g.Validator().Data(data).Run(ctx), nil) 189 }) 190 } 191 192 func Test_RequiredWithAll(t *testing.T) { 193 gtest.C(t, func(t *gtest.T) { 194 rule := "required-with-all:id,name" 195 val1 := "" 196 params1 := g.Map{ 197 "age": 18, 198 } 199 params2 := g.Map{ 200 "id": 100, 201 } 202 params3 := g.Map{ 203 "id": 100, 204 "name": "john", 205 } 206 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 207 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 208 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 209 t.Assert(err1, nil) 210 t.Assert(err2, nil) 211 t.AssertNE(err3, nil) 212 }) 213 } 214 215 func Test_RequiredWithOut(t *testing.T) { 216 gtest.C(t, func(t *gtest.T) { 217 rule := "required-without:id,name" 218 val1 := "" 219 params1 := g.Map{ 220 "age": 18, 221 } 222 params2 := g.Map{ 223 "id": 100, 224 } 225 params3 := g.Map{ 226 "id": 100, 227 "name": "john", 228 } 229 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 230 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 231 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 232 t.AssertNE(err1, nil) 233 t.AssertNE(err2, nil) 234 t.Assert(err3, nil) 235 }) 236 } 237 238 func Test_RequiredWithOutAll(t *testing.T) { 239 gtest.C(t, func(t *gtest.T) { 240 rule := "required-without-all:id,name" 241 val1 := "" 242 params1 := g.Map{ 243 "age": 18, 244 } 245 params2 := g.Map{ 246 "id": 100, 247 } 248 params3 := g.Map{ 249 "id": 100, 250 "name": "john", 251 } 252 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 253 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 254 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 255 t.AssertNE(err1, nil) 256 t.Assert(err2, nil) 257 t.Assert(err3, nil) 258 }) 259 } 260 261 func Test_Date(t *testing.T) { 262 gtest.C(t, func(t *gtest.T) { 263 rule := "date" 264 val1 := "2010" 265 val2 := "201011" 266 val3 := "20101101" 267 val4 := "2010-11-01" 268 val5 := "2010.11.01" 269 val6 := "2010/11/01" 270 val7 := "2010=11=01" 271 val8 := "123" 272 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 273 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 274 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 275 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 276 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 277 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 278 err7 := g.Validator().Data(val7).Rules(rule).Run(ctx) 279 err8 := g.Validator().Data(val8).Rules(rule).Run(ctx) 280 t.AssertNE(err1, nil) 281 t.AssertNE(err2, nil) 282 t.Assert(err3, nil) 283 t.Assert(err4, nil) 284 t.Assert(err5, nil) 285 t.Assert(err6, nil) 286 t.AssertNE(err7, nil) 287 t.AssertNE(err8, nil) 288 }) 289 } 290 291 func Test_Datetime(t *testing.T) { 292 gtest.C(t, func(t *gtest.T) { 293 m := g.MapStrBool{ 294 "2010": false, 295 "2010.11": false, 296 "2010-11-01": false, 297 "2010-11-01 12:00": false, 298 "2010-11-01 12:00:00": true, 299 "2010.11.01 12:00:00": false, 300 } 301 for k, v := range m { 302 err := g.Validator().Rules(`datetime`).Data(k).Run(ctx) 303 if v { 304 t.AssertNil(err) 305 } else { 306 t.AssertNE(err, nil) 307 } 308 } 309 }) 310 } 311 312 func Test_DateFormat(t *testing.T) { 313 gtest.C(t, func(t *gtest.T) { 314 m := g.MapStrStr{ 315 "2010": "date-format:Y", 316 "201011": "date-format:Ym", 317 "2010.11": "date-format:Y.m", 318 "201011-01": "date-format:Ym-d", 319 "2010~11~01": "date-format:Y~m~d", 320 "2010-11~01": "date-format:Y-m~d", 321 "2023-09-10T19:46:31Z": "date-format:2006-01-02\\T15:04:05Z07:00", // RFC3339 322 } 323 for k, v := range m { 324 err := g.Validator().Data(k).Rules(v).Run(ctx) 325 t.AssertNil(err) 326 } 327 }) 328 gtest.C(t, func(t *gtest.T) { 329 errM := g.MapStrStr{ 330 "2010-11~01": "date-format:Y~m~d", 331 } 332 for k, v := range errM { 333 err := g.Validator().Data(k).Rules(v).Run(ctx) 334 t.AssertNE(err, nil) 335 } 336 }) 337 gtest.C(t, func(t *gtest.T) { 338 t1 := gtime.Now() 339 t2 := time.Time{} 340 err1 := g.Validator().Data(t1).Rules("date-format:Y").Run(ctx) 341 err2 := g.Validator().Data(t2).Rules("date-format:Y").Run(ctx) 342 t.Assert(err1, nil) 343 t.AssertNE(err2, nil) 344 }) 345 } 346 347 func Test_Email(t *testing.T) { 348 gtest.C(t, func(t *gtest.T) { 349 rule := "email" 350 value1 := "m@johngcn" 351 value2 := "m@www@johngcn" 352 value3 := "m-m_m@mail.johng.cn" 353 value4 := "m.m-m@johng.cn" 354 err1 := g.Validator().Data(value1).Rules(rule).Run(ctx) 355 err2 := g.Validator().Data(value2).Rules(rule).Run(ctx) 356 err3 := g.Validator().Data(value3).Rules(rule).Run(ctx) 357 err4 := g.Validator().Data(value4).Rules(rule).Run(ctx) 358 t.AssertNE(err1, nil) 359 t.AssertNE(err2, nil) 360 t.Assert(err3, nil) 361 t.Assert(err4, nil) 362 }) 363 } 364 365 func Test_Phone(t *testing.T) { 366 gtest.C(t, func(t *gtest.T) { 367 err1 := g.Validator().Data("1361990897").Rules("phone").Run(ctx) 368 err2 := g.Validator().Data("13619908979").Rules("phone").Run(ctx) 369 err3 := g.Validator().Data("16719908979").Rules("phone").Run(ctx) 370 err4 := g.Validator().Data("19719908989").Rules("phone").Run(ctx) 371 t.AssertNE(err1.String(), nil) 372 t.Assert(err2, nil) 373 t.Assert(err3, nil) 374 t.Assert(err4, nil) 375 }) 376 } 377 378 func Test_PhoneLoose(t *testing.T) { 379 gtest.C(t, func(t *gtest.T) { 380 err1 := g.Validator().Data("13333333333").Rules("phone-loose").Run(ctx) 381 err2 := g.Validator().Data("15555555555").Rules("phone-loose").Run(ctx) 382 err3 := g.Validator().Data("16666666666").Rules("phone-loose").Run(ctx) 383 err4 := g.Validator().Data("23333333333").Rules("phone-loose").Run(ctx) 384 err5 := g.Validator().Data("1333333333").Rules("phone-loose").Run(ctx) 385 err6 := g.Validator().Data("10333333333").Rules("phone-loose").Run(ctx) 386 t.Assert(err1, nil) 387 t.Assert(err2, nil) 388 t.Assert(err3, nil) 389 t.AssertNE(err4, nil) 390 t.AssertNE(err5, nil) 391 t.AssertNE(err6, nil) 392 }) 393 } 394 395 func Test_Telephone(t *testing.T) { 396 gtest.C(t, func(t *gtest.T) { 397 rule := "telephone" 398 val1 := "869265" 399 val2 := "028-869265" 400 val3 := "86292651" 401 val4 := "028-8692651" 402 val5 := "0830-8692651" 403 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 404 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 405 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 406 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 407 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 408 t.AssertNE(err1, nil) 409 t.AssertNE(err2, nil) 410 t.Assert(err3, nil) 411 t.Assert(err4, nil) 412 t.Assert(err5, nil) 413 }) 414 } 415 416 func Test_Passport(t *testing.T) { 417 gtest.C(t, func(t *gtest.T) { 418 rule := "passport" 419 val1 := "123456" 420 val2 := "a12345-6" 421 val3 := "aaaaa" 422 val4 := "aaaaaa" 423 val5 := "a123_456" 424 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 425 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 426 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 427 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 428 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 429 t.AssertNE(err1, nil) 430 t.AssertNE(err2, nil) 431 t.AssertNE(err3, nil) 432 t.Assert(err4, nil) 433 t.Assert(err5, nil) 434 }) 435 } 436 437 func Test_Password(t *testing.T) { 438 gtest.C(t, func(t *gtest.T) { 439 rule := "password" 440 val1 := "12345" 441 val2 := "aaaaa" 442 val3 := "a12345-6" 443 val4 := ">,/;'[09-" 444 val5 := "a123_456" 445 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 446 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 447 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 448 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 449 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 450 t.AssertNE(err1, nil) 451 t.AssertNE(err2, nil) 452 t.Assert(err3, nil) 453 t.Assert(err4, nil) 454 t.Assert(err5, nil) 455 }) 456 } 457 458 func Test_Password2(t *testing.T) { 459 gtest.C(t, func(t *gtest.T) { 460 rule := "password2" 461 val1 := "12345" 462 val2 := "Naaaa" 463 val3 := "a12345-6" 464 val4 := ">,/;'[09-" 465 val5 := "a123_456" 466 val6 := "Nant1986" 467 val7 := "Nant1986!" 468 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 469 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 470 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 471 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 472 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 473 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 474 err7 := g.Validator().Data(val7).Rules(rule).Run(ctx) 475 t.AssertNE(err1, nil) 476 t.AssertNE(err2, nil) 477 t.AssertNE(err3, nil) 478 t.AssertNE(err4, nil) 479 t.AssertNE(err5, nil) 480 t.Assert(err6, nil) 481 t.Assert(err7, nil) 482 }) 483 } 484 485 func Test_Password3(t *testing.T) { 486 gtest.C(t, func(t *gtest.T) { 487 rule := "password3" 488 val1 := "12345" 489 val2 := "Naaaa" 490 val3 := "a12345-6" 491 val4 := ">,/;'[09-" 492 val5 := "a123_456" 493 val6 := "Nant1986" 494 val7 := "Nant1986!" 495 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 496 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 497 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 498 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 499 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 500 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 501 err7 := g.Validator().Data(val7).Rules(rule).Run(ctx) 502 t.AssertNE(err1, nil) 503 t.AssertNE(err2, nil) 504 t.AssertNE(err3, nil) 505 t.AssertNE(err4, nil) 506 t.AssertNE(err5, nil) 507 t.AssertNE(err6, nil) 508 t.Assert(err7, nil) 509 }) 510 } 511 512 func Test_Postcode(t *testing.T) { 513 gtest.C(t, func(t *gtest.T) { 514 rule := "postcode" 515 val1 := "12345" 516 val2 := "610036" 517 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 518 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 519 t.AssertNE(err1, nil) 520 t.Assert(err2, nil) 521 }) 522 } 523 524 func Test_ResidentId(t *testing.T) { 525 gtest.C(t, func(t *gtest.T) { 526 rule := "resident-id" 527 val1 := "11111111111111" 528 val2 := "1111111111111111" 529 val3 := "311128500121201" 530 val4 := "510521198607185367" 531 val5 := "51052119860718536x" 532 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 533 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 534 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 535 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 536 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 537 t.AssertNE(err1, nil) 538 t.AssertNE(err2, nil) 539 t.AssertNE(err3, nil) 540 t.AssertNE(err4, nil) 541 t.Assert(err5, nil) 542 }) 543 } 544 545 func Test_BankCard(t *testing.T) { 546 gtest.C(t, func(t *gtest.T) { 547 rule := "bank-card" 548 val1 := "6230514630000424470" 549 val2 := "6230514630000424473" 550 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 551 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 552 t.AssertNE(err1, nil) 553 t.Assert(err2, nil) 554 }) 555 } 556 557 func Test_QQ(t *testing.T) { 558 gtest.C(t, func(t *gtest.T) { 559 rule := "qq" 560 val1 := "100" 561 val2 := "1" 562 val3 := "10000" 563 val4 := "38996181" 564 val5 := "389961817" 565 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 566 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 567 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 568 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 569 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 570 t.AssertNE(err1, nil) 571 t.AssertNE(err2, nil) 572 t.Assert(err3, nil) 573 t.Assert(err4, nil) 574 t.Assert(err5, nil) 575 }) 576 } 577 578 func Test_Ip(t *testing.T) { 579 if m := g.Validator().Data("10.0.0.1").Rules("ip").Run(ctx); m != nil { 580 t.Error(m) 581 } 582 if m := g.Validator().Data("10.0.0.1").Rules("ipv4").Run(ctx); m != nil { 583 t.Error(m) 584 } 585 if m := g.Validator().Data("0.0.0.0").Rules("ipv4").Run(ctx); m != nil { 586 t.Error(m) 587 } 588 if m := g.Validator().Data("1920.0.0.0").Rules("ipv4").Run(ctx); m == nil { 589 t.Error("ipv4校验失败") 590 } 591 if m := g.Validator().Data("1920.0.0.0").Rules("ip").Run(ctx); m == nil { 592 t.Error("ipv4校验失败") 593 } 594 if m := g.Validator().Data("fe80::5484:7aff:fefe:9799").Rules("ipv6").Run(ctx); m != nil { 595 t.Error(m) 596 } 597 if m := g.Validator().Data("fe80::5484:7aff:fefe:9799123").Rules("ipv6").Run(ctx); m == nil { 598 t.Error(m) 599 } 600 if m := g.Validator().Data("fe80::5484:7aff:fefe:9799").Rules("ip").Run(ctx); m != nil { 601 t.Error(m) 602 } 603 if m := g.Validator().Data("fe80::5484:7aff:fefe:9799123").Rules("ip").Run(ctx); m == nil { 604 t.Error(m) 605 } 606 } 607 608 func Test_IPv4(t *testing.T) { 609 gtest.C(t, func(t *gtest.T) { 610 rule := "ipv4" 611 val1 := "0.0.0" 612 val2 := "0.0.0.0" 613 val3 := "1.1.1.1" 614 val4 := "255.255.255.0" 615 val5 := "127.0.0.1" 616 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 617 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 618 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 619 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 620 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 621 t.AssertNE(err1, nil) 622 t.Assert(err2, nil) 623 t.Assert(err3, nil) 624 t.Assert(err4, nil) 625 t.Assert(err5, nil) 626 }) 627 } 628 629 func Test_IPv6(t *testing.T) { 630 gtest.C(t, func(t *gtest.T) { 631 rule := "ipv6" 632 val1 := "192.168.1.1" 633 val2 := "CDCD:910A:2222:5498:8475:1111:3900:2020" 634 val3 := "1030::C9B4:FF12:48AA:1A2B" 635 val4 := "2000:0:0:0:0:0:0:1" 636 val5 := "0000:0000:0000:0000:0000:ffff:c0a8:5909" 637 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 638 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 639 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 640 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 641 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 642 t.AssertNE(err1, nil) 643 t.Assert(err2, nil) 644 t.Assert(err3, nil) 645 t.Assert(err4, nil) 646 t.Assert(err5, nil) 647 }) 648 } 649 650 func Test_MAC(t *testing.T) { 651 gtest.C(t, func(t *gtest.T) { 652 rule := "mac" 653 val1 := "192.168.1.1" 654 val2 := "44-45-53-54-00-00" 655 val3 := "01:00:5e:00:00:00" 656 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 657 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 658 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 659 t.AssertNE(err1, nil) 660 t.Assert(err2, nil) 661 t.Assert(err3, nil) 662 }) 663 } 664 665 func Test_URL(t *testing.T) { 666 gtest.C(t, func(t *gtest.T) { 667 rule := "url" 668 val1 := "127.0.0.1" 669 val2 := "https://www.baidu.com" 670 val3 := "http://127.0.0.1" 671 val4 := "file:///tmp/test.txt" 672 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 673 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 674 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 675 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 676 t.AssertNE(err1, nil) 677 t.Assert(err2, nil) 678 t.Assert(err3, nil) 679 t.Assert(err4, nil) 680 }) 681 } 682 683 func Test_Domain(t *testing.T) { 684 gtest.C(t, func(t *gtest.T) { 685 m := g.MapStrBool{ 686 "localhost": false, 687 "baidu.com": true, 688 "www.baidu.com": true, 689 "jn.np": true, 690 "www.jn.np": true, 691 "w.www.jn.np": true, 692 "127.0.0.1": false, 693 "www.360.com": true, 694 "www.360": false, 695 "360": false, 696 "my-gf": false, 697 "my-gf.com": true, 698 "my-gf.360.com": true, 699 } 700 var err error 701 for k, v := range m { 702 err = g.Validator().Data(k).Rules("domain").Run(ctx) 703 if v { 704 // fmt.Println(k) 705 t.AssertNil(err) 706 } else { 707 // fmt.Println(k) 708 t.AssertNE(err, nil) 709 } 710 } 711 }) 712 } 713 714 func Test_Length(t *testing.T) { 715 rule := "length:6,16" 716 if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m != nil { 717 t.Error(m) 718 } 719 if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m == nil { 720 t.Error("长度校验失败") 721 } 722 } 723 724 func Test_MinLength(t *testing.T) { 725 rule := "min-length:6" 726 msgs := map[string]string{ 727 "min-length": "地址长度至少为{min}位", 728 } 729 if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m != nil { 730 t.Error(m) 731 } 732 if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m == nil { 733 t.Error("长度校验失败") 734 } 735 if m := g.Validator().Data("12345").Rules(rule).Messages(msgs).Run(ctx); m == nil { 736 t.Error("长度校验失败") 737 } 738 739 rule2 := "min-length:abc" 740 if m := g.Validator().Data("123456").Rules(rule2).Run(ctx); m == nil { 741 t.Error("长度校验失败") 742 } 743 } 744 745 func Test_MaxLength(t *testing.T) { 746 rule := "max-length:6" 747 msgs := map[string]string{ 748 "max-length": "地址长度至大为{max}位", 749 } 750 if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m != nil { 751 t.Error(m) 752 } 753 if m := g.Validator().Data("1234567").Rules(rule).Run(ctx); m == nil { 754 t.Error("长度校验失败") 755 } 756 if m := g.Validator().Data("1234567").Rules(rule).Messages(msgs).Run(ctx); m == nil { 757 t.Error("长度校验失败") 758 } 759 760 rule2 := "max-length:abc" 761 if m := g.Validator().Data("123456").Rules(rule2).Run(ctx); m == nil { 762 t.Error("长度校验失败") 763 } 764 } 765 766 func Test_Size(t *testing.T) { 767 rule := "size:5" 768 if m := g.Validator().Data("12345").Rules(rule).Run(ctx); m != nil { 769 t.Error(m) 770 } 771 if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m == nil { 772 t.Error("长度校验失败") 773 } 774 } 775 776 func Test_Between(t *testing.T) { 777 rule := "between:6.01, 10.01" 778 if m := g.Validator().Data(10).Rules(rule).Run(ctx); m != nil { 779 t.Error(m) 780 } 781 if m := g.Validator().Data(10.02).Rules(rule).Run(ctx); m == nil { 782 t.Error("大小范围校验失败") 783 } 784 if m := g.Validator().Data("a").Rules(rule).Run(ctx); m == nil { 785 t.Error("大小范围校验失败") 786 } 787 } 788 789 func Test_Min(t *testing.T) { 790 gtest.C(t, func(t *gtest.T) { 791 rule := "min:100" 792 val1 := "1" 793 val2 := "99" 794 val3 := "100" 795 val4 := "1000" 796 val5 := "a" 797 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 798 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 799 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 800 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 801 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 802 t.AssertNE(err1, nil) 803 t.AssertNE(err2, nil) 804 t.Assert(err3, nil) 805 t.Assert(err4, nil) 806 t.AssertNE(err5, nil) 807 808 rule2 := "min:a" 809 err6 := g.Validator().Data(val1).Rules(rule2).Run(ctx) 810 t.AssertNE(err6, nil) 811 }) 812 } 813 814 func Test_Max(t *testing.T) { 815 gtest.C(t, func(t *gtest.T) { 816 rule := "max:100" 817 val1 := "1" 818 val2 := "99" 819 val3 := "100" 820 val4 := "1000" 821 val5 := "a" 822 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 823 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 824 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 825 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 826 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 827 t.Assert(err1, nil) 828 t.Assert(err2, nil) 829 t.Assert(err3, nil) 830 t.AssertNE(err4, nil) 831 t.AssertNE(err5, nil) 832 833 rule2 := "max:a" 834 err6 := g.Validator().Data(val1).Rules(rule2).Run(ctx) 835 t.AssertNE(err6, nil) 836 }) 837 } 838 839 func Test_Json(t *testing.T) { 840 gtest.C(t, func(t *gtest.T) { 841 rule := "json" 842 val1 := "" 843 val2 := "." 844 val3 := "{}" 845 val4 := "[]" 846 val5 := "[1,2,3,4]" 847 val6 := `{"list":[1,2,3,4]}` 848 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 849 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 850 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 851 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 852 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 853 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 854 t.AssertNE(err1, nil) 855 t.AssertNE(err2, nil) 856 t.Assert(err3, nil) 857 t.Assert(err4, nil) 858 t.Assert(err5, nil) 859 t.Assert(err6, nil) 860 }) 861 } 862 863 func Test_Integer(t *testing.T) { 864 gtest.C(t, func(t *gtest.T) { 865 rule := "integer" 866 val1 := "" 867 val2 := "1.0" 868 val3 := "001" 869 val4 := "1" 870 val5 := "100" 871 val6 := `999999999` 872 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 873 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 874 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 875 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 876 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 877 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 878 t.AssertNE(err1, nil) 879 t.AssertNE(err2, nil) 880 t.Assert(err3, nil) 881 t.Assert(err4, nil) 882 t.Assert(err5, nil) 883 t.Assert(err6, nil) 884 }) 885 } 886 887 func Test_Float(t *testing.T) { 888 gtest.C(t, func(t *gtest.T) { 889 rule := "float" 890 val1 := "" 891 val2 := "a" 892 val3 := "1" 893 val4 := "1.0" 894 val5 := "1.1" 895 val6 := `0.1` 896 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 897 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 898 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 899 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 900 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 901 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 902 t.AssertNE(err1, nil) 903 t.AssertNE(err2, nil) 904 t.Assert(err3, nil) 905 t.Assert(err4, nil) 906 t.Assert(err5, nil) 907 t.Assert(err6, nil) 908 }) 909 } 910 911 func Test_Boolean(t *testing.T) { 912 gtest.C(t, func(t *gtest.T) { 913 rule := "boolean" 914 val1 := "a" 915 val2 := "-" 916 val3 := "" 917 val4 := "1" 918 val5 := "true" 919 val6 := `off` 920 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 921 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 922 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 923 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 924 err5 := g.Validator().Data(val5).Rules(rule).Run(ctx) 925 err6 := g.Validator().Data(val6).Rules(rule).Run(ctx) 926 t.AssertNE(err1, nil) 927 t.AssertNE(err2, nil) 928 t.Assert(err3, nil) 929 t.Assert(err4, nil) 930 t.Assert(err5, nil) 931 t.Assert(err6, nil) 932 }) 933 } 934 935 func Test_Same(t *testing.T) { 936 gtest.C(t, func(t *gtest.T) { 937 rule := "same:id" 938 val1 := "100" 939 params1 := g.Map{ 940 "age": 18, 941 } 942 params2 := g.Map{ 943 "id": 100, 944 } 945 params3 := g.Map{ 946 "id": 100, 947 "name": "john", 948 } 949 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 950 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 951 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 952 t.AssertNE(err1, nil) 953 t.Assert(err2, nil) 954 t.Assert(err3, nil) 955 }) 956 } 957 958 func Test_Different(t *testing.T) { 959 gtest.C(t, func(t *gtest.T) { 960 rule := "different:id" 961 val1 := "100" 962 params1 := g.Map{ 963 "age": 18, 964 } 965 params2 := g.Map{ 966 "id": 100, 967 } 968 params3 := g.Map{ 969 "id": 100, 970 "name": "john", 971 } 972 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 973 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 974 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 975 t.Assert(err1, nil) 976 t.AssertNE(err2, nil) 977 t.AssertNE(err3, nil) 978 }) 979 } 980 981 func Test_EQ(t *testing.T) { 982 gtest.C(t, func(t *gtest.T) { 983 rule := "eq:id" 984 val1 := "100" 985 params1 := g.Map{ 986 "age": 18, 987 } 988 params2 := g.Map{ 989 "id": 100, 990 } 991 params3 := g.Map{ 992 "id": 100, 993 "name": "john", 994 } 995 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 996 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 997 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 998 t.AssertNE(err1, nil) 999 t.Assert(err2, nil) 1000 t.Assert(err3, nil) 1001 }) 1002 } 1003 1004 func Test_Not_EQ(t *testing.T) { 1005 gtest.C(t, func(t *gtest.T) { 1006 rule := "not-eq:id" 1007 val1 := "100" 1008 params1 := g.Map{ 1009 "age": 18, 1010 } 1011 params2 := g.Map{ 1012 "id": 100, 1013 } 1014 params3 := g.Map{ 1015 "id": 100, 1016 "name": "john", 1017 } 1018 err1 := g.Validator().Data(val1).Assoc(params1).Rules(rule).Run(ctx) 1019 err2 := g.Validator().Data(val1).Assoc(params2).Rules(rule).Run(ctx) 1020 err3 := g.Validator().Data(val1).Assoc(params3).Rules(rule).Run(ctx) 1021 t.Assert(err1, nil) 1022 t.AssertNE(err2, nil) 1023 t.AssertNE(err3, nil) 1024 }) 1025 } 1026 1027 func Test_In(t *testing.T) { 1028 gtest.C(t, func(t *gtest.T) { 1029 rule := "in:100,200" 1030 val1 := "" 1031 val2 := "1" 1032 val3 := "100" 1033 val4 := "200" 1034 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 1035 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 1036 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 1037 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 1038 t.AssertNE(err1, nil) 1039 t.AssertNE(err2, nil) 1040 t.Assert(err3, nil) 1041 t.Assert(err4, nil) 1042 }) 1043 } 1044 1045 func Test_NotIn(t *testing.T) { 1046 gtest.C(t, func(t *gtest.T) { 1047 rule := "not-in:100" 1048 val1 := "" 1049 val2 := "1" 1050 val3 := "100" 1051 val4 := "200" 1052 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 1053 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 1054 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 1055 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 1056 t.Assert(err1, nil) 1057 t.Assert(err2, nil) 1058 t.AssertNE(err3, nil) 1059 t.Assert(err4, nil) 1060 }) 1061 gtest.C(t, func(t *gtest.T) { 1062 rule := "not-in:100,200" 1063 val1 := "" 1064 val2 := "1" 1065 val3 := "100" 1066 val4 := "200" 1067 err1 := g.Validator().Data(val1).Rules(rule).Run(ctx) 1068 err2 := g.Validator().Data(val2).Rules(rule).Run(ctx) 1069 err3 := g.Validator().Data(val3).Rules(rule).Run(ctx) 1070 err4 := g.Validator().Data(val4).Rules(rule).Run(ctx) 1071 t.Assert(err1, nil) 1072 t.Assert(err2, nil) 1073 t.AssertNE(err3, nil) 1074 t.AssertNE(err4, nil) 1075 }) 1076 } 1077 1078 func Test_Regex1(t *testing.T) { 1079 rule := `regex:\d{6}|\D{6}|length:6,16` 1080 if m := g.Validator().Data("123456").Rules(rule).Run(ctx); m != nil { 1081 t.Error(m) 1082 } 1083 if m := g.Validator().Data("abcde6").Rules(rule).Run(ctx); m == nil { 1084 t.Error("校验失败") 1085 } 1086 } 1087 1088 func Test_Regex2(t *testing.T) { 1089 gtest.C(t, func(t *gtest.T) { 1090 rule := `required|min-length:6|regex:^data:image\/(jpeg|png);base64,` 1091 str1 := "" 1092 str2 := "data" 1093 str3 := "data:image/jpeg;base64,/9jrbattq22r" 1094 err1 := g.Validator().Data(str1).Rules(rule).Run(ctx) 1095 err2 := g.Validator().Data(str2).Rules(rule).Run(ctx) 1096 err3 := g.Validator().Data(str3).Rules(rule).Run(ctx) 1097 t.AssertNE(err1, nil) 1098 t.AssertNE(err2, nil) 1099 t.Assert(err3, nil) 1100 1101 t.AssertNE(err1.Map()["required"], nil) 1102 t.AssertNE(err2.Map()["min-length"], nil) 1103 }) 1104 } 1105 1106 func Test_Not_Regex(t *testing.T) { 1107 rule := `not-regex:\d{6}|\D{6}|length:6,16` 1108 gtest.C(t, func(t *gtest.T) { 1109 err := g.Validator().Data("123456").Rules(rule).Run(ctx) 1110 t.Assert(err, "The value `123456` should not be in regex of: \\d{6}|\\D{6}") 1111 }) 1112 gtest.C(t, func(t *gtest.T) { 1113 err := g.Validator().Data("abcde6").Rules(rule).Run(ctx) 1114 t.AssertNil(err) 1115 }) 1116 } 1117 1118 // issue: https://github.com/wangyougui/gf/issues/1077 1119 func Test_InternalError_String(t *testing.T) { 1120 gtest.C(t, func(t *gtest.T) { 1121 type a struct { 1122 Name string `v:"hh"` 1123 } 1124 aa := a{Name: "2"} 1125 err := g.Validator().Data(&aa).Run(ctx) 1126 1127 t.Assert(err.String(), "InvalidRules: hh") 1128 t.Assert(err.Strings(), g.Slice{"InvalidRules: hh"}) 1129 t.Assert(err.FirstError(), "InvalidRules: hh") 1130 t.Assert(gerror.Current(err), "InvalidRules: hh") 1131 }) 1132 } 1133 1134 func Test_Code(t *testing.T) { 1135 gtest.C(t, func(t *gtest.T) { 1136 err := g.Validator().Rules("required").Data("").Run(ctx) 1137 t.AssertNE(err, nil) 1138 t.Assert(gerror.Code(err), gcode.CodeValidationFailed) 1139 }) 1140 1141 gtest.C(t, func(t *gtest.T) { 1142 err := g.Validator().Rules("none-exist-rule").Data("").Run(ctx) 1143 t.AssertNE(err, nil) 1144 t.Assert(gerror.Code(err), gcode.CodeInternalError) 1145 }) 1146 } 1147 1148 func Test_Bail(t *testing.T) { 1149 // check value with no bail 1150 gtest.C(t, func(t *gtest.T) { 1151 err := g.Validator(). 1152 Rules("required|min:1|between:1,100"). 1153 Messages("|min number is 1|size is between 1 and 100"). 1154 Data(-1).Run(ctx) 1155 t.AssertNE(err, nil) 1156 t.Assert(err.Error(), "min number is 1; size is between 1 and 100") 1157 }) 1158 1159 // check value with bail 1160 gtest.C(t, func(t *gtest.T) { 1161 err := g.Validator(). 1162 Rules("bail|required|min:1|between:1,100"). 1163 Messages("||min number is 1|size is between 1 and 100"). 1164 Data(-1).Run(ctx) 1165 t.AssertNE(err, nil) 1166 t.Assert(err.Error(), "min number is 1") 1167 }) 1168 1169 // struct with no bail 1170 gtest.C(t, func(t *gtest.T) { 1171 type Params struct { 1172 Page int `v:"required|min:1"` 1173 Size int `v:"required|min:1|between:1,100 # |min number is 1|size is between 1 and 100"` 1174 } 1175 obj := &Params{ 1176 Page: 1, 1177 Size: -1, 1178 } 1179 err := g.Validator().Data(obj).Run(ctx) 1180 t.AssertNE(err, nil) 1181 t.Assert(err.Error(), "min number is 1; size is between 1 and 100") 1182 }) 1183 // struct with bail 1184 gtest.C(t, func(t *gtest.T) { 1185 type Params struct { 1186 Page int `v:"required|min:1"` 1187 Size int `v:"bail|required|min:1|between:1,100 # ||min number is 1|size is between 1 and 100"` 1188 } 1189 obj := &Params{ 1190 Page: 1, 1191 Size: -1, 1192 } 1193 err := g.Validator().Data(obj).Run(ctx) 1194 t.AssertNE(err, nil) 1195 t.Assert(err.Error(), "min number is 1") 1196 }) 1197 } 1198 1199 func Test_After(t *testing.T) { 1200 gtest.C(t, func(t *gtest.T) { 1201 type Params struct { 1202 T1 string `v:"after:T2"` 1203 T2 string 1204 } 1205 obj := &Params{ 1206 T1: "2022-09-02", 1207 T2: "2022-09-01", 1208 } 1209 err := g.Validator().Data(obj).Run(ctx) 1210 t.AssertNil(err) 1211 }) 1212 gtest.C(t, func(t *gtest.T) { 1213 type Params struct { 1214 T1 string `v:"after:T2"` 1215 T2 string 1216 } 1217 obj := &Params{ 1218 T1: "2022-09-01", 1219 T2: "2022-09-02", 1220 } 1221 err := g.Validator().Data(obj).Run(ctx) 1222 t.Assert(err, "The T1 value `2022-09-01` must be after field T2 value `2022-09-02`") 1223 }) 1224 gtest.C(t, func(t *gtest.T) { 1225 type Params struct { 1226 T1 *gtime.Time `v:"after:T2"` 1227 T2 *gtime.Time 1228 } 1229 obj := &Params{ 1230 T1: gtime.New("2022-09-02"), 1231 T2: gtime.New("2022-09-01"), 1232 } 1233 err := g.Validator().Data(obj).Run(ctx) 1234 t.AssertNil(err) 1235 }) 1236 gtest.C(t, func(t *gtest.T) { 1237 type Params struct { 1238 T1 *gtime.Time `v:"after:T2"` 1239 T2 *gtime.Time 1240 } 1241 obj := &Params{ 1242 T1: gtime.New("2022-09-01"), 1243 T2: gtime.New("2022-09-02"), 1244 } 1245 err := g.Validator().Data(obj).Run(ctx) 1246 t.Assert(err, "The T1 value `2022-09-01 00:00:00` must be after field T2 value `2022-09-02 00:00:00`") 1247 }) 1248 } 1249 1250 func Test_After_Equal(t *testing.T) { 1251 gtest.C(t, func(t *gtest.T) { 1252 type Params struct { 1253 T1 string `v:"after-equal:T2"` 1254 T2 string 1255 } 1256 obj := &Params{ 1257 T1: "2022-09-02", 1258 T2: "2022-09-01", 1259 } 1260 err := g.Validator().Data(obj).Run(ctx) 1261 t.AssertNil(err) 1262 }) 1263 gtest.C(t, func(t *gtest.T) { 1264 type Params struct { 1265 T1 string `v:"after-equal:T2"` 1266 T2 string 1267 } 1268 obj := &Params{ 1269 T1: "2022-09-01", 1270 T2: "2022-09-02", 1271 } 1272 err := g.Validator().Data(obj).Run(ctx) 1273 t.Assert(err, "The T1 value `2022-09-01` must be after or equal to field T2 value `2022-09-02`") 1274 }) 1275 gtest.C(t, func(t *gtest.T) { 1276 type Params struct { 1277 T1 *gtime.Time `v:"after-equal:T2"` 1278 T2 *gtime.Time 1279 } 1280 obj := &Params{ 1281 T1: gtime.New("2022-09-02"), 1282 T2: gtime.New("2022-09-01"), 1283 } 1284 err := g.Validator().Data(obj).Run(ctx) 1285 t.AssertNil(err) 1286 }) 1287 gtest.C(t, func(t *gtest.T) { 1288 type Params struct { 1289 T1 *gtime.Time `v:"after-equal:T2"` 1290 T2 *gtime.Time 1291 } 1292 obj := &Params{ 1293 T1: gtime.New("2022-09-01"), 1294 T2: gtime.New("2022-09-01"), 1295 } 1296 err := g.Validator().Data(obj).Run(ctx) 1297 t.AssertNil(err) 1298 }) 1299 gtest.C(t, func(t *gtest.T) { 1300 type Params struct { 1301 T1 *gtime.Time `v:"after-equal:T2"` 1302 T2 *gtime.Time 1303 } 1304 obj := &Params{ 1305 T1: gtime.New("2022-09-01"), 1306 T2: gtime.New("2022-09-02"), 1307 } 1308 err := g.Validator().Data(obj).Run(ctx) 1309 t.Assert(err, "The T1 value `2022-09-01 00:00:00` must be after or equal to field T2 value `2022-09-02 00:00:00`") 1310 }) 1311 } 1312 1313 func Test_Before(t *testing.T) { 1314 gtest.C(t, func(t *gtest.T) { 1315 type Params struct { 1316 T1 string `v:"before:T2"` 1317 T2 string 1318 } 1319 obj := &Params{ 1320 T1: "2022-09-01", 1321 T2: "2022-09-02", 1322 } 1323 err := g.Validator().Data(obj).Run(ctx) 1324 t.AssertNil(err) 1325 }) 1326 gtest.C(t, func(t *gtest.T) { 1327 type Params struct { 1328 T1 string `v:"before:T2"` 1329 T2 string 1330 } 1331 obj := &Params{ 1332 T1: "2022-09-02", 1333 T2: "2022-09-01", 1334 } 1335 err := g.Validator().Data(obj).Run(ctx) 1336 t.Assert(err, "The T1 value `2022-09-02` must be before field T2 value `2022-09-01`") 1337 }) 1338 gtest.C(t, func(t *gtest.T) { 1339 type Params struct { 1340 T1 *gtime.Time `v:"before:T2"` 1341 T2 *gtime.Time 1342 } 1343 obj := &Params{ 1344 T1: gtime.New("2022-09-01"), 1345 T2: gtime.New("2022-09-02"), 1346 } 1347 err := g.Validator().Data(obj).Run(ctx) 1348 t.AssertNil(err) 1349 }) 1350 gtest.C(t, func(t *gtest.T) { 1351 type Params struct { 1352 T1 *gtime.Time `v:"before:T2"` 1353 T2 *gtime.Time 1354 } 1355 obj := &Params{ 1356 T1: gtime.New("2022-09-02"), 1357 T2: gtime.New("2022-09-01"), 1358 } 1359 err := g.Validator().Data(obj).Run(ctx) 1360 t.Assert(err, "The T1 value `2022-09-02 00:00:00` must be before field T2 value `2022-09-01 00:00:00`") 1361 }) 1362 } 1363 1364 func Test_Before_Equal(t *testing.T) { 1365 gtest.C(t, func(t *gtest.T) { 1366 type Params struct { 1367 T1 string `v:"before-equal:T2"` 1368 T2 string 1369 } 1370 obj := &Params{ 1371 T1: "2022-09-01", 1372 T2: "2022-09-02", 1373 } 1374 err := g.Validator().Data(obj).Run(ctx) 1375 t.AssertNil(err) 1376 }) 1377 gtest.C(t, func(t *gtest.T) { 1378 type Params struct { 1379 T1 string `v:"before-equal:T2"` 1380 T2 string 1381 } 1382 obj := &Params{ 1383 T1: "2022-09-02", 1384 T2: "2022-09-01", 1385 } 1386 err := g.Validator().Data(obj).Run(ctx) 1387 t.Assert(err, "The T1 value `2022-09-02` must be before or equal to field T2") 1388 }) 1389 gtest.C(t, func(t *gtest.T) { 1390 type Params struct { 1391 T1 *gtime.Time `v:"before-equal:T2"` 1392 T2 *gtime.Time 1393 } 1394 obj := &Params{ 1395 T1: gtime.New("2022-09-01"), 1396 T2: gtime.New("2022-09-02"), 1397 } 1398 err := g.Validator().Data(obj).Run(ctx) 1399 t.AssertNil(err) 1400 }) 1401 gtest.C(t, func(t *gtest.T) { 1402 type Params struct { 1403 T1 *gtime.Time `v:"before-equal:T2"` 1404 T2 *gtime.Time 1405 } 1406 obj := &Params{ 1407 T1: gtime.New("2022-09-01"), 1408 T2: gtime.New("2022-09-01"), 1409 } 1410 err := g.Validator().Data(obj).Run(ctx) 1411 t.AssertNil(err) 1412 }) 1413 gtest.C(t, func(t *gtest.T) { 1414 type Params struct { 1415 T1 *gtime.Time `v:"before-equal:T2"` 1416 T2 *gtime.Time 1417 } 1418 obj := &Params{ 1419 T1: gtime.New("2022-09-02"), 1420 T2: gtime.New("2022-09-01"), 1421 } 1422 err := g.Validator().Data(obj).Run(ctx) 1423 t.Assert(err, "The T1 value `2022-09-02 00:00:00` must be before or equal to field T2") 1424 }) 1425 } 1426 1427 func Test_GT(t *testing.T) { 1428 gtest.C(t, func(t *gtest.T) { 1429 type Params struct { 1430 V1 string `v:"gt:V2"` 1431 V2 string 1432 } 1433 obj := &Params{ 1434 V1: "1.2", 1435 V2: "1.1", 1436 } 1437 err := g.Validator().Data(obj).Run(ctx) 1438 t.AssertNil(err) 1439 }) 1440 gtest.C(t, func(t *gtest.T) { 1441 type Params struct { 1442 V1 string `v:"gt:V2"` 1443 V2 string 1444 } 1445 obj := &Params{ 1446 V1: "1.1", 1447 V2: "1.2", 1448 } 1449 err := g.Validator().Data(obj).Run(ctx) 1450 t.Assert(err, "The V1 value `1.1` must be greater than field V2 value `1.2`") 1451 }) 1452 } 1453 1454 func Test_GTE(t *testing.T) { 1455 gtest.C(t, func(t *gtest.T) { 1456 type Params struct { 1457 V1 string `v:"gte:V2"` 1458 V2 string 1459 } 1460 obj := &Params{ 1461 V1: "1.2", 1462 V2: "1.1", 1463 } 1464 err := g.Validator().Data(obj).Run(ctx) 1465 t.AssertNil(err) 1466 }) 1467 gtest.C(t, func(t *gtest.T) { 1468 type Params struct { 1469 V1 string `v:"gte:V2"` 1470 V2 string 1471 } 1472 obj := &Params{ 1473 V1: "1.1", 1474 V2: "1.2", 1475 } 1476 err := g.Validator().Data(obj).Run(ctx) 1477 t.Assert(err, "The V1 value `1.1` must be greater than or equal to field V2 value `1.2`") 1478 }) 1479 gtest.C(t, func(t *gtest.T) { 1480 type Params struct { 1481 V1 string `v:"gte:V2"` 1482 V2 string 1483 } 1484 obj := &Params{ 1485 V1: "1.1", 1486 V2: "1.1", 1487 } 1488 err := g.Validator().Data(obj).Run(ctx) 1489 t.AssertNil(err) 1490 }) 1491 } 1492 1493 func Test_LT(t *testing.T) { 1494 gtest.C(t, func(t *gtest.T) { 1495 type Params struct { 1496 V1 string `v:"lt:V2"` 1497 V2 string 1498 } 1499 obj := &Params{ 1500 V1: "1.1", 1501 V2: "1.2", 1502 } 1503 err := g.Validator().Data(obj).Run(ctx) 1504 t.AssertNil(err) 1505 }) 1506 gtest.C(t, func(t *gtest.T) { 1507 type Params struct { 1508 V1 string `v:"lt:V2"` 1509 V2 string 1510 } 1511 obj := &Params{ 1512 V1: "1.2", 1513 V2: "1.1", 1514 } 1515 err := g.Validator().Data(obj).Run(ctx) 1516 t.Assert(err, "The V1 value `1.2` must be lesser than field V2 value `1.1`") 1517 }) 1518 } 1519 1520 func Test_LTE(t *testing.T) { 1521 gtest.C(t, func(t *gtest.T) { 1522 type Params struct { 1523 V1 string `v:"lte:V2"` 1524 V2 string 1525 } 1526 obj := &Params{ 1527 V1: "1.1", 1528 V2: "1.2", 1529 } 1530 err := g.Validator().Data(obj).Run(ctx) 1531 t.AssertNil(err) 1532 }) 1533 gtest.C(t, func(t *gtest.T) { 1534 type Params struct { 1535 V1 string `v:"lte:V2"` 1536 V2 string 1537 } 1538 obj := &Params{ 1539 V1: "1.2", 1540 V2: "1.1", 1541 } 1542 err := g.Validator().Data(obj).Run(ctx) 1543 t.Assert(err, "The V1 value `1.2` must be lesser than or equal to field V2 value `1.1`") 1544 }) 1545 gtest.C(t, func(t *gtest.T) { 1546 type Params struct { 1547 V1 string `v:"lte:V2"` 1548 V2 string 1549 } 1550 obj := &Params{ 1551 V1: "1.1", 1552 V2: "1.1", 1553 } 1554 err := g.Validator().Data(obj).Run(ctx) 1555 t.AssertNil(err) 1556 }) 1557 } 1558 1559 func Test_Enums(t *testing.T) { 1560 gtest.C(t, func(t *gtest.T) { 1561 type EnumsTest string 1562 const ( 1563 EnumsTestA EnumsTest = "a" 1564 EnumsTestB EnumsTest = "b" 1565 ) 1566 type Params struct { 1567 Id int 1568 Enums EnumsTest `v:"enums"` 1569 } 1570 1571 oldEnumsJson, err := gtag.GetGlobalEnums() 1572 t.AssertNil(err) 1573 defer t.AssertNil(gtag.SetGlobalEnums(oldEnumsJson)) 1574 1575 err = gtag.SetGlobalEnums(`{"github.com/wangyougui/gf/v2/util/gvalid_test.EnumsTest": ["a","b"]}`) 1576 t.AssertNil(err) 1577 1578 err = g.Validator().Data(&Params{ 1579 Id: 1, 1580 Enums: EnumsTestB, 1581 }).Run(ctx) 1582 t.AssertNil(err) 1583 1584 err = g.Validator().Data(&Params{ 1585 Id: 1, 1586 Enums: "c", 1587 }).Run(ctx) 1588 t.Assert(err, "The Enums value `c` should be in enums of: [\"a\",\"b\"]") 1589 }) 1590 }