The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Dancer ':syntax', ':tests';
use Dancer::Test;
use Test::More;

plan tests => 28;

# multiple token
{
    get '/:resource/:id.:format' => sub {
        [ params->{'resource'},
          params->{'id'},
          params->{'format'} ];
    };

    my $response = dancer_response(GET => '/user/42.json');
    ok( defined($response), "response found for '/user/42.json'" );

    is_deeply( $response->content, ['user', '42', 'json'],
    "params are parsed as expected" );
}

{
    ok( get( '/'               => sub { 'index' } ),        'first route set' );
    ok( get( '/hello/:name'    => sub { param 'name' } ), 'second route set' );
    ok( get( '/hello/:foo/bar' => sub { param 'foo' } ), 'third route set' );
    ok( post( '/new/:stuff'    => sub { param 'stuff'} ), 'post 1 route set' );
    ok( post( '/allo'          => sub { request->body } ),   'post 2 route set' );

    get '/opt/:name?/?:lastname?' => sub {
        [ params->{name}, params->{lastname} ];
    };

    my @tests = (
        { method => 'GET',  path => '/',              expected => 'index' },
        { method => 'GET',  path => '/hello/sukria',  expected => 'sukria' },
        { method => 'GET',  path => '/hello/joe/bar', expected => 'joe' },
        { method => 'POST', path => '/new/wine',      expected => 'wine' },

        {
            method   => 'GET',
            path     => '/opt/',
            expected => [ undef, undef ]
        },

        {
            method   => 'GET',
            path     => '/opt/placeholder',
            expected => [ 'placeholder', undef ]
        },

        {
            method   => 'GET',
            path     => '/opt/alexis/sukrieh',
            expected => [ "alexis", "sukrieh" ]
        },
    );

    foreach my $test (@tests) {
        my $req = [ $test->{method}, $test->{path} ];

        route_exists $req;

        if ( ref( $test->{expected} ) ) {
            response_content_is_deeply $req => $test->{expected};
        }
        else {
            response_content_is $req => $test->{expected};
        }

        # splat should not be set
        ok( !exists( params->{'splat'} ),
            "splat not defined for " . $test->{path} );
    }

}