1package id
2
3import (
4	"testing"
5	"time"
6
7	indonesia "github.com/go-playground/locales/id"
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	idn := indonesia.New()
16	uni := ut.New(idn, idn)
17	trans, _ := uni.GetTranslator("id")
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=tujuan"`
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=merah hijau"`
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 harus berupa warna yang valid",
200		},
201		{
202			ns:       "Test.MAC",
203			expected: "MAC harus berisi alamat MAC yang valid",
204		},
205		{
206			ns:       "Test.IPAddr",
207			expected: "IPAddr harus berupa alamat IP yang dapat dipecahkan",
208		},
209		{
210			ns:       "Test.IPAddrv4",
211			expected: "IPAddrv4 harus berupa alamat IPv4 yang dapat diatasi",
212		},
213		{
214			ns:       "Test.IPAddrv6",
215			expected: "IPAddrv6 harus berupa alamat IPv6 yang dapat diatasi",
216		},
217		{
218			ns:       "Test.UDPAddr",
219			expected: "UDPAddr harus berupa alamat UDP yang valid",
220		},
221		{
222			ns:       "Test.UDPAddrv4",
223			expected: "UDPAddrv4 harus berupa alamat IPv4 UDP yang valid",
224		},
225		{
226			ns:       "Test.UDPAddrv6",
227			expected: "UDPAddrv6 harus berupa alamat IPv6 UDP yang valid",
228		},
229		{
230			ns:       "Test.TCPAddr",
231			expected: "TCPAddr harus berupa alamat TCP yang valid",
232		},
233		{
234			ns:       "Test.TCPAddrv4",
235			expected: "TCPAddrv4 harus berupa alamat TCP IPv4 yang valid",
236		},
237		{
238			ns:       "Test.TCPAddrv6",
239			expected: "TCPAddrv6 harus berupa alamat TCP IPv6 yang valid",
240		},
241		{
242			ns:       "Test.CIDR",
243			expected: "CIDR harus berisi notasi CIDR yang valid",
244		},
245		{
246			ns:       "Test.CIDRv4",
247			expected: "CIDRv4 harus berisi notasi CIDR yang valid untuk alamat IPv4",
248		},
249		{
250			ns:       "Test.CIDRv6",
251			expected: "CIDRv6 harus berisi notasi CIDR yang valid untuk alamat IPv6",
252		},
253		{
254			ns:       "Test.SSN",
255			expected: "SSN harus berupa nomor SSN yang valid",
256		},
257		{
258			ns:       "Test.IP",
259			expected: "IP harus berupa alamat IP yang valid",
260		},
261		{
262			ns:       "Test.IPv4",
263			expected: "IPv4 harus berupa alamat IPv4 yang valid",
264		},
265		{
266			ns:       "Test.IPv6",
267			expected: "IPv6 harus berupa alamat IPv6 yang valid",
268		},
269		{
270			ns:       "Test.DataURI",
271			expected: "DataURI harus berisi URI Data yang valid",
272		},
273		{
274			ns:       "Test.Latitude",
275			expected: "Latitude harus berisi koordinat lintang yang valid",
276		},
277		{
278			ns:       "Test.Longitude",
279			expected: "Longitude harus berisi koordinat bujur yang valid",
280		},
281		{
282			ns:       "Test.MultiByte",
283			expected: "MultiByte harus berisi karakter multibyte",
284		},
285		{
286			ns:       "Test.ASCII",
287			expected: "ASCII hanya boleh berisi karakter ascii",
288		},
289		{
290			ns:       "Test.PrintableASCII",
291			expected: "PrintableASCII hanya boleh berisi karakter ascii yang dapat dicetak",
292		},
293		{
294			ns:       "Test.UUID",
295			expected: "UUID harus berupa UUID yang valid",
296		},
297		{
298			ns:       "Test.UUID3",
299			expected: "UUID3 harus berupa UUID versi 3 yang valid",
300		},
301		{
302			ns:       "Test.UUID4",
303			expected: "UUID4 harus berupa UUID versi 4 yang valid",
304		},
305		{
306			ns:       "Test.UUID5",
307			expected: "UUID5 harus berupa UUID versi 5 yang valid",
308		},
309		{
310			ns:       "Test.ISBN",
311			expected: "ISBN harus berupa nomor ISBN yang valid",
312		},
313		{
314			ns:       "Test.ISBN10",
315			expected: "ISBN10 harus berupa nomor ISBN-10 yang valid",
316		},
317		{
318			ns:       "Test.ISBN13",
319			expected: "ISBN13 harus berupa nomor ISBN-13 yang valid",
320		},
321		{
322			ns:       "Test.Excludes",
323			expected: "Excludes tidak boleh berisi teks 'text'",
324		},
325		{
326			ns:       "Test.ExcludesAll",
327			expected: "ExcludesAll tidak boleh berisi salah satu karakter berikut '!@#$'",
328		},
329		{
330			ns:       "Test.ExcludesRune",
331			expected: "ExcludesRune tidak boleh berisi '☻'",
332		},
333		{
334			ns:       "Test.ContainsAny",
335			expected: "ContainsAny harus berisi setidaknya salah satu karakter berikut '!@#$'",
336		},
337		{
338			ns:       "Test.Contains",
339			expected: "Contains harus berisi teks 'tujuan'",
340		},
341		{
342			ns:       "Test.Base64",
343			expected: "Base64 harus berupa string Base64 yang valid",
344		},
345		{
346			ns:       "Test.Email",
347			expected: "Email harus berupa alamat email yang valid",
348		},
349		{
350			ns:       "Test.URL",
351			expected: "URL harus berupa URL yang valid",
352		},
353		{
354			ns:       "Test.URI",
355			expected: "URI harus berupa URI yang valid",
356		},
357		{
358			ns:       "Test.RGBColorString",
359			expected: "RGBColorString harus berupa warna RGB yang valid",
360		},
361		{
362			ns:       "Test.RGBAColorString",
363			expected: "RGBAColorString harus berupa warna RGBA yang valid",
364		},
365		{
366			ns:       "Test.HSLColorString",
367			expected: "HSLColorString harus berupa warna HSL yang valid",
368		},
369		{
370			ns:       "Test.HSLAColorString",
371			expected: "HSLAColorString harus berupa warna HSLA yang valid",
372		},
373		{
374			ns:       "Test.HexadecimalString",
375			expected: "HexadecimalString harus berupa heksadesimal yang valid",
376		},
377		{
378			ns:       "Test.HexColorString",
379			expected: "HexColorString harus berupa warna HEX yang valid",
380		},
381		{
382			ns:       "Test.NumberString",
383			expected: "NumberString harus berupa angka yang valid",
384		},
385		{
386			ns:       "Test.NumericString",
387			expected: "NumericString harus berupa nilai numerik yang valid",
388		},
389		{
390			ns:       "Test.AlphanumString",
391			expected: "AlphanumString hanya dapat berisi karakter alfanumerik",
392		},
393		{
394			ns:       "Test.AlphaString",
395			expected: "AlphaString hanya dapat berisi karakter abjad",
396		},
397		{
398			ns:       "Test.LtFieldString",
399			expected: "LtFieldString harus kurang dari MaxString",
400		},
401		{
402			ns:       "Test.LteFieldString",
403			expected: "LteFieldString harus kurang dari atau sama dengan MaxString",
404		},
405		{
406			ns:       "Test.GtFieldString",
407			expected: "GtFieldString harus lebih besar dari MaxString",
408		},
409		{
410			ns:       "Test.GteFieldString",
411			expected: "GteFieldString harus lebih besar dari atau sama dengan MaxString",
412		},
413		{
414			ns:       "Test.NeFieldString",
415			expected: "NeFieldString tidak sama dengan EqFieldString",
416		},
417		{
418			ns:       "Test.LtCSFieldString",
419			expected: "LtCSFieldString harus kurang dari Inner.LtCSFieldString",
420		},
421		{
422			ns:       "Test.LteCSFieldString",
423			expected: "LteCSFieldString harus kurang dari atau sama dengan Inner.LteCSFieldString",
424		},
425		{
426			ns:       "Test.GtCSFieldString",
427			expected: "GtCSFieldString harus lebih besar dari Inner.GtCSFieldString",
428		},
429		{
430			ns:       "Test.GteCSFieldString",
431			expected: "GteCSFieldString harus lebih besar dari atau sama dengan Inner.GteCSFieldString",
432		},
433		{
434			ns:       "Test.NeCSFieldString",
435			expected: "NeCSFieldString tidak sama dengan Inner.NeCSFieldString",
436		},
437		{
438			ns:       "Test.EqCSFieldString",
439			expected: "EqCSFieldString harus sama dengan Inner.EqCSFieldString",
440		},
441		{
442			ns:       "Test.EqFieldString",
443			expected: "EqFieldString harus sama dengan MaxString",
444		},
445		{
446			ns:       "Test.GteString",
447			expected: "panjang minimal GteString adalah 3 karakter",
448		},
449		{
450			ns:       "Test.GteNumber",
451			expected: "GteNumber harus 5,56 atau lebih besar",
452		},
453		{
454			ns:       "Test.GteMultiple",
455			expected: "GteMultiple harus berisi setidaknya 2 item",
456		},
457		{
458			ns:       "Test.GteTime",
459			expected: "GteTime harus lebih besar dari atau sama dengan tanggal & waktu saat ini",
460		},
461		{
462			ns:       "Test.GtString",
463			expected: "panjang GtString harus lebih dari 3 karakter",
464		},
465		{
466			ns:       "Test.GtNumber",
467			expected: "GtNumber harus lebih besar dari 5,56",
468		},
469		{
470			ns:       "Test.GtMultiple",
471			expected: "GtMultiple harus berisi lebih dari 2 item",
472		},
473		{
474			ns:       "Test.GtTime",
475			expected: "GtTime harus lebih besar dari tanggal & waktu saat ini",
476		},
477		{
478			ns:       "Test.LteString",
479			expected: "panjang maksimal LteString adalah 3 karakter",
480		},
481		{
482			ns:       "Test.LteNumber",
483			expected: "LteNumber harus 5,56 atau kurang",
484		},
485		{
486			ns:       "Test.LteMultiple",
487			expected: "LteMultiple harus berisi maksimal 2 item",
488		},
489		{
490			ns:       "Test.LteTime",
491			expected: "LteTime harus kurang dari atau sama dengan tanggal & waktu saat ini",
492		},
493		{
494			ns:       "Test.LtString",
495			expected: "panjang LtString harus kurang dari 3 karakter",
496		},
497		{
498			ns:       "Test.LtNumber",
499			expected: "LtNumber harus kurang dari 5,56",
500		},
501		{
502			ns:       "Test.LtMultiple",
503			expected: "LtMultiple harus berisi kurang dari 2 item",
504		},
505		{
506			ns:       "Test.LtTime",
507			expected: "LtTime harus kurang dari tanggal & waktu saat ini",
508		},
509		{
510			ns:       "Test.NeString",
511			expected: "NeString tidak sama dengan ",
512		},
513		{
514			ns:       "Test.NeNumber",
515			expected: "NeNumber tidak sama dengan 0.00",
516		},
517		{
518			ns:       "Test.NeMultiple",
519			expected: "NeMultiple tidak sama dengan 0",
520		},
521		{
522			ns:       "Test.EqString",
523			expected: "EqString tidak sama dengan 3",
524		},
525		{
526			ns:       "Test.EqNumber",
527			expected: "EqNumber tidak sama dengan 2.33",
528		},
529		{
530			ns:       "Test.EqMultiple",
531			expected: "EqMultiple tidak sama dengan 7",
532		},
533		{
534			ns:       "Test.MaxString",
535			expected: "panjang maksimal MaxString adalah 3 karakter",
536		},
537		{
538			ns:       "Test.MaxNumber",
539			expected: "MaxNumber harus 1.113,00 atau kurang",
540		},
541		{
542			ns:       "Test.MaxMultiple",
543			expected: "MaxMultiple harus berisi maksimal 7 item",
544		},
545		{
546			ns:       "Test.MinString",
547			expected: "panjang minimal MinString adalah 1 karakter",
548		},
549		{
550			ns:       "Test.MinNumber",
551			expected: "MinNumber harus 1.113,00 atau lebih besar",
552		},
553		{
554			ns:       "Test.MinMultiple",
555			expected: "panjang minimal MinMultiple adalah 7 item",
556		},
557		{
558			ns:       "Test.LenString",
559			expected: "panjang LenString harus 1 karakter",
560		},
561		{
562			ns:       "Test.LenNumber",
563			expected: "LenNumber harus sama dengan 1.113,00",
564		},
565		{
566			ns:       "Test.LenMultiple",
567			expected: "LenMultiple harus berisi 7 item",
568		},
569		{
570			ns:       "Test.RequiredString",
571			expected: "RequiredString wajib diisi",
572		},
573		{
574			ns:       "Test.RequiredNumber",
575			expected: "RequiredNumber wajib diisi",
576		},
577		{
578			ns:       "Test.RequiredMultiple",
579			expected: "RequiredMultiple wajib diisi",
580		},
581		{
582			ns:       "Test.StrPtrMinLen",
583			expected: "panjang minimal StrPtrMinLen adalah 10 karakter",
584		},
585		{
586			ns:       "Test.StrPtrMaxLen",
587			expected: "panjang maksimal StrPtrMaxLen adalah 1 karakter",
588		},
589		{
590			ns:       "Test.StrPtrLen",
591			expected: "panjang StrPtrLen harus 2 karakter",
592		},
593		{
594			ns:       "Test.StrPtrLt",
595			expected: "panjang StrPtrLt harus kurang dari 1 karakter",
596		},
597		{
598			ns:       "Test.StrPtrLte",
599			expected: "panjang maksimal StrPtrLte adalah 1 karakter",
600		},
601		{
602			ns:       "Test.StrPtrGt",
603			expected: "panjang StrPtrGt harus lebih dari 10 karakter",
604		},
605		{
606			ns:       "Test.StrPtrGte",
607			expected: "panjang minimal StrPtrGte adalah 10 karakter",
608		},
609		{
610			ns:       "Test.OneOfString",
611			expected: "OneOfString harus berupa salah satu dari [merah hijau]",
612		},
613		{
614			ns:       "Test.OneOfInt",
615			expected: "OneOfInt harus berupa salah satu dari [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