The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
use Dancer ':syntax';
use Dancer::Test;
use Test::More 'tests' => 8, import => ['!pass'];

use Dancer::Route;

my $r = Dancer::Route->new(
    method => 'get',
    pattern => '/:var',
    code => sub {
        params->{'var'};
    },
);

isa_ok $r => 'Dancer::Route';

is $r->method  => 'get',   "method is 'get'";
is $r->pattern => '/:var', "pattern is '/:var'";

my $req = Dancer::Request->new_for_request(GET => '/42');
my $expected_match = { var => 42 };
my $match = $r->match($req);
is_deeply $match => $expected_match, "route matched GET /42";

$r->match_data($match);
Dancer::SharedData->request($req);
my $response = $r->run($req);
is $response->{content} => 42, "response looks good";

my $r2 = Dancer::Route->new(method => 'get',
    pattern => '/pass/:var',
    code => sub { pass;
                  # The next line is not executed, as 'pass' breaks the route workflow
                  die },
    prev => $r);

my $r3 = Dancer::Route->new(method => 'get',
    pattern => '/other/path',
    code => sub { "this is r3" },
    prev => $r2);


my $r4 = Dancer::Route->new(method => 'get',
    pattern => '/pass/:var',
    code => sub { "this is r4" },
    prev => $r3);

$req = Dancer::Request->new_for_request(GET => '/pass/42');
$expected_match = { var => 42 };
$match = $r2->match($req);
is_deeply $match => $expected_match, "route matched GET /42";

$r2->match_data($match);
Dancer::SharedData->request($req);
$r2->run($req);

$response = Dancer::SharedData->response;
is $response->{content} => 'this is r4',
    "route 2 passed, r3 skipped (dont match), r4 served the response";

setting 'public' => 't/03_route_handler/public';

my $r5 = Dancer::Route->new(
    method  => 'get',
    pattern => '/error',
    code    => sub { send_error( "no", 404 ) }
);
$req = Dancer::Request->new_for_request( GET => '/error' );
my $res = $r5->run($req);
is( ( grep { /Content-Type/ } @{ $res->headers_to_array } ),
    1, 'only one content-type' );