Repository navigation
Expand file tree
/
Copy pathvalidation_test.go
More file actions
184 lines (159 loc) · 11.3 KB
/
Copy pathvalidation_test.go
File metadata and controls
184 lines (159 loc) · 11.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
package input
import "testing"
// Test_Validation runs all field validation cases.
// Add new cases here when adding inputs or new validation rules.
// Cases are sorted alphabetically by input type.
func Test_Validation(t *testing.T) {
cases := []tc{
// ── Address ──────────────────────────────────────────────────────────
{"Address", "valid full", "Av. Libertad 123, Dpto #4", "", nil, false},
{"Address", "too short", "Ab", "chars", nil, false},
{"Address", "empty", "", "chars", nil, false},
{"Address", "at sign", "user@home", "not allowed", nil, false},
// ── Checkbox ─────────────────────────────────────────────────────────
{"Checkbox", "true", "true", "", nil, false},
{"Checkbox", "false", "false", "", nil, false},
{"Checkbox", "on", "on", "", nil, false},
{"Checkbox", "1", "1", "", nil, false},
{"Checkbox", "0", "0", "", nil, false},
{"Checkbox", "empty not required", "", "", nil, false},
{"Checkbox", "empty required", "", "empty", nil, true},
{"Checkbox", "invalid word", "yes", "invalid", nil, false},
{"Checkbox", "invalid number", "2", "invalid", nil, false},
// ── Datalist ─────────────────────────────────────────────────────────
{"Datalist", "valid key 1", "1", "", opts12, false},
{"Datalist", "valid key 2", "2", "", opts12, false},
{"Datalist", "invalid key", "0", "notallowed", opts12, false},
{"Datalist", "empty not required", "", "", opts12, false},
{"Datalist", "no options always pass", "any", "", nil, false},
// ── Date ─────────────────────────────────────────────────────────────
{"Date", "valid date", "2002-12-03", "", nil, false},
{"Date", "leap year 2020", "2020-02-29", "", nil, false},
{"Date", "not leap year 2023", "2023-02-29", "invalid", nil, false},
{"Date", "june has 30", "2023-06-31", "invalid", nil, false},
{"Date", "month 13", "2023-13-01", "invalid", nil, false},
{"Date", "slash format", "21/12/1998", "not allowed", nil, false},
{"Date", "empty", "", "chars", nil, false},
{"Date", "year too short", "200-01-01", "chars", nil, false},
// ── Decimal ──────────────────────────────────────────────────────────
{"Decimal", "valid fraction", "49.99", "", nil, false},
{"Decimal", "valid negative", "-10.5", "", nil, false},
{"Decimal", "valid integer", "100", "", nil, false},
{"Decimal", "letters", "abc", "not allowed", nil, false},
{"Decimal", "empty", "", "chars", nil, false},
// ── Email ────────────────────────────────────────────────────────────
{"Email", "valid", "user@example.com", "", nil, false},
{"Email", "dots and dashes", "my.name-test@sub.domain.org", "", nil, false},
{"Email", "empty", "", "chars", nil, false},
{"Email", "too short", "a@b", "chars", nil, false},
{"Email", "space", "user @mail.com", "not allowed", nil, false},
// ── Filepath ─────────────────────────────────────────────────────────
{"Filepath", "windows path", ".\\files\\1234\\", "", nil, false},
{"Filepath", "unix path", "./files/1234/", "", nil, false},
{"Filepath", "single char", "5", "", nil, false},
{"Filepath", "leading backslash", "\\files\\", "\\", nil, false},
{"Filepath", "space in path", ".\\path with space\\", "space", nil, false},
{"Filepath", "empty", "", "chars", nil, false},
// ── Gender ───────────────────────────────────────────────────────────
// Gender() bakes in m/f options at construction — always a closed enum.
{"Gender", "male", "m", "", nil, false},
{"Gender", "female", "f", "", nil, false},
{"Gender", "invalid value", "x", "notallowed", nil, false},
{"Gender", "empty not required", "", "", nil, false},
{"Gender", "empty required", "", "is required", nil, true},
// ── Hour ─────────────────────────────────────────────────────────────
{"Hour", "valid 12:30", "12:30", "", nil, false},
{"Hour", "valid 00:00", "00:00", "", nil, false},
{"Hour", "valid 23:59", "23:59", "", nil, false},
{"Hour", "24:00 invalid", "24:00", "invalid", nil, false},
{"Hour", "empty", "", "", nil, false},
{"Hour", "no colon 4 chars", "1230", "invalid", nil, false},
// ── IP ───────────────────────────────────────────────────────────────
{"IP", "valid ipv4", "192.168.1.1", "", nil, false},
{"IP", "valid ipv6", "2001:0db8:85a3:0000:0000:8a2e:0370:7334", "", nil, false},
{"IP", "all zeros", "0.0.0.0", "invalid", nil, false},
{"IP", "mixed dot and colon", "192.168:1.1", "invalid", nil, false},
{"IP", "empty", "", "chars", nil, false},
{"IP", "invalid plain chars", "uiuiuiu", "invalid", nil, false},
{"IP", "invalid ipv4 numeric range", "256.100.100.100", "invalid", nil, false},
{"IP", "invalid ipv4 too many groups", "192.168.1.1.1", "invalid", nil, false},
{"IP", "invalid ipv4 too few groups", "192.168.1", "invalid", nil, false},
{"IP", "invalid ipv6 too many groups", "2001:db8:1:2:3:4:5:6:7", "invalid", nil, false},
{"IP", "invalid ipv6 bad chars", "2001:0db8:85a3:0000:0000:8a2e:0370:zzzz", "invalid", nil, false},
{"IP", "valid ipv6 compressed", "2001:db8::1", "", nil, false},
{"IP", "valid ipv6 double colon start", "::1", "", nil, false},
{"IP", "valid ipv6 double colon end", "2001:db8::", "", nil, false},
// ── Number ───────────────────────────────────────────────────────────
{"Number", "valid 100", "100", "", nil, false},
{"Number", "valid 0", "0", "", nil, false},
{"Number", "negative", "-100", "not allowed", nil, false},
{"Number", "letters", "abc", "not allowed", nil, false},
{"Number", "empty", "", "chars", nil, false},
// ── Password ─────────────────────────────────────────────────────────
{"Password", "valid mixed", "c0ntra3!", "", nil, false},
{"Password", "long", "MyP@ssw0rd123456", "", nil, false},
{"Password", "empty", "", "chars", nil, false},
{"Password", "too short", "a", "chars", nil, false},
// ── Phone ────────────────────────────────────────────────────────────
{"Phone", "valid intl", "+56 9 1234 5678", "", nil, false},
{"Phone", "valid local", "912345678", "", nil, false},
{"Phone", "too long", "+001-800-555-0123-99", "chars", nil, false},
{"Phone", "too short", "123", "chars", nil, false},
{"Phone", "empty", "", "chars", nil, false},
{"Phone", "letter after min length", "+56-abc-123-456", "not allowed", nil, false},
// ── Radio ────────────────────────────────────────────────────────────
// No options set: falls back to Permitted (Letters/Numbers, Minimum 1).
{"Radio", "valid key m", "m", "", nil, false},
{"Radio", "valid key f", "f", "", nil, false},
{"Radio", "empty", "", "chars", nil, false},
// With options set: closed enum — membership in Options.Key is required.
{"Radio", "closed valid m", "m", "", optsGender, false},
{"Radio", "closed valid f", "f", "", optsGender, false},
{"Radio", "closed invalid", "x", "notallowed", optsGender, false},
{"Radio", "closed empty not required", "", "", optsGender, false},
// ── Rut ──────────────────────────────────────────────────────────────
{"Rut", "valid 7863697-1", "7863697-1", "", nil, false},
{"Rut", "valid K uppercase", "20373221-K", "", nil, false},
{"Rut", "valid k lowercase", "20373221-k", "", nil, false},
{"Rut", "no hyphen alpha", "15890022k", "hyphen", nil, false},
{"Rut", "no hyphen digits", "177344788", "hyphen", nil, false},
{"Rut", "wrong check digit", "7863697-2", "invalid", nil, false},
{"Rut", "leading zero", "01234567-1", "invalid", nil, false},
{"Rut", "empty", "", "chars", nil, false},
// ── Search ───────────────────────────────────────────────────────────
{"Search", "valid search", "golang webtyp", "", nil, false},
{"Search", "empty search", "", "", nil, false},
// ── Select ───────────────────────────────────────────────────────────
// No options set: falls back to Permitted (Letters/Numbers, Minimum 1).
{"Select", "valid", "admin", "", nil, false},
{"Select", "empty", "", "chars", nil, false},
// With options set: closed enum — membership in Options.Key is required.
{"Select", "closed valid key 1", "1", "", opts12, false},
{"Select", "closed valid key 2", "2", "", opts12, false},
{"Select", "closed invalid key", "0", "notallowed", opts12, false},
{"Select", "closed empty not required", "", "", opts12, false},
// ── Text ─────────────────────────────────────────────────────────────
{"Text", "valid with tilde", "Juan Pérez", "", nil, false},
{"Text", "valid with dots", "Dr. Smith (Jr.)", "", nil, false},
{"Text", "too short", "A", "chars", nil, false},
{"Text", "empty", "", "chars", nil, false},
{"Text", "at sign", "user@domain", "not allowed", nil, false},
// ── Textarea ─────────────────────────────────────────────────────────
{"Textarea", "valid long", "IRRITACION EN PIEL DE ROSTRO. ALERGIAS NO.", "", nil, false},
{"Textarea", "valid with newline", "Line one.\nLine two.", "", nil, false},
{"Textarea", "empty", "", "chars", nil, false},
{"Textarea", "too short", "Hi", "chars", nil, false},
}
for _, c := range cases {
c := c
t.Run(c.t+"/"+c.name, func(t *testing.T) {
inp := buildInput(t, c.t, c.opts)
if c.req {
if s, ok := inp.(interface{ SetRequired(bool) }); ok {
s.SetRequired(true)
}
}
checkErr(t, inp.Validate(c.val), c.err)
})
}
}