use Data::FormValidator;
use Test::More tests => 8;
use strict;
use lib ('.','../t');
my $input_profile = {
required => ['my_zipcode_field'],
constraints => {
my_zipcode_field => [
'zip',
{
constraint => '/^406/',
name => 'starts_with_406',
}
],
},
};
my $validator = new Data::FormValidator({default => $input_profile});
my $input_hashref = {
my_zipcode_field => '402015', # born to lose
};
my ($valids, $missings, $invalids, $unknowns);
eval{
($valids, $missings, $invalids, $unknowns) = $validator->validate($input_hashref, 'default');
};
ok(!$@, 'survived eval');
ok((grep { (ref $_) eq 'ARRAY' } @$invalids));
# Test that the array ref in the invalids array contains three elements,
my @zip_failures;
for (@$invalids) {
if (ref $_ eq 'ARRAY') {
if (scalar @$_ == 3) {
@zip_failures = @$_;
# This is cheesy, and could be further refactored.
ok(1);
last;
}
}
}
# Test that the first element of the array is 'my_zipcode_field'
my $t = shift @zip_failures;
ok($t eq 'my_zipcode_field');
# Test that the two elements are 'zip' and 'starts_with_406'
ok(eq_set(\@zip_failures, [qw/zip starts_with_406/]));
# The next three tests are to confirm that an input field is deleted
# from the valids under the following conditions
# 1. the input field has multiple constraints
# 2. one or more constraint fails
my %data = (
multiple => 'to fail',
#multiple => [qw{this multi-value input will fail on the constraint below}],
single => 'to pass',
);
my %profile = (
required => [qw/
multiple
single
/],
constraints => {
multiple => [
{ name => 'constraint_1', constraint => qr/\w/ }, # pass
{ name => 'constraint_2', constraint => qr/\d/ }, # force fail
],
},
);
my $results = Data::FormValidator->check(\%data, \%profile);
ok(!$results->valid('multiple'), "expect 'multiple' not to appear in valid");
is_deeply($results->invalid('multiple'), ['constraint_2'], "list of failed constraints for 'multiple'");
is($results->valid('single'), 'to pass', "single is valid");