The Perl Toolchain Summit 2025 Needs You: You can help 🙏 Learn more

use strict;
use Data::DynamicValidator qw/validator/;
subtest 'no-rebase-on-empty-path' => sub {
my $rebase_rule_called = 0;
my $errors = validator({})->rebase('/a' => sub {
$rebase_rule_called = 1;
})->errors;
is_deeply $errors, [], "no errors";
is $rebase_rule_called, 0, "no rebase rule has been called";
};
subtest 'rebase-simple' => sub {
my $data = [
{
a => {
b => [1],
c => {
dd => { v1 => 2 },
ee => [ 3, 4 ],
}
},
},
{
zz => [6],
}
];
my @visited_bases;
my $errors = validator($data)->rebase('/*/*[key eq "a"]' => sub {
my $v = shift;
push @visited_bases, $v->current_base;
$v->(
on => '/b/0',
should => sub {
push @visited_bases, "/0/a/b/0";
$_[0] == 1;
},
because => '...r1...',
);
$v->rebase('/c' => sub {
my $v = shift;
push @visited_bases, $v->current_base;
$v->(
on => '/dd/v1',
should => sub {
push @visited_bases, "/0/a/c/dd/v1";
$_[0] == 2;
},
because => '...r2...',
)->(
on => '/ee/*',
should => sub {
push @visited_bases, "/0/a/c/ee";
@_ == 2 && $_[0] == 3 && $_[1] == 4;
},
because => '...r3..',
)->(
on => '//1/zz/*',
should => sub {
push @visited_bases, "/1/zz/1";
$_[0] == 6;
},
because => '...r5...',
);
});
})->(
on => '/1/zz/*',
should => sub {
push @visited_bases, "/1/zz/1";
$_[0] == 6;
},
because => '...r4...',
)->errors;
is_deeply $errors, [], "no errors";
# we have hash, so, walking order can be undertermined
@visited_bases = sort @visited_bases;
is_deeply \@visited_bases, [
"/0/a",
"/0/a/b/0",
"/0/a/c",
"/0/a/c/dd/v1",
"/0/a/c/ee",
"/1/zz/1",
"/1/zz/1",
], "visited routes with rebasing are correct";
};
done_testing;