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