1package pt_BR 2 3import ( 4 "testing" 5 "time" 6 7 brazilian_portuguese "github.com/go-playground/locales/pt_BR" 8 ut "github.com/go-playground/universal-translator" 9 "github.com/go-playground/validator/v10" 10 . "github.com/go-playground/assert/v2" 11) 12 13func TestTranslations(t *testing.T) { 14 15 ptbr := brazilian_portuguese.New() 16 uni := ut.New(ptbr, ptbr) 17 trans, _ := uni.GetTranslator("pt_BR") 18 19 validate := validator.New() 20 21 err := RegisterDefaultTranslations(validate, trans) 22 Equal(t, err, nil) 23 24 type Inner struct { 25 EqCSFieldString string 26 NeCSFieldString string 27 GtCSFieldString string 28 GteCSFieldString string 29 LtCSFieldString string 30 LteCSFieldString string 31 } 32 33 type Test struct { 34 Inner Inner 35 RequiredString string `validate:"required"` 36 RequiredNumber int `validate:"required"` 37 RequiredMultiple []string `validate:"required"` 38 LenString string `validate:"len=1"` 39 LenNumber float64 `validate:"len=1113.00"` 40 LenMultiple []string `validate:"len=7"` 41 MinString string `validate:"min=1"` 42 MinNumber float64 `validate:"min=1113.00"` 43 MinMultiple []string `validate:"min=7"` 44 MaxString string `validate:"max=3"` 45 MaxNumber float64 `validate:"max=1113.00"` 46 MaxMultiple []string `validate:"max=7"` 47 EqString string `validate:"eq=3"` 48 EqNumber float64 `validate:"eq=2.33"` 49 EqMultiple []string `validate:"eq=7"` 50 NeString string `validate:"ne="` 51 NeNumber float64 `validate:"ne=0.00"` 52 NeMultiple []string `validate:"ne=0"` 53 LtString string `validate:"lt=3"` 54 LtNumber float64 `validate:"lt=5.56"` 55 LtMultiple []string `validate:"lt=2"` 56 LtTime time.Time `validate:"lt"` 57 LteString string `validate:"lte=3"` 58 LteNumber float64 `validate:"lte=5.56"` 59 LteMultiple []string `validate:"lte=2"` 60 LteTime time.Time `validate:"lte"` 61 GtString string `validate:"gt=3"` 62 GtNumber float64 `validate:"gt=5.56"` 63 GtMultiple []string `validate:"gt=2"` 64 GtTime time.Time `validate:"gt"` 65 GteString string `validate:"gte=3"` 66 GteNumber float64 `validate:"gte=5.56"` 67 GteMultiple []string `validate:"gte=2"` 68 GteTime time.Time `validate:"gte"` 69 EqFieldString string `validate:"eqfield=MaxString"` 70 EqCSFieldString string `validate:"eqcsfield=Inner.EqCSFieldString"` 71 NeCSFieldString string `validate:"necsfield=Inner.NeCSFieldString"` 72 GtCSFieldString string `validate:"gtcsfield=Inner.GtCSFieldString"` 73 GteCSFieldString string `validate:"gtecsfield=Inner.GteCSFieldString"` 74 LtCSFieldString string `validate:"ltcsfield=Inner.LtCSFieldString"` 75 LteCSFieldString string `validate:"ltecsfield=Inner.LteCSFieldString"` 76 NeFieldString string `validate:"nefield=EqFieldString"` 77 GtFieldString string `validate:"gtfield=MaxString"` 78 GteFieldString string `validate:"gtefield=MaxString"` 79 LtFieldString string `validate:"ltfield=MaxString"` 80 LteFieldString string `validate:"ltefield=MaxString"` 81 AlphaString string `validate:"alpha"` 82 AlphanumString string `validate:"alphanum"` 83 NumericString string `validate:"numeric"` 84 NumberString string `validate:"number"` 85 HexadecimalString string `validate:"hexadecimal"` 86 HexColorString string `validate:"hexcolor"` 87 RGBColorString string `validate:"rgb"` 88 RGBAColorString string `validate:"rgba"` 89 HSLColorString string `validate:"hsl"` 90 HSLAColorString string `validate:"hsla"` 91 Email string `validate:"email"` 92 URL string `validate:"url"` 93 URI string `validate:"uri"` 94 Base64 string `validate:"base64"` 95 Contains string `validate:"contains=purpose"` 96 ContainsAny string `validate:"containsany=!@#$"` 97 Excludes string `validate:"excludes=text"` 98 ExcludesAll string `validate:"excludesall=!@#$"` 99 ExcludesRune string `validate:"excludesrune=☻"` 100 ISBN string `validate:"isbn"` 101 ISBN10 string `validate:"isbn10"` 102 ISBN13 string `validate:"isbn13"` 103 UUID string `validate:"uuid"` 104 UUID3 string `validate:"uuid3"` 105 UUID4 string `validate:"uuid4"` 106 UUID5 string `validate:"uuid5"` 107 ASCII string `validate:"ascii"` 108 PrintableASCII string `validate:"printascii"` 109 MultiByte string `validate:"multibyte"` 110 DataURI string `validate:"datauri"` 111 Latitude string `validate:"latitude"` 112 Longitude string `validate:"longitude"` 113 SSN string `validate:"ssn"` 114 IP string `validate:"ip"` 115 IPv4 string `validate:"ipv4"` 116 IPv6 string `validate:"ipv6"` 117 CIDR string `validate:"cidr"` 118 CIDRv4 string `validate:"cidrv4"` 119 CIDRv6 string `validate:"cidrv6"` 120 TCPAddr string `validate:"tcp_addr"` 121 TCPAddrv4 string `validate:"tcp4_addr"` 122 TCPAddrv6 string `validate:"tcp6_addr"` 123 UDPAddr string `validate:"udp_addr"` 124 UDPAddrv4 string `validate:"udp4_addr"` 125 UDPAddrv6 string `validate:"udp6_addr"` 126 IPAddr string `validate:"ip_addr"` 127 IPAddrv4 string `validate:"ip4_addr"` 128 IPAddrv6 string `validate:"ip6_addr"` 129 UinxAddr string `validate:"unix_addr"` // can't fail from within Go's net package currently, but maybe in the future 130 MAC string `validate:"mac"` 131 IsColor string `validate:"iscolor"` 132 StrPtrMinLen *string `validate:"min=10"` 133 StrPtrMaxLen *string `validate:"max=1"` 134 StrPtrLen *string `validate:"len=2"` 135 StrPtrLt *string `validate:"lt=1"` 136 StrPtrLte *string `validate:"lte=1"` 137 StrPtrGt *string `validate:"gt=10"` 138 StrPtrGte *string `validate:"gte=10"` 139 OneOfString string `validate:"oneof=red green"` 140 OneOfInt int `validate:"oneof=5 63"` 141 } 142 143 var test Test 144 145 test.Inner.EqCSFieldString = "1234" 146 test.Inner.GtCSFieldString = "1234" 147 test.Inner.GteCSFieldString = "1234" 148 149 test.MaxString = "1234" 150 test.MaxNumber = 2000 151 test.MaxMultiple = make([]string, 9) 152 153 test.LtString = "1234" 154 test.LtNumber = 6 155 test.LtMultiple = make([]string, 3) 156 test.LtTime = time.Now().Add(time.Hour * 24) 157 158 test.LteString = "1234" 159 test.LteNumber = 6 160 test.LteMultiple = make([]string, 3) 161 test.LteTime = time.Now().Add(time.Hour * 24) 162 163 test.LtFieldString = "12345" 164 test.LteFieldString = "12345" 165 166 test.LtCSFieldString = "1234" 167 test.LteCSFieldString = "1234" 168 169 test.AlphaString = "abc3" 170 test.AlphanumString = "abc3!" 171 test.NumericString = "12E.00" 172 test.NumberString = "12E" 173 174 test.Excludes = "este é um texto de teste" 175 test.ExcludesAll = "Isso é Ótimo!" 176 test.ExcludesRune = "Amo isso ☻" 177 178 test.ASCII = "カタカナ" 179 test.PrintableASCII = "カタカナ" 180 181 test.MultiByte = "1234feerf" 182 183 s := "toolong" 184 test.StrPtrMaxLen = &s 185 test.StrPtrLen = &s 186 187 err = validate.Struct(test) 188 NotEqual(t, err, nil) 189 190 errs, ok := err.(validator.ValidationErrors) 191 Equal(t, ok, true) 192 193 tests := []struct { 194 ns string 195 expected string 196 }{ 197 { 198 ns: "Test.IsColor", 199 expected: "IsColor deve ser uma cor válida", 200 }, 201 { 202 ns: "Test.MAC", 203 expected: "MAC deve conter um endereço MAC válido", 204 }, 205 { 206 ns: "Test.IPAddr", 207 expected: "IPAddr deve ser um endereço IP resolvível", 208 }, 209 { 210 ns: "Test.IPAddrv4", 211 expected: "IPAddrv4 deve ser um endereço IPv4 resolvível", 212 }, 213 { 214 ns: "Test.IPAddrv6", 215 expected: "IPAddrv6 deve ser um endereço IPv6 resolvível", 216 }, 217 { 218 ns: "Test.UDPAddr", 219 expected: "UDPAddr deve ser um endereço UDP válido", 220 }, 221 { 222 ns: "Test.UDPAddrv4", 223 expected: "UDPAddrv4 deve ser um endereço IPv4 UDP válido", 224 }, 225 { 226 ns: "Test.UDPAddrv6", 227 expected: "UDPAddrv6 deve ser um endereço IPv6 UDP válido", 228 }, 229 { 230 ns: "Test.TCPAddr", 231 expected: "TCPAddr deve ser um endereço TCP válido", 232 }, 233 { 234 ns: "Test.TCPAddrv4", 235 expected: "TCPAddrv4 deve ser um endereço IPv4 TCP válido", 236 }, 237 { 238 ns: "Test.TCPAddrv6", 239 expected: "TCPAddrv6 deve ser um endereço IPv6 TCP válido", 240 }, 241 { 242 ns: "Test.CIDR", 243 expected: "CIDR deve conter uma notação CIDR válida", 244 }, 245 { 246 ns: "Test.CIDRv4", 247 expected: "CIDRv4 deve conter uma notação CIDR válida para um endereço IPv4", 248 }, 249 { 250 ns: "Test.CIDRv6", 251 expected: "CIDRv6 deve conter uma notação CIDR válida para um endereço IPv6", 252 }, 253 { 254 ns: "Test.SSN", 255 expected: "SSN deve ser um número SSN válido", 256 }, 257 { 258 ns: "Test.IP", 259 expected: "IP deve ser um endereço de IP válido", 260 }, 261 { 262 ns: "Test.IPv4", 263 expected: "IPv4 deve ser um endereço IPv4 válido", 264 }, 265 { 266 ns: "Test.IPv6", 267 expected: "IPv6 deve ser um endereço IPv6 válido", 268 }, 269 { 270 ns: "Test.DataURI", 271 expected: "DataURI deve conter um URI data válido", 272 }, 273 { 274 ns: "Test.Latitude", 275 expected: "Latitude deve conter uma coordenada de latitude válida", 276 }, 277 { 278 ns: "Test.Longitude", 279 expected: "Longitude deve conter uma coordenada de longitude válida", 280 }, 281 { 282 ns: "Test.MultiByte", 283 expected: "MultiByte deve conter caracteres multibyte", 284 }, 285 { 286 ns: "Test.ASCII", 287 expected: "ASCII deve conter apenas caracteres ascii", 288 }, 289 { 290 ns: "Test.PrintableASCII", 291 expected: "PrintableASCII deve conter apenas caracteres ascii imprimíveis", 292 }, 293 { 294 ns: "Test.UUID", 295 expected: "UUID deve ser um UUID válido", 296 }, 297 { 298 ns: "Test.UUID3", 299 expected: "UUID3 deve ser um UUID versão 3 válido", 300 }, 301 { 302 ns: "Test.UUID4", 303 expected: "UUID4 deve ser um UUID versão 4 válido", 304 }, 305 { 306 ns: "Test.UUID5", 307 expected: "UUID5 deve ser um UUID versão 5 válido", 308 }, 309 { 310 ns: "Test.ISBN", 311 expected: "ISBN deve ser um número ISBN válido", 312 }, 313 { 314 ns: "Test.ISBN10", 315 expected: "ISBN10 deve ser um número ISBN-10 válido", 316 }, 317 { 318 ns: "Test.ISBN13", 319 expected: "ISBN13 deve ser um número ISBN-13 válido", 320 }, 321 { 322 ns: "Test.Excludes", 323 expected: "Excludes não deve conter o texto 'text'", 324 }, 325 { 326 ns: "Test.ExcludesAll", 327 expected: "ExcludesAll não deve conter nenhum dos caracteres '!@#$'", 328 }, 329 { 330 ns: "Test.ExcludesRune", 331 expected: "ExcludesRune não deve conter '☻'", 332 }, 333 { 334 ns: "Test.ContainsAny", 335 expected: "ContainsAny deve conter pelo menos um dos caracteres '!@#$'", 336 }, 337 { 338 ns: "Test.Contains", 339 expected: "Contains deve conter o texto 'purpose'", 340 }, 341 { 342 ns: "Test.Base64", 343 expected: "Base64 deve ser uma string Base64 válida", 344 }, 345 { 346 ns: "Test.Email", 347 expected: "Email deve ser um endereço de e-mail válido", 348 }, 349 { 350 ns: "Test.URL", 351 expected: "URL deve ser uma URL válida", 352 }, 353 { 354 ns: "Test.URI", 355 expected: "URI deve ser uma URI válida", 356 }, 357 { 358 ns: "Test.RGBColorString", 359 expected: "RGBColorString deve ser uma cor RGB válida", 360 }, 361 { 362 ns: "Test.RGBAColorString", 363 expected: "RGBAColorString deve ser uma cor RGBA válida", 364 }, 365 { 366 ns: "Test.HSLColorString", 367 expected: "HSLColorString deve ser uma cor HSL válida", 368 }, 369 { 370 ns: "Test.HSLAColorString", 371 expected: "HSLAColorString deve ser uma cor HSLA válida", 372 }, 373 { 374 ns: "Test.HexadecimalString", 375 expected: "HexadecimalString deve ser um hexadecimal válido", 376 }, 377 { 378 ns: "Test.HexColorString", 379 expected: "HexColorString deve ser uma cor HEX válida", 380 }, 381 { 382 ns: "Test.NumberString", 383 expected: "NumberString deve ser um número válido", 384 }, 385 { 386 ns: "Test.NumericString", 387 expected: "NumericString deve ser um valor numérico válido", 388 }, 389 { 390 ns: "Test.AlphanumString", 391 expected: "AlphanumString deve conter caracteres alfanuméricos", 392 }, 393 { 394 ns: "Test.AlphaString", 395 expected: "AlphaString deve conter caracteres alfabéticos", 396 }, 397 { 398 ns: "Test.LtFieldString", 399 expected: "LtFieldString deve ser menor que MaxString", 400 }, 401 { 402 ns: "Test.LteFieldString", 403 expected: "LteFieldString deve ser menor ou igual a MaxString", 404 }, 405 { 406 ns: "Test.GtFieldString", 407 expected: "GtFieldString deve ser maior do que MaxString", 408 }, 409 { 410 ns: "Test.GteFieldString", 411 expected: "GteFieldString deve ser maior ou igual a MaxString", 412 }, 413 { 414 ns: "Test.NeFieldString", 415 expected: "NeFieldString não deve ser igual a EqFieldString", 416 }, 417 { 418 ns: "Test.LtCSFieldString", 419 expected: "LtCSFieldString deve ser menor que Inner.LtCSFieldString", 420 }, 421 { 422 ns: "Test.LteCSFieldString", 423 expected: "LteCSFieldString deve ser menor ou igual a Inner.LteCSFieldString", 424 }, 425 { 426 ns: "Test.GtCSFieldString", 427 expected: "GtCSFieldString deve ser maior do que Inner.GtCSFieldString", 428 }, 429 { 430 ns: "Test.GteCSFieldString", 431 expected: "GteCSFieldString deve ser maior ou igual a Inner.GteCSFieldString", 432 }, 433 { 434 ns: "Test.NeCSFieldString", 435 expected: "NeCSFieldString não deve ser igual a Inner.NeCSFieldString", 436 }, 437 { 438 ns: "Test.EqCSFieldString", 439 expected: "EqCSFieldString deve ser igual a Inner.EqCSFieldString", 440 }, 441 { 442 ns: "Test.EqFieldString", 443 expected: "EqFieldString deve ser igual a MaxString", 444 }, 445 { 446 ns: "Test.GteString", 447 expected: "GteString deve ter pelo menos 3 caracteres", 448 }, 449 { 450 ns: "Test.GteNumber", 451 expected: "GteNumber deve ser 5,56 ou superior", 452 }, 453 { 454 ns: "Test.GteMultiple", 455 expected: "GteMultiple deve conter pelo menos 2 itens", 456 }, 457 { 458 ns: "Test.GteTime", 459 expected: "GteTime deve ser maior ou igual à Data e Hora atual", 460 }, 461 { 462 ns: "Test.GtString", 463 expected: "GtString deve ter mais de 3 caracteres", 464 }, 465 { 466 ns: "Test.GtNumber", 467 expected: "GtNumber deve ser maior do que 5,56", 468 }, 469 { 470 ns: "Test.GtMultiple", 471 expected: "GtMultiple deve conter mais de 2 itens", 472 }, 473 { 474 ns: "Test.GtTime", 475 expected: "GtTime deve ser maior que a Data e Hora atual", 476 }, 477 { 478 ns: "Test.LteString", 479 expected: "LteString deve ter no máximo 3 caracteres", 480 }, 481 { 482 ns: "Test.LteNumber", 483 expected: "LteNumber deve ser 5,56 ou menor", 484 }, 485 { 486 ns: "Test.LteMultiple", 487 expected: "LteMultiple deve conter no máximo 2 itens", 488 }, 489 { 490 ns: "Test.LteTime", 491 expected: "LteTime deve ser menor ou igual à Data e Hora atual", 492 }, 493 { 494 ns: "Test.LtString", 495 expected: "LtString deve ter menos de 3 caracteres", 496 }, 497 { 498 ns: "Test.LtNumber", 499 expected: "LtNumber deve ser menor que 5,56", 500 }, 501 { 502 ns: "Test.LtMultiple", 503 expected: "LtMultiple deve conter menos de 2 itens", 504 }, 505 { 506 ns: "Test.LtTime", 507 expected: "LtTime deve ser inferior à Data e Hora atual", 508 }, 509 { 510 ns: "Test.NeString", 511 expected: "NeString não deve ser igual a ", 512 }, 513 { 514 ns: "Test.NeNumber", 515 expected: "NeNumber não deve ser igual a 0.00", 516 }, 517 { 518 ns: "Test.NeMultiple", 519 expected: "NeMultiple não deve ser igual a 0", 520 }, 521 { 522 ns: "Test.EqString", 523 expected: "EqString não é igual a 3", 524 }, 525 { 526 ns: "Test.EqNumber", 527 expected: "EqNumber não é igual a 2.33", 528 }, 529 { 530 ns: "Test.EqMultiple", 531 expected: "EqMultiple não é igual a 7", 532 }, 533 { 534 ns: "Test.MaxString", 535 expected: "MaxString deve ter no máximo 3 caracteres", 536 }, 537 { 538 ns: "Test.MaxNumber", 539 expected: "MaxNumber deve ser 1.113,00 ou menor", 540 }, 541 { 542 ns: "Test.MaxMultiple", 543 expected: "MaxMultiple deve conter no máximo 7 itens", 544 }, 545 { 546 ns: "Test.MinString", 547 expected: "MinString deve ter pelo menos 1 caractere", 548 }, 549 { 550 ns: "Test.MinNumber", 551 expected: "MinNumber deve ser 1.113,00 ou superior", 552 }, 553 { 554 ns: "Test.MinMultiple", 555 expected: "MinMultiple deve conter pelo menos 7 itens", 556 }, 557 { 558 ns: "Test.LenString", 559 expected: "LenString deve ter 1 caractere", 560 }, 561 { 562 ns: "Test.LenNumber", 563 expected: "LenNumber deve ser igual a 1.113,00", 564 }, 565 { 566 ns: "Test.LenMultiple", 567 expected: "LenMultiple deve conter 7 itens", 568 }, 569 { 570 ns: "Test.RequiredString", 571 expected: "RequiredString é um campo requerido", 572 }, 573 { 574 ns: "Test.RequiredNumber", 575 expected: "RequiredNumber é um campo requerido", 576 }, 577 { 578 ns: "Test.RequiredMultiple", 579 expected: "RequiredMultiple é um campo requerido", 580 }, 581 { 582 ns: "Test.StrPtrMinLen", 583 expected: "StrPtrMinLen deve ter pelo menos 10 caracteres", 584 }, 585 { 586 ns: "Test.StrPtrMaxLen", 587 expected: "StrPtrMaxLen deve ter no máximo 1 caractere", 588 }, 589 { 590 ns: "Test.StrPtrLen", 591 expected: "StrPtrLen deve ter 2 caracteres", 592 }, 593 { 594 ns: "Test.StrPtrLt", 595 expected: "StrPtrLt deve ter menos de 1 caractere", 596 }, 597 { 598 ns: "Test.StrPtrLte", 599 expected: "StrPtrLte deve ter no máximo 1 caractere", 600 }, 601 { 602 ns: "Test.StrPtrGt", 603 expected: "StrPtrGt deve ter mais de 10 caracteres", 604 }, 605 { 606 ns: "Test.StrPtrGte", 607 expected: "StrPtrGte deve ter pelo menos 10 caracteres", 608 }, 609 { 610 ns: "Test.OneOfString", 611 expected: "OneOfString deve ser um de [red green]", 612 }, 613 { 614 ns: "Test.OneOfInt", 615 expected: "OneOfInt deve ser um de [5 63]", 616 }, 617 } 618 619 for _, tt := range tests { 620 621 var fe validator.FieldError 622 623 for _, e := range errs { 624 if tt.ns == e.Namespace() { 625 fe = e 626 break 627 } 628 } 629 630 NotEqual(t, fe, nil) 631 Equal(t, tt.expected, fe.Translate(trans)) 632 } 633 634} 635