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

plan tests => 19;

# simple before filter
{
    my $i = 0;

    hook before => sub { content_type('text/xhtml'); };
    hook before => sub {
        if ( request->path_info eq '/redirect_from' ) {
            redirect('/redirect_to');
        }
        elsif( request->path_info eq '/' or request->path eq '/somewhere' ){
            params->{number} = 42;
            var notice => "I am here";
            request->path_info('/');
        }
    };

    get '/' => sub {
        is( params->{number}, 42,             "params->{number} is set" );
        is( "I am here",      vars->{notice}, "vars->{notice} is set" );
        return 'index';
    };

    get '/redirect_from' => sub { $i++; };

    route_exists       [ GET => '/' ];
    response_status_is [ GET => '/' ] => 200;

    my $path = '/somewhere';
    my $request = [ GET => $path ];

    route_doesnt_exist $request => "there is no route handler for $path...";

    response_status_is  $request => 200,
      "...but a response is returned though";
    response_content_is $request => 'index',
      "which is the result of a redirection to /";

    response_headers_include [ GET => '/redirect_from' ] => [
        'Location'     => 'http://localhost/redirect_to',
        'Content-Type' => 'text/xhtml',
    ];

    is $i, 0, 'never gone to redirect_from';
}

# filters and params
{
    hook before => sub {
        return if request->path !~ /foo/;
        ok( defined( params->{'format'} ),
            "param format is defined in before filter" );
    };

    get '/foo.:format' => sub {
        ok( defined( params->{'format'} ),
            "param format is defined in route handler" );
        1;
    };
    route_exists        [ GET => '/foo.json' ];
    response_content_is [ GET => '/foo.json' ], 1;
}

# filter and halt
{
    hook before => sub {
        unless (params->{'requested'}) {
            return halt("stopped");
        }
    };

    hook before => sub {
        unless (params->{'requested'}) {
            halt("another halt");
        }
    };

    get '/halt' => sub {
        "route"
    };

    response_content_is [GET => '/halt'], "stopped";
    response_content_is [GET => '/halt', { params => {requested => 1} }], "route";
}