1package fr
2
3import (
4	"testing"
5	"time"
6
7	french "github.com/go-playground/locales/fr"
8	ut "github.com/go-playground/universal-translator"
9	. "github.com/go-playground/assert/v2"
10	"github.com/go-playground/validator/v10"
11)
12
13func TestTranslations(t *testing.T) {
14
15	fre := french.New()
16	uni := ut.New(fre, fre)
17	trans, _ := uni.GetTranslator("fr")
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 = "this is some test text"
175	test.ExcludesAll = "This is Great!"
176	test.ExcludesRune = "Love it ☻"
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 doit être une couleur valide",
200		},
201		{
202			ns:       "Test.MAC",
203			expected: "MAC doit contenir une adresse MAC valide",
204		},
205		{
206			ns:       "Test.IPAddr",
207			expected: "IPAddr doit être une adresse IP résolvable",
208		},
209		{
210			ns:       "Test.IPAddrv4",
211			expected: "IPAddrv4 doit être une adresse IPv4 résolvable",
212		},
213		{
214			ns:       "Test.IPAddrv6",
215			expected: "IPAddrv6 doit être une adresse IPv6 résolvable",
216		},
217		{
218			ns:       "Test.UDPAddr",
219			expected: "UDPAddr doit être une adressse UDP valide",
220		},
221		{
222			ns:       "Test.UDPAddrv4",
223			expected: "UDPAddrv4 doit être une adressse IPv4 UDP valide",
224		},
225		{
226			ns:       "Test.UDPAddrv6",
227			expected: "UDPAddrv6 doit être une adressse IPv6 UDP valide",
228		},
229		{
230			ns:       "Test.TCPAddr",
231			expected: "TCPAddr doit être une adressse TCP valide",
232		},
233		{
234			ns:       "Test.TCPAddrv4",
235			expected: "TCPAddrv4 doit être une adressse IPv4 TCP valide",
236		},
237		{
238			ns:       "Test.TCPAddrv6",
239			expected: "TCPAddrv6 doit être une adressse IPv6 TCP valide",
240		},
241		{
242			ns:       "Test.CIDR",
243			expected: "CIDR doit contenir une notation CIDR valide",
244		},
245		{
246			ns:       "Test.CIDRv4",
247			expected: "CIDRv4 doit contenir une notation CIDR valide pour une adresse IPv4",
248		},
249		{
250			ns:       "Test.CIDRv6",
251			expected: "CIDRv6 doit contenir une notation CIDR valide pour une adresse IPv6",
252		},
253		{
254			ns:       "Test.SSN",
255			expected: "SSN doit être un numéro SSN valide",
256		},
257		{
258			ns:       "Test.IP",
259			expected: "IP doit être une adressse IP valide",
260		},
261		{
262			ns:       "Test.IPv4",
263			expected: "IPv4 doit être une adressse IPv4 valide",
264		},
265		{
266			ns:       "Test.IPv6",
267			expected: "IPv6 doit être une adressse IPv6 valide",
268		},
269		{
270			ns:       "Test.DataURI",
271			expected: "DataURI doit contenir une URI data valide",
272		},
273		{
274			ns:       "Test.Latitude",
275			expected: "Latitude doit contenir des coordonnées latitude valides",
276		},
277		{
278			ns:       "Test.Longitude",
279			expected: "Longitude doit contenir des coordonnées longitudes valides",
280		},
281		{
282			ns:       "Test.MultiByte",
283			expected: "MultiByte doit contenir des caractères multioctets",
284		},
285		{
286			ns:       "Test.ASCII",
287			expected: "ASCII ne doit contenir que des caractères ascii",
288		},
289		{
290			ns:       "Test.PrintableASCII",
291			expected: "PrintableASCII ne doit contenir que des caractères ascii affichables",
292		},
293		{
294			ns:       "Test.UUID",
295			expected: "UUID doit être un UUID valid",
296		},
297		{
298			ns:       "Test.UUID3",
299			expected: "UUID3 doit être un UUID version 3 valid",
300		},
301		{
302			ns:       "Test.UUID4",
303			expected: "UUID4 doit être un UUID version 4 valid",
304		},
305		{
306			ns:       "Test.UUID5",
307			expected: "UUID5 doit être un UUID version 5 valid",
308		},
309		{
310			ns:       "Test.ISBN",
311			expected: "ISBN doit être un numéro ISBN valid",
312		},
313		{
314			ns:       "Test.ISBN10",
315			expected: "ISBN10 doit être un numéro ISBN-10 valid",
316		},
317		{
318			ns:       "Test.ISBN13",
319			expected: "ISBN13 doit être un numéro ISBN-13 valid",
320		},
321		{
322			ns:       "Test.Excludes",
323			expected: "Excludes ne doit pas contenir le texte 'text'",
324		},
325		{
326			ns:       "Test.ExcludesAll",
327			expected: "ExcludesAll ne doit pas contenir l'un des caractères suivants '!@#$'",
328		},
329		{
330			ns:       "Test.ExcludesRune",
331			expected: "ExcludesRune ne doit pas contenir ce qui suit '☻'",
332		},
333		{
334			ns:       "Test.ContainsAny",
335			expected: "ContainsAny doit contenir au moins l' un des caractères suivants '!@#$'",
336		},
337		{
338			ns:       "Test.Contains",
339			expected: "Contains doit contenir le texte 'purpose'",
340		},
341		{
342			ns:       "Test.Base64",
343			expected: "Base64 doit être une chaîne de caractères au format Base64 valide",
344		},
345		{
346			ns:       "Test.Email",
347			expected: "Email doit être une adresse email valide",
348		},
349		{
350			ns:       "Test.URL",
351			expected: "URL doit être une URL valide",
352		},
353		{
354			ns:       "Test.URI",
355			expected: "URI doit être une URI valide",
356		},
357		{
358			ns:       "Test.RGBColorString",
359			expected: "RGBColorString doit être une couleur au format RGB valide",
360		},
361		{
362			ns:       "Test.RGBAColorString",
363			expected: "RGBAColorString doit être une couleur au format RGBA valide",
364		},
365		{
366			ns:       "Test.HSLColorString",
367			expected: "HSLColorString doit être une couleur au format HSL valide",
368		},
369		{
370			ns:       "Test.HSLAColorString",
371			expected: "HSLAColorString doit être une couleur au format HSLA valide",
372		},
373		{
374			ns:       "Test.HexadecimalString",
375			expected: "HexadecimalString doit être une chaîne de caractères au format hexadécimal valide",
376		},
377		{
378			ns:       "Test.HexColorString",
379			expected: "HexColorString doit être une couleur au format HEX valide",
380		},
381		{
382			ns:       "Test.NumberString",
383			expected: "NumberString doit être un nombre valid",
384		},
385		{
386			ns:       "Test.NumericString",
387			expected: "NumericString doit être une valeur numérique valide",
388		},
389		{
390			ns:       "Test.AlphanumString",
391			expected: "AlphanumString ne doit contenir que des caractères alphanumériques",
392		},
393		{
394			ns:       "Test.AlphaString",
395			expected: "AlphaString ne doit contenir que des caractères alphabétiques",
396		},
397		{
398			ns:       "Test.LtFieldString",
399			expected: "LtFieldString doit être inférieur à MaxString",
400		},
401		{
402			ns:       "Test.LteFieldString",
403			expected: "LteFieldString doit être inférieur ou égal à MaxString",
404		},
405		{
406			ns:       "Test.GtFieldString",
407			expected: "GtFieldString doit être supérieur à MaxString",
408		},
409		{
410			ns:       "Test.GteFieldString",
411			expected: "GteFieldString doit être supérieur ou égal à MaxString",
412		},
413		{
414			ns:       "Test.NeFieldString",
415			expected: "NeFieldString ne doit pas être égal à EqFieldString",
416		},
417		{
418			ns:       "Test.LtCSFieldString",
419			expected: "LtCSFieldString doit être inférieur à Inner.LtCSFieldString",
420		},
421		{
422			ns:       "Test.LteCSFieldString",
423			expected: "LteCSFieldString doit être inférieur ou égal à Inner.LteCSFieldString",
424		},
425		{
426			ns:       "Test.GtCSFieldString",
427			expected: "GtCSFieldString doit être supérieur à Inner.GtCSFieldString",
428		},
429		{
430			ns:       "Test.GteCSFieldString",
431			expected: "GteCSFieldString doit être supérieur ou égal à Inner.GteCSFieldString",
432		},
433		{
434			ns:       "Test.NeCSFieldString",
435			expected: "NeCSFieldString ne doit pas être égal à Inner.NeCSFieldString",
436		},
437		{
438			ns:       "Test.EqCSFieldString",
439			expected: "EqCSFieldString doit être égal à Inner.EqCSFieldString",
440		},
441		{
442			ns:       "Test.EqFieldString",
443			expected: "EqFieldString doit être égal à MaxString",
444		},
445		{
446			ns:       "Test.GteString",
447			expected: "GteString doit faire une taille d'au moins 3 caractères",
448		},
449		{
450			ns:       "Test.GteNumber",
451			expected: "GteNumber doit être 5,56 ou plus",
452		},
453		{
454			ns:       "Test.GteMultiple",
455			expected: "GteMultiple doit contenir au moins 2 elements",
456		},
457		{
458			ns:       "Test.GteTime",
459			expected: "GteTime doit être après ou pendant la date et l'heure actuelle",
460		},
461		{
462			ns:       "Test.GtString",
463			expected: "GtString doit avoir une taille supérieur à 3 caractères",
464		},
465		{
466			ns:       "Test.GtNumber",
467			expected: "GtNumber doit être supérieur à 5,56",
468		},
469		{
470			ns:       "Test.GtMultiple",
471			expected: "GtMultiple doit contenir plus de 2 elements",
472		},
473		{
474			ns:       "Test.GtTime",
475			expected: "GtTime doit être après la date et l'heure actuelle",
476		},
477		{
478			ns:       "Test.LteString",
479			expected: "LteString doit faire une taille maximum de 3 caractères",
480		},
481		{
482			ns:       "Test.LteNumber",
483			expected: "LteNumber doit faire 5,56 ou moins",
484		},
485		{
486			ns:       "Test.LteMultiple",
487			expected: "LteMultiple doit contenir un maximum de 2 elements",
488		},
489		{
490			ns:       "Test.LteTime",
491			expected: "LteTime doit être avant ou pendant la date et l'heure actuelle",
492		},
493		{
494			ns:       "Test.LtString",
495			expected: "LtString doit avoir une taille inférieure à 3 caractères",
496		},
497		{
498			ns:       "Test.LtNumber",
499			expected: "LtNumber doit être inférieur à 5,56",
500		},
501		{
502			ns:       "Test.LtMultiple",
503			expected: "LtMultiple doit contenir mois de 2 elements",
504		},
505		{
506			ns:       "Test.LtTime",
507			expected: "LtTime doit être avant la date et l'heure actuelle",
508		},
509		{
510			ns:       "Test.NeString",
511			expected: "NeString ne doit pas être égal à ",
512		},
513		{
514			ns:       "Test.NeNumber",
515			expected: "NeNumber ne doit pas être égal à 0.00",
516		},
517		{
518			ns:       "Test.NeMultiple",
519			expected: "NeMultiple ne doit pas être égal à 0",
520		},
521		{
522			ns:       "Test.EqString",
523			expected: "EqString n'est pas égal à 3",
524		},
525		{
526			ns:       "Test.EqNumber",
527			expected: "EqNumber n'est pas égal à 2.33",
528		},
529		{
530			ns:       "Test.EqMultiple",
531			expected: "EqMultiple n'est pas égal à 7",
532		},
533		{
534			ns:       "Test.MaxString",
535			expected: "MaxString doit faire une taille maximum de 3 caractères",
536		},
537		{
538			ns:       "Test.MaxNumber",
539			expected: "MaxNumber doit être égal à 1 113,00 ou moins",
540		},
541		{
542			ns:       "Test.MaxMultiple",
543			expected: "MaxMultiple doit contenir au maximum 7 elements",
544		},
545		{
546			ns:       "Test.MinString",
547			expected: "MinString doit faire une taille minimum de 1 caractère",
548		},
549		{
550			ns:       "Test.MinNumber",
551			expected: "MinNumber doit être égal à 1 113,00 ou plus",
552		},
553		{
554			ns:       "Test.MinMultiple",
555			expected: "MinMultiple doit contenir au moins 7 elements",
556		},
557		{
558			ns:       "Test.LenString",
559			expected: "LenString doit faire une taille de 1 caractère",
560		},
561		{
562			ns:       "Test.LenNumber",
563			expected: "LenNumber doit être égal à 1 113,00",
564		},
565		{
566			ns:       "Test.LenMultiple",
567			expected: "LenMultiple doit contenir 7 elements",
568		},
569		{
570			ns:       "Test.RequiredString",
571			expected: "RequiredString est un champ obligatoire",
572		},
573		{
574			ns:       "Test.RequiredNumber",
575			expected: "RequiredNumber est un champ obligatoire",
576		},
577		{
578			ns:       "Test.RequiredMultiple",
579			expected: "RequiredMultiple est un champ obligatoire",
580		},
581		{
582			ns:       "Test.StrPtrMinLen",
583			expected: "StrPtrMinLen doit faire une taille minimum de 10 caractères",
584		},
585		{
586			ns:       "Test.StrPtrMaxLen",
587			expected: "StrPtrMaxLen doit faire une taille maximum de 1 caractère",
588		},
589		{
590			ns:       "Test.StrPtrLen",
591			expected: "StrPtrLen doit faire une taille de 2 caractères",
592		},
593		{
594			ns:       "Test.StrPtrLt",
595			expected: "StrPtrLt doit avoir une taille inférieure à 1 caractère",
596		},
597		{
598			ns:       "Test.StrPtrLte",
599			expected: "StrPtrLte doit faire une taille maximum de 1 caractère",
600		},
601		{
602			ns:       "Test.StrPtrGt",
603			expected: "StrPtrGt doit avoir une taille supérieur à 10 caractères",
604		},
605		{
606			ns:       "Test.StrPtrGte",
607			expected: "StrPtrGte doit faire une taille d'au moins 10 caractères",
608		},
609		{
610			ns:       "Test.OneOfString",
611			expected: "OneOfString doit être l'un des choix suivants [red green]",
612		},
613		{
614			ns:       "Test.OneOfInt",
615			expected: "OneOfInt doit être l'un des choix suivants [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