#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use Test::Exception;
use Role::Tiny;
use Catmandu::ArrayIterator;
my $pkg;
BEGIN {
$pkg = 'Catmandu::Validator';
use_ok $pkg;
}
require_ok $pkg;
{
package T::ValidatorWithoutValidateHash;
use Moo;
package T::Validator;
use Moo;
with $pkg;
sub validate_data {
$_[1]->{field} =~ /^1|7$/ ? undef : ["Value is not 1"];
}
}
throws_ok {
Role::Tiny->apply_role_to_package('T::ValidatorWithoutValidateOne', $pkg)
}
qr/missing validate_data/;
my $e = T::Validator->new;
can_ok $e, 'is_valid';
can_ok $e, 'validate';
# throw:: TODO make sure it is a hash for single one.
throws_ok {$e->validate(1)} qr/Cannot validate data of this type/;
#
my $href0 = {field => 0};
my $href1 = {field => 1};
is $e->validate($href1), $href1, 'validate() - success';
is $e->validate($href0), undef, 'validate() - fails';
is_deeply($e->last_errors, ['Value is not 1'], 'last_errors returns errors');
is $e->is_valid($href1), 1, 'is_valid returns 1';
is $e->is_valid($href0), 0, 'is_valid returns 0';
my $after_callback_called = 0;
$e = T::Validator->new(
after_callback => sub {$after_callback_called = 1, $_[0]});
is $e->validate($href1), $href1, 'validate, after_callback - success';
is $after_callback_called, 1, 'validate, after_callback - called';
my $arr
= $e->validate([{field => 2}, {field => 1}, {field => 0}, {field => 3}]);
is $e->valid_count, 1, 'valid_count';
is $e->invalid_count, 3, 'invalid_count';
my $error_field = '_validation_errors';
my $validation_error_message = "Value is not 1";
my $e_efield = T::Validator->new(error_field => 1);
is_deeply $e_efield->validate([{field => 5}, {field => 3}, {field => 1}]),
[
{field => 5, $error_field => [$validation_error_message]},
{field => 3, $error_field => [$validation_error_message]},
{field => 1}
],
'validate, error_field 1';
my $error_field_new = 'my_error';
$e_efield = T::Validator->new(error_field => $error_field_new);
is_deeply $e_efield->validate([{field => 6}, {field => 3}, {field => 1}]),
[
{field => 6, $error_field_new => [$validation_error_message]},
{field => 3, $error_field_new => [$validation_error_message]},
{field => 1}
],
'validate, error_field 2';
my @invalid_array;
my $validator = T::Validator->new(
after_callback => sub {
my ($hashref, $errors) = @_;
if ($errors) {
$hashref->{errors} = $errors;
push @invalid_array, $hashref;
return;
}
else {
$hashref->{valid} = 1;
}
$hashref;
}
);
my $passed_array
= $validator->validate([{field => 3}, {field => 1}, {field => 2}]);
is_deeply $passed_array, [{field => 1, valid => 1}],
'validate, after_callback - valid';
is_deeply \@invalid_array,
[
{field => 3, errors => [$validation_error_message]},
{field => 2, errors => [$validation_error_message]},
],
'validate, after_callback - invalid';
my $x = 0;
@invalid_array = ();
$validator
= T::Validator->new(error_callback => sub {push @invalid_array, $_[0]});
$passed_array
= $validator->validate([{field => 1}, {field => 8}, {field => 9}]);
is_deeply $passed_array, [{field => 1}],
'validate (array) - valid records returned';
is_deeply \@invalid_array, [{field => 8}, {field => 9}],
'validate - invalid records returned';
# test iterator
my $it = Catmandu::ArrayIterator->new(
[{field => 1}, {field => 8}, {field => 7}]);
$validator = T::Validator->new;
my $new_it = $validator->validate($it);
is_deeply $new_it->to_array, [{field => 1}, {field => 7}],
'validate (iterator) - iterator returned';
done_testing 22;