The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use FindBin '$Bin';
use lib "$Bin/../lib";
use lib "$Bin";

use Test::More 'no_plan';
# For testing purposes we need to import all the P::V type functions
# into the current namespace. They are already in the name space of whatever
# cgi::app class using the plugin (and indeed could be accessed here via
# $t_obj->SCALAR and such).
use Params::Validate ':all';

use TestAppWithoutLogger;

use strict;
use warnings;

use CGI;
my $t_obj = TestAppWithoutLogger->new(
    QUERY => CGI->new(
        'one=1&two=two&three=123&four=1da23&five=&six=1&six=2&six=3'
    ),
);

# Reality Check tests for correctly set query object.
is($t_obj->query->param('one'), 1, 'Reality check: Query properly set?');
is($t_obj->query->param('two'), 'two', 'Reality check: Query properly set?');
is($t_obj->query->param('three'), 123, 'Reality check: Query properly set?');
is($t_obj->query->param('four'), '1da23', 'Reality check: Query properly set?');
is($t_obj->query->param('five'), '', 'Reality check: Query properly set?');
my @value = $t_obj->query->param('six');
my @test = (1,2,3);
is(@value, @test, 'Reality check: Query properly set?');

$t_obj->validate_query_config(
    error_mode => 'fail_mode'
);

eval {
    $t_obj->validate_query(
        one   => { type=>SCALAR, optional=>0   },
        two   => { type=>SCALAR, optional=>0   },
        three => { type=>SCALAR, optional=>0,
                   regex=>qr/^\d+$/            },
        four  => { type=>SCALAR, optional=>1,
                   regex=>qr/^[\d\w]+$/        },
        five  => { type=>SCALAR, optional=>0   },
        six   => { type=>ARRAYREF, optional=>0 }
    );
};
is($@, '', "Successful validation");

eval {
    my $output = $t_obj->validate_query(
        one   => { type=>SCALAR, optional=>0   },
        two   => { type=>SCALAR, optional=>0   },
        three => { type=>SCALAR, optional=>0,
                   regex=>qr/^\d\d$/            }, # error
        four  => { type=>SCALAR, optional=>1,
                   regex=>qr/^[\d\w]+$/        },
        five  => { type=>SCALAR, optional=>0   },
        six   => { type=>ARRAYREF, optional=>0 }
    );
};
like($@, qr/did not pass/, "Unsuccessful validation");
is($t_obj->error_mode(), $t_obj->{__CAP_VALQUERY_ERROR_MODE}, 
    'Correct error mode on fail?');

# Testing with default values.
$t_obj->validate_query_config();

eval {
    $t_obj->validate_query(
        one   => { type=>SCALAR, optional=>0   },
        two   => { type=>SCALAR, optional=>0   },
        three => { type=>SCALAR, optional=>0,
                   regex=>qr/^\d+$/            },
        four  => { type=>SCALAR, optional=>1,
                   regex=>qr/^[\d\w]+$/        },
        five  => { type=>SCALAR, optional=>0   },
        six   => { type=>ARRAYREF, optional=>0 }
    );
};
is($@, '', "Successful validation");

eval {
    $t_obj->validate_query(
        one   => { type=>SCALAR, optional=>0   },
        two   => { type=>SCALAR, optional=>0   },
        three => { type=>SCALAR, optional=>0,
                   regex=>qr/^\d\d$/            }, # error
        four  => { type=>SCALAR, optional=>1,
                   regex=>qr/^[\d\w]+$/        },
        five  => { type=>SCALAR, optional=>0   },
        six   => { type=>ARRAYREF, optional=>0 }
    );
};
like($@, qr/did not pass/, "Unsuccessful validation");
is($t_obj->error_mode(), $t_obj->{__CAP_VALQUERY_ERROR_MODE}, 
    'Correct error mode on fail?');

$t_obj = TestAppWithoutLogger->new(
    QUERY => CGI->new(
        '&two=two&three=123'
    ),
);

$t_obj->validate_query(
    one   => { type=>SCALAR, default=>410 },
    two   => { type=>SCALAR, optional=>0  },
    three => { type=>SCALAR, optional=>0  }
);

is($t_obj->query()->param('one'), 410, 'Default set?');