]> Dogcows Code - chaz/p5-CGI-Ex/blob - t/1_validate_05_types.t
add PSGI handler
[chaz/p5-CGI-Ex] / t / 1_validate_05_types.t
1 # -*- Mode: Perl; -*-
2
3 =head1 NAME
4
5 1_validate_05_types.t - Test CGI::Ex::Validate's ability to do multitudinous types of validate
6
7 =cut
8
9 use strict;
10 use Test::More tests => 181;
11
12 use_ok('CGI::Ex::Validate');
13
14 my $v;
15 my $e;
16
17 sub validate { scalar CGI::Ex::Validate->new({as_array_title=>'',as_string_join=>"\n"})->validate(@_) }
18
19 ### required
20 $v = {foo => {required => 1}};
21 $e = validate({}, $v);
22 ok($e, 'required => 1 - fail');
23
24 $e = validate({foo => 1}, $v);
25 ok(! $e, 'required => 1 - good');
26
27 ### validate_if
28 $v = {foo => {required => 1, validate_if => 'bar'}};
29 $e = validate({}, $v);
30 ok(! $e, 'validate_if - true');
31
32 $e = validate({bar => 1}, $v);
33 ok($e, 'validate_if - false');
34
35 $v = {text1 => {required => 1, validate_if => 'text2 was_valid'}, text2 => {validate_if => 'text3'}};
36 $e = validate({}, $v);
37 ok(! $e, "Got no error on validate_if with was_valid");
38 $e = validate({text2 => 1}, $v);
39 ok(! $e, "Got no error on validate_if with was_valid with non-validated data");
40 $e = validate({text3 => 1}, $v);
41 ok(! $e, "Got no error on validate_if with was_valid with validated - bad data");
42 $e = validate({text2 => 1, text3 => 1}, $v);
43 ok(! $e, "Got error on validate_if with was_valid with validated - good data");
44 $e = validate({text1 => 1, text2 => 1, text3 => 1}, $v);
45 ok(! $e, "No error on validate_if with was_valid with validated - good data");
46
47 $v = {text1 => {required => 1, validate_if => 'text2 had_error'}, text2 => {required => 1}};
48 $e = validate({}, $v);
49 ok($e, "Got error on validate_if with had_error");
50 $e = validate({text2 => 1}, $v);
51 ok(! $e, "No error on validate_if with had_error and bad_data");
52 $e = validate({text1 => 1}, $v);
53 ok($e && ! $e->as_hash->{text1_error}, "No error on validate_if with had_error and good data");
54
55
56 ### required_if
57 $v = {foo => {required_if => 'bar'}};
58 $e = validate({}, $v);
59 ok(! $e, 'required_if - false');
60
61 $e = validate({bar => 1}, $v);
62 ok($e , 'required_if - true');
63
64 ### max_values
65 $v = {foo => {required => 1}};
66 $e = validate({foo => [1,2]}, $v);
67 ok($e, 'max_values');
68
69 $v = {foo => {max_values => 2}};
70 $e = validate({}, $v);
71 ok(! $e, 'max_values');
72
73 $e = validate({foo => "str"}, $v);
74 ok(! $e, 'max_values');
75
76 $e = validate({foo => [1]}, $v);
77 ok(! $e, 'max_values');
78
79 $e = validate({foo => [1,2]}, $v);
80 ok(! $e, 'max_values');
81
82 $e = validate({foo => [1,2,3]}, $v);
83 ok($e, 'max_values');
84
85 ### min_values
86 $v = {foo => {min_values => 3, max_values => 10}};
87 $e = validate({foo => [1,2,3]}, $v);
88 ok(! $e, 'min_values');
89
90 $e = validate({foo => [1,2,3,4]}, $v);
91 ok(! $e, 'min_values');
92
93 $e = validate({foo => [1,2]}, $v);
94 ok($e, 'min_values');
95
96 $e = validate({foo => "str"}, $v);
97 ok($e, 'min_values');
98
99 $e = validate({}, $v);
100 ok($e, 'min_values');
101
102 ### enum
103 $v = {foo => {enum => [1, 2, 3]}, bar => {enum => "1 || 2||3"}};
104 $e = validate({}, $v);
105 ok($e, 'enum');
106
107 $e = validate({foo => 1, bar => 1}, $v);
108 ok(! $e, 'enum');
109
110 $e = validate({foo => 1, bar => 2}, $v);
111 ok(! $e, 'enum');
112
113 $v->{'foo'}->{'match'} = 'm/3/';
114 $e = validate({foo => 1, bar => 2}, $v);
115 ok($e, 'enum');
116 is($e, "Foo contains invalid characters.", 'enum shortcircuit');
117
118 $e = validate({foo => 4, bar => 1}, $v);
119 ok($e, 'enum');
120 is($e, "Foo is not in the given list.", 'enum shortcircuit');
121
122 # equals
123 $v = {foo => {equals => 'bar'}};
124 $e = validate({}, $v);
125 ok(! $e, 'equals');
126
127 $e = validate({foo => 1}, $v);
128 ok($e, 'equals');
129
130 $e = validate({bar => 1}, $v);
131 ok($e, 'equals');
132
133 $e = validate({foo => 1, bar => 2}, $v);
134 ok($e, 'equals');
135
136 $e = validate({foo => 1, bar => 1}, $v);
137 ok(! $e, 'equals');
138
139 $v = {foo => {equals => '"bar"'}};
140 $e = validate({foo => 1, bar => 1}, $v);
141 ok($e, 'equals');
142
143 $e = validate({foo => 'bar', bar => 1}, $v);
144 ok(! $e, 'equals');
145
146 ### min_len
147 $v = {foo => {min_len => 10}};
148 $e = validate({}, $v);
149 ok($e, 'min_len');
150
151 $e = validate({foo => ""}, $v);
152 ok($e, 'min_len');
153
154 $e = validate({foo => "123456789"}, $v);
155 ok($e, 'min_len');
156
157 $e = validate({foo => "1234567890"}, $v);
158 ok(! $e, 'min_len');
159
160 ### max_len
161 $v = {foo => {max_len => 10}};
162 $e = validate({}, $v);
163 ok(! $e, 'max_len');
164
165 $e = validate({foo => ""}, $v);
166 ok(! $e, 'max_len');
167
168 $e = validate({foo => "1234567890"}, $v);
169 ok(! $e, 'max_len');
170
171 $e = validate({foo => "12345678901"}, $v);
172 ok($e, 'max_len');
173
174 ### match
175 $v = {foo => {match => qr/^\w+$/}};
176 $e = validate({foo => "abc"}, $v);
177 ok(! $e, 'match');
178
179 $e = validate({foo => "abc."}, $v);
180 ok($e, 'match');
181
182 $v = {foo => {match => [qr/^\w+$/, qr/^[a-z]+$/]}};
183 $e = validate({foo => "abc"}, $v);
184 ok(! $e, 'match');
185
186 $e = validate({foo => "abc1"}, $v);
187 ok($e, 'match');
188
189 $v = {foo => {match => 'm/^\w+$/'}};
190 $e = validate({foo => "abc"}, $v);
191 ok(! $e, 'match');
192
193 $e = validate({foo => "abc."}, $v);
194 ok($e, 'match');
195
196 $v = {foo => {match => 'm/^\w+$/ || m/^[a-z]+$/'}};
197 $e = validate({foo => "abc"}, $v);
198 ok(! $e, 'match');
199
200 $e = validate({foo => "abc1"}, $v);
201 ok($e, 'match');
202
203 $v = {foo => {match => '! m/^\w+$/'}};
204 $e = validate({foo => "abc"}, $v);
205 ok($e, 'match');
206
207 $e = validate({foo => "abc."}, $v);
208 ok(! $e, 'match');
209
210 $v = {foo => {match => 'm/^\w+$/'}};
211 $e = validate({}, $v);
212 ok($e, 'match');
213
214 $v = {foo => {match => '! m/^\w+$/'}};
215 $e = validate({}, $v);
216 ok(! $e, 'match');
217
218 ### compare
219 $v = {foo => {compare => '> 0'}};
220 $e = validate({}, $v);
221 ok($e, 'compare');
222 $v = {foo => {compare => '== 0'}};
223 $e = validate({}, $v);
224 ok(! $e, 'compare');
225 $v = {foo => {compare => '< 0'}};
226 $e = validate({}, $v);
227 ok($e, 'compare');
228
229 $v = {foo => {compare => '> 10'}};
230 $e = validate({foo => 11}, $v);
231 ok(! $e, 'compare');
232 $e = validate({foo => 10}, $v);
233 ok($e, 'compare');
234
235 $v = {foo => {compare => '== 10'}};
236 $e = validate({foo => 11}, $v);
237 ok($e, 'compare');
238 $e = validate({foo => 10}, $v);
239 ok(! $e, 'compare');
240
241 $v = {foo => {compare => '< 10'}};
242 $e = validate({foo => 9}, $v);
243 ok(! $e, 'compare');
244 $e = validate({foo => 10}, $v);
245 ok($e, 'compare');
246
247 $v = {foo => {compare => '>= 10'}};
248 $e = validate({foo => 10}, $v);
249 ok(! $e, 'compare');
250 $e = validate({foo => 9}, $v);
251 ok($e, 'compare');
252
253 $v = {foo => {compare => '!= 10'}};
254 $e = validate({foo => 10}, $v);
255 ok($e, 'compare');
256 $e = validate({foo => 9}, $v);
257 ok(! $e, 'compare');
258
259 $v = {foo => {compare => '<= 10'}};
260 $e = validate({foo => 11}, $v);
261 ok($e, 'compare');
262 $e = validate({foo => 10}, $v);
263 ok(! $e, 'compare');
264
265
266 $v = {foo => {compare => 'gt ""'}};
267 $e = validate({}, $v);
268 ok($e, 'compare');
269 $v = {foo => {compare => 'eq ""'}};
270 $e = validate({}, $v);
271 ok(! $e, 'compare');
272 $v = {foo => {compare => 'lt ""'}};
273 $e = validate({}, $v);
274 ok($e, 'compare'); # 68
275
276 $v = {foo => {compare => 'gt "c"'}};
277 $e = validate({foo => 'd'}, $v);
278 ok(! $e, 'compare');
279 $e = validate({foo => 'c'}, $v);
280 ok($e, 'compare');
281
282 $v = {foo => {compare => 'eq c'}};
283 $e = validate({foo => 'd'}, $v);
284 ok($e, 'compare');
285 $e = validate({foo => 'c'}, $v);
286 ok(! $e, 'compare');
287
288 $v = {foo => {compare => 'lt c'}};
289 $e = validate({foo => 'b'}, $v);
290 ok(! $e, 'compare');
291 $e = validate({foo => 'c'}, $v);
292 ok($e, 'compare');
293
294 $v = {foo => {compare => 'ge c'}};
295 $e = validate({foo => 'c'}, $v);
296 ok(! $e, 'compare');
297 $e = validate({foo => 'b'}, $v);
298 ok($e, 'compare');
299
300 $v = {foo => {compare => 'ne c'}};
301 $e = validate({foo => 'c'}, $v);
302 ok($e, 'compare');
303 $e = validate({foo => 'b'}, $v);
304 ok(! $e, 'compare');
305
306 $v = {foo => {compare => 'le c'}};
307 $e = validate({foo => 'd'}, $v);
308 ok($e, 'compare');
309 $e = validate({foo => 'c'}, $v);
310 ok(! $e, 'compare'); # 80
311
312 ### sql
313 ### can't really do anything here without prompting for a db connection
314
315 ### custom
316 my $n = 1;
317 $v = {foo => {custom => $n}};
318 $e = validate({}, $v);
319 ok(! $e, 'custom');
320 $e = validate({foo => "str"}, $v);
321 ok(! $e, 'custom');
322
323 $n = 0;
324 $v = {foo => {custom => $n}};
325 $e = validate({}, $v);
326 ok($e, 'custom');
327 $e = validate({foo => "str"}, $v);
328 ok($e, 'custom');
329
330 $n = sub { my ($key, $val) = @_; return defined($val) ? 1 : 0};
331 $v = {foo => {custom => $n}};
332 $e = validate({}, $v);
333 ok($e, 'custom');
334 $e = validate({foo => "str"}, $v);
335 ok(! $e, 'custom');
336
337 $e = validate({foo => "str"}, {foo => {custom => sub { my ($k, $v) = @_; die "Always fail ($v)\n" }}});
338 ok($e, 'Got an error');
339 is($e->as_hash->{'foo_error'}, "Always fail (str)", "Passed along the message from die");
340
341 ### type checks
342 $v = {foo => {type => 'ip', match => 'm/^203\./'}};
343 $e = validate({foo => '209.108.25'}, $v);
344 ok($e, 'type ip');
345 is($e, 'Foo did not match type ip.', 'type ip'); # make sure they short circuit
346 $e = validate({foo => '209.108.25.111'}, $v);
347 ok($e, 'type ip - but had match error');
348 is($e, 'Foo contains invalid characters.', 'type ip');
349 $e = validate({foo => '203.108.25.111'}, $v);
350 ok(! $e, 'type ip');
351
352 $v = {foo => {type => 'domain'}};
353 $e = validate({foo => 'bar.com'}, $v);
354 ok(! $e, 'type domain');
355 $e = validate({foo => 'bing.bar.com'}, $v);
356 ok(! $e, 'type domain');
357 $e = validate({foo => 'bi-ng.com'}, $v);
358 ok(! $e, 'type domain');
359 $e = validate({foo => '123456789012345678901234567890123456789012345678901234567890123.com'}, $v);
360 ok(! $e, 'type domain');
361
362 $e = validate({foo => 'com'}, $v);
363 ok($e, 'type domain');
364 $e = validate({foo => 'bi-.com'}, $v);
365 ok($e, 'type domain');
366 $e = validate({foo => 'bi..com'}, $v);
367 ok($e, 'type domain');
368 $e = validate({foo => '1234567890123456789012345678901234567890123456789012345678901234.com'}, $v);
369 ok($e, 'type domain');
370
371 ok(!validate({n => $_}, {n => {type => 'num'}}), "Type num $_") for qw(0 2 23 -0 -2 -23 0.0 .1 0.1 0.10 1.0 1.01);
372 ok(!validate({n => $_}, {n => {type => 'int'}}), "Type int $_") for qw(0 2 23 -0 -2 -23 2147483647 -2147483648);
373 ok(!validate({n => $_}, {n => {type => 'uint'}}), "Type uint $_") for qw(0 2 23 4294967295);
374 ok(validate({n => $_}, {n => {type => 'num'}}), "Type num invalid $_") for qw(0a a2 -0a 0..0 00 001 1.);
375 ok(validate({n => $_}, {n => {type => 'int'}}), "Type int invalid $_") for qw(1.1 0.1 0.0 -1.1 0a a2 a 00 001 2147483648 -2147483649);
376 ok(validate({n => $_}, {n => {type => 'uint'}}), "Type uint invalid $_") for qw(-1 -0 1.1 0.1 0.0 -1.1 0a a2 a 00 001 4294967296);
377
378 ### min_in_set checks
379 $v = {foo => {min_in_set => '2 of foo bar baz', max_values => 5}};
380 $e = validate({foo => 1}, $v);
381 ok($e, 'min_in_set');
382 $e = validate({foo => 1, bar => 1}, $v);
383 ok(! $e, 'min_in_set');
384 $e = validate({foo => 1, bar => ''}, $v); # empty string doesn't count as value
385 ok($e, 'min_in_set');
386 $e = validate({foo => 1, bar => 0}, $v);
387 ok(! $e, 'min_in_set');
388 $e = validate({foo => [1, 2]}, $v);
389 ok(! $e, 'min_in_set');
390 $e = validate({foo => [1]}, $v);
391 ok($e, 'min_in_set');
392 $v = {foo => {min_in_set => '2 foo bar baz', max_values => 5}};
393 $e = validate({foo => 1, bar => 1}, $v);
394 ok(! $e, 'min_in_set');
395
396 ### max_in_set checks
397 $v = {foo => {max_in_set => '2 of foo bar baz', max_values => 5}};
398 $e = validate({foo => 1}, $v);
399 ok(! $e, 'max_in_set');
400 $e = validate({foo => 1, bar => 1}, $v);
401 ok(! $e, 'max_in_set');
402 $e = validate({foo => 1, bar => 1, baz => 1}, $v);
403 ok($e, 'max_in_set');
404 $e = validate({foo => [1, 2]}, $v);
405 ok(! $e, 'max_in_set');
406 $e = validate({foo => [1, 2, 3]}, $v);
407 ok($e, 'max_in_set');
408
409 ### validate_if revisited (but negated - uses max_in_set)
410 $v = {foo => {required => 1, validate_if => '! bar'}};
411 $e = validate({}, $v);
412 ok($e, 'validate_if - negated');
413
414 $e = validate({bar => 1}, $v);
415 ok(! $e, 'validate_if - negated');
416
417 ### default value
418 my $f = {};
419 $v = {foo => {required => 1, default => 'hmmmm'}};
420 $e = validate($f, $v);
421 ok(! $e, 'default');
422
423 ok($f->{foo} && $f->{foo} eq 'hmmmm', 'had right default');
424
This page took 0.049795 seconds and 4 git commands to generate.