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