use Test::More qw/no_plan/; use strict; use Data::FormValidator; my $simple_profile = { required => [qw/req_1 req_2/], optional => [qw/opt_1/], constraints => { req_1 => 'email' }, msgs=>{}, }; my $simple_data = { req_1 => 'not_an_email', }; my $prefix_profile = { required => [qw/req_1 req_2/], optional => [qw/opt_1/], constraints => { req_1 => 'email' }, msgs=>{ prefix=>'', any_errors=>'err__', }, }; my $input_profile = { required => [ qw(admin prefork sleep rounds) ], constraints => { admin => "email", prefork => sub { my $val = shift; if ($val =~ /^\d$/) { if ($val > 1 and $val <9) { return $val; } } return 0; }, sleep => [ 'email', { name => 'min', constraint => sub { my $val = shift; if ($val > 0) { return $val; } else { return 0; } } }, { name => 'max', constraint => sub { my $val = shift; if ($val < 11) { return $val; } else { return 0; } } } ], rounds => [ { name => 'min', constraint => sub { my $val = shift; if ($val > 19) { return $val; } else { return 0; } } }, { name => 'max', constraint => sub { my $val = shift; if ($val < 101) { return $val; } else { return 0; } } } ] }, msgs => { missing => 'Test-Missing', invalid => 'Test-Invalid', invalid_seperator=> ' ## ', constraints => { max => 'needs to be lesser than 11', min => 'needs to be greater than 0' }, format => 'ERROR: %s', prefix => 'error_', } }; my $validator = new Data::FormValidator({ simple => $simple_profile, default => $input_profile, prefix => $prefix_profile, }); my $input_hashref = {admin=> 'invalidemail', prefork=> 9, sleep => 11, rounds=>8}; my $results; eval{ $results = $validator->check($simple_data, 'simple'); }; ok (not $@); TODO: { local $TODO= 'need to test for msgs() called before validate'; # msgs() should return emit a warning and return undef if the hash # structure it points to is undefined. However, if it points to an # empty hash, then maybe there are just no messages. }; # testing simple msg definition, $self->msgs should be returned as a hash ref my $msgs; eval { $msgs = $results->msgs; }; ok((not $@), 'existence of msgs method' ) or diag $@; ok (ref $msgs eq 'HASH', 'invalid fields returned as hash in simple case'); like ($msgs->{req_1}, qr/Invalid/, 'default invalid message'); like ($msgs->{req_2}, qr/Missing/, 'default missing message'); like ($msgs->{req_1}, qr/span/, 'default formatting'); # testing single constraints and single error case eval{ $results = $validator->check($input_hashref, 'default'); }; is($@,'', 'survived eval'); $msgs = $results->msgs; like($msgs->{error_sleep} ,qr/lesser.*Test|Test.*lesser/, 'multiple constraints constraint definition'); eval{ $results = $validator->check($simple_data, 'prefix'); }; is($@,'','survived eval'); $msgs = $results->msgs({format => 'Control-Test: %s'}); ok(defined $msgs->{req_1}, 'using default prefix'); is(keys %$msgs, 3, 'size of msgs hash'); # 2 errors plus 1 prefix ok(defined $msgs->{err__}, 'any_errors'); like($msgs->{req_1},qr/Control/,'passing controls to method'); # See what happens when msgs is called with it does not appeare in the profile my @basic_input = ( { field_1 => 'email', }, { required => 'field_1', }); $results = Data::FormValidator->check(@basic_input); eval { $results->msgs }; ok ((not $@), 'calling msgs method without hash definition'); ### { my $test_name = 'Spelling "separator" correctly should work OK.'; my $results = Data::FormValidator->check( { field => 'value', }, { required => [qw/field/], constraints => { field => ['email','province'], }, msgs => { invalid_separator=> ' ## ', }, } ); my $msgs = $results->msgs; like($msgs->{field},qr/##/,$test_name); } ### { my $test_name = 'A callback can be used for msgs'; my $results = Data::FormValidator->check( { field => 'value', }, { required => [qw/field/], constraints => { field => ['email','province'], }, msgs => sub { { field => 'callback!' } }, } ); my $msgs = $results->msgs; like($msgs->{field},qr/callback/,$test_name); }