The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/env perl
use strict;
use warnings;
use Test::More;
use Test::Path::Router;
use Plack::Test;

use Plack::App::Path::Router::PSGI;

{
    package Foo;
    use Moose;
    use Bread::Board;
    extends 'OX::Application';
    with 'OX::Application::Role::Router::Path::Router';

    sub app_from_router {
        my $self = shift;
        my ($router) = @_;

        return Plack::App::Path::Router::PSGI->new(
            router => $router,
        )->to_app;
    }

    sub configure_router {
        my $self = shift;
        my ($router) = @_;

        $router->add_route('/' => (
            target => sub { [200, [], ['root']] }
        ));
        $router->add_route('/:number' => (
            validations => {
                number => 'Int',
            },
            target => sub {
                my $env = shift;
                my ($num) = @{ $env->{'plack.router.match.args'} };
                return [200, [], ["got $num"]];
            }
        ));
    }
}

my $app = Foo->new;
my $router = $app->router;

path_ok($router, $_, '... ' . $_ . ' is a valid path')
    for qw[
        /
        /10
        /246
    ];

routes_ok($router, {
    ''    => {},
    '10'  => { number => 10  },
    '246' => { number => 246 },
},
"... our routes are valid");

test_psgi
    app => $app->to_app,
    client => sub {
        my $cb = shift;
        {
            my $req = HTTP::Request->new(GET => "http://localhost/");
            my $res = $cb->($req);
            is($res->content, 'root', "right content for /");
        }
        {
            my $req = HTTP::Request->new(GET => "http://localhost/10");
            my $res = $cb->($req);
            is($res->content, 'got 10', "right content for /10");
        }
        {
            my $req = HTTP::Request->new(GET => "http://localhost/246");
            my $res = $cb->($req);
            is($res->content, 'got 246', "right content for /246");
        }
    };

done_testing;