use strict;
use warnings;

use Test::More;

use Routes::Tiny;

subtest 'not match when contstraint fails' => sub {
    my $r = Routes::Tiny->new;

    $r->add_route(
        '/articles/:id',
        name        => 'article',
        constraints => {id => qr/\d+/}
    );

    my $m = $r->match('articles/abc');
    ok(!$m);
};

subtest 'match when contstraint is ok' => sub {
    my $r = Routes::Tiny->new;

    $r->add_route(
        '/articles/:id',
        name        => 'article',
        constraints => {id => qr/\d+/}
    );

    my $m = $r->match('articles/123');
    is_deeply($m->params, {id => 123});
    is($r->build_path('article', id => 123), '/articles/123');
};

subtest 'throws when building path with not passing constraint' => sub {
    my $r = Routes::Tiny->new;

    $r->add_route(
        '/articles/:id',
        name        => 'article',
        constraints => {id => qr/\d+/}
    );

    eval { $r->build_path('article', id => 'abc'); };
    ok($@ =~ qr/Param 'id' fails a constraint/);
};

subtest 'contraint as array' => sub {
    my $r = Routes::Tiny->new;

    $r->add_route(
        '/articles/:id',
        name        => 'article',
        constraints => {id => [qw/1 2 3/]}
    );

    ok $r->match('/articles/1');
    ok !$r->match('/articles/a');

    eval { $r->build_path('article', id => 'abc'); };
    ok($@ =~ qr/Param 'id' fails a constraint/);
};

done_testing;