The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use lib ( '.', '../t', 't/' );
use Test::More tests => 8;
use Data::FormValidator;

my $input_profile = {
  validator_packages => 'ValidatorPackagesTest1',
  required           => [ 'required_1', 'required_2', 'required_3' ],
  constraints        => {
    required_1 => 'single_validator_success_expected',
    required_2 => 'single_validator_failure_expected',
  },
  field_filters => {
    required_3 => 'single_filter_remove_whitespace',
  },
};

my $validator = new Data::FormValidator( { default => $input_profile } );

my $input_hashref = {
  required_1 => 123,
  required_2 => 'testing',
  required_3 => '  has whitespace  ',
};

my ( $valids, $missings, $invalids, $unknowns );

eval {
  ( $valids, $missings, $invalids, $unknowns ) =
    $validator->validate( $input_hashref, 'default' );
};
ok( not $@ )
  or diag "eval error: $@";

ok( defined $valids->{required_1} );

# Test to make sure that the field failed imported validator
ok( grep /required_2/, @$invalids );

ok( defined $valids->{required_3} );

is( $valids->{required_3}, 'has whitespace' );

#### Now test importing from multiple packages

$input_profile = {
  validator_packages => [ 'ValidatorPackagesTest1', 'ValidatorPackagesTest2' ],
  required           => [ 'required_1',             'required_2' ],
  constraints        => {
    required_1 => 'single_validator_success_expected',
    required_2 => 'multi_validator_success_expected',
  },
};

$validator = new Data::FormValidator( { default => $input_profile } );

$input_hashref = {
  required_1 => 123,
  required_2 => 'testing',
};

eval {
  ( $valids, $missings, $invalids, $unknowns ) =
    $validator->validate( $input_hashref, 'default' );
};

ok( defined $valids->{required_1} );

ok( defined $valids->{required_2} );

# Now test calling 'validate' as a class method
use Data::FormValidator;

eval {
  my ( $valid, $missing, $invalid ) = Data::FormValidator->validate(
    $input_hashref,
    {
      required           => [qw/required_1/],
      validator_packages => 'Data::FormValidator',
    } );
};
ok( not $@ );