App-MtAws
view release on metacpan or search on metacpan
t/integration/config_engine_definitions.t view on Meta::CPAN
#!/usr/bin/env perl
# mt-aws-glacier - Amazon Glacier sync client
# Copyright (C) 2012-2014 Victor Efimov
# http://mt-aws.com (also http://vs-dev.com) vs@vs-dev.com
# License: GPLv3
#
# This file is part of "mt-aws-glacier"
#
# mt-aws-glacier is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# mt-aws-glacier is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
use strict;
use warnings;
use utf8;
use open qw/:std :utf8/;
use Encode;
use Test::More tests => 384;
use Test::Deep;
use FindBin;
use lib map { "$FindBin::RealBin/$_" } qw{../lib ../../lib};
use TestUtils 'w_fatal';
use App::MtAws::ConfigEngine;
use Carp;
use Data::Dumper;
no warnings 'redefine';
# validation
{
my $c = create_engine();
$c->define(sub {
option('myoption');
validation 'myoption', message('too_high', "%option a% should be less than 30"), sub { $_ < 30 };
command 'mycommand' => sub { validate(optional('myoption')), ok !valid('myoption'); };
});
my $res = $c->parse_options('mycommand', '-myoption', 31);
cmp_deeply $res->{error_texts}, [q{"--myoption" should be less than 30}], "validation should work";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'myoption', value => 31}], "validation should work";
}
{
my $c = create_engine();
$c->define(sub {
option('myoption', alias => 'old');
validation 'myoption', message('too_high', "%option a% should be less than 30"), sub { $_ < 30 };
command 'mycommand' => sub { validate optional('myoption') };
});
my $res = $c->parse_options('mycommand', '-old', 31);
cmp_deeply $res->{error_texts}, [q{"--old" should be less than 30}], "validation should work with alias";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'old', value => 31}], "validation should work with alias";
}
{
my $c = create_engine();
$c->define(sub {
option('myoption', deprecated => 'old');
validation 'myoption', message('too_high', "%option a% should be less than 30"), sub { $_ < 30 };
command 'mycommand' => sub { validate optional('myoption') };
});
my $res = $c->parse_options('mycommand', '-old', 31);
cmp_deeply $res->{error_texts}, [q{"--old" should be less than 30}], "validation should work with deprecated";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'old', value => 31}], "validation should work with deprecated";
}
{
my $c = create_engine();
$c->define(sub {
validation option('myoption'), message('too_high', "%option a% should be less than 30"), sub { $_ < 30 };
command 'mycommand' => sub { validate(optional('myoption')), ok !valid('myoption'); };
});
my $res = $c->parse_options('mycommand', '-myoption', 31);
cmp_deeply $res->{error_texts}, [q{"--myoption" should be less than 30}], "validation should work with option inline";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'myoption', value => 31}], "validation should work with option inline";
}
{
my $c = create_engine(override_validations => { myoption => undef });
$c->define(sub {
validation option('myoption'), message('too_high', "%option a% should be less than 30"), sub { $_ < 30 };
command 'mycommand' => sub { validate(optional('myoption')), ok valid('myoption'); };
});
my $res = $c->parse_options('mycommand', '-myoption', 31);
ok !defined($res->{errors} || $res->{error_texts});
}
{
my $c = create_engine();
$c->define(sub {
ok ! defined eval { validation 'myoption', message('too_high', "%option a% should be less than 30"), sub { $_ < 30 }; 1; },
"validation should die if option undeclared"
});
}
{
my $c = create_engine();
$c->define(sub {
validation option('myoption'), message('too_high', "%option a% should be less than 30"), stop => 1, sub { $_ < 30 };
validation 'myoption', message('way_too_high', "%option a% should be less than 100 for sure"), sub { $_ < 100 };
command 'mycommand' => sub { validate optional('myoption') };
});
my $res = $c->parse_options('mycommand', '-myoption', 200);
cmp_deeply $res->{error_texts}, [q{"--myoption" should be less than 30}], "should not perform two validations";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'myoption', value => 200}], "should not perform two validations";
}
{
my $c = create_engine();
$c->define(sub {
validation option('myoption'), message('too_high', "%option a% should be less than 30"), stop => 0, sub { $_ < 30 };
validation 'myoption', message('way_too_high', "%option a% should be less than 100 for sure"), sub { $_ < 100 };
command 'mycommand' => sub { validate optional('myoption') };
});
my $res = $c->parse_options('mycommand', '-myoption', 200);
cmp_deeply $res->{error_texts}, [q{"--myoption" should be less than 30}, q{"--myoption" should be less than 100 for sure}],
"should perform two validations";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'myoption', value => 200},
{format => 'way_too_high', a => 'myoption', value => 200}], "should perform two validations";
}
{
my $c = create_engine();
$c->define(sub {
validation option('myoption'), message('way_too_high', "%option a% should be less than 100 for sure"), sub { $_ < 100 };
validation 'myoption', message('too_high', "%option a% should be less than 30"), sub { $_ < 30 };
command 'mycommand' => sub { validate optional('myoption') };
});
my $res = $c->parse_options('mycommand', '-myoption', 42);
cmp_deeply $res->{error_texts}, [q{"--myoption" should be less than 30}], "should perform 2nd validation";
cmp_deeply $res->{errors}, [{format => 'too_high', a => 'myoption', value => 42}], "should perform 2nd validations";
}
# mandatory
{
my $c = create_engine();
$c->define(sub {
message 'mandatory', "Please specify %option a%";
options('myoption', 'myoption2');
command 'mycommand' => sub { mandatory('myoption'), optional('myoption2') };
});
my $res = $c->parse_options('mycommand', '-myoption2', 31);
cmp_deeply $res->{error_texts}, [q{Please specify "--myoption"}], "mandatory should work";
cmp_deeply $res->{errors}, [{format => 'mandatory', a => 'myoption'}], "mandatory should work";
}
{
my $c = create_engine();
$c->define(sub {
message 'mandatory', "Please specify %option a%";
options('myoption', 'myoption2', 'myoption3');
command 'mycommand' => sub { mandatory('myoption', 'myoption3'), optional('myoption2') };
});
my $res = $c->parse_options('mycommand', '-myoption2', 31);
cmp_deeply $res->{error_texts}, [q{Please specify "--myoption"}, q{Please specify "--myoption3"}], "should perform first mandatory check out of two";
cmp_deeply $res->{errors}, [{format => 'mandatory', a => 'myoption'}, {format => 'mandatory', a => 'myoption3'}], "should perform first mandatory check out of two";
}
{
my $c = create_engine();
$c->define(sub {
message 'mandatory', "Please specify %option a%";
options('myoption', 'myoption2', 'myoption3');
command 'mycommand' => sub { mandatory(optional('myoption'), 'myoption3'), optional 'myoption2' };
});
my $res = $c->parse_options('mycommand', '-myoption2', 31);
cmp_deeply $res->{error_texts}, [q{Please specify "--myoption3"}], "mandatory should work if inner optional() exists";
cmp_deeply $res->{errors}, [{format => 'mandatory', a => 'myoption3'}], "mandatory should work if inner optional() exists";
}
{
my $c = create_engine();
$c->define(sub {
message 'mandatory', "Please specify %option a%";
options('myoption', 'myoption2', 'myoption3');
command 'mycommand' => sub { mandatory(mandatory('myoption'), 'myoption3'), optional('myoption2') };
});
my $res = $c->parse_options('mycommand', '-myoption2', 31);
cmp_deeply $res->{error_texts}, [q{Please specify "--myoption"}, q{Please specify "--myoption3"}], "nested mandatoy should work";
cmp_deeply $res->{errors}, [{format => 'mandatory', a => 'myoption'}, {format => 'mandatory', a => 'myoption3'}], "nested mandatoy should work";
}
{
my $c = create_engine();
( run in 0.803 second using v1.01-cache-2.11-cpan-437f7b0c052 )