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

subtest 'use basic Dancer::Plugin' => sub {
    use_ok 'Dancer::Plugin';
};

subtest 'global and route keywords' => sub {
    {
        use Dancer;
        use t::lib::FooPlugin;

        get '/' => sub {
            foo_wrap_request->env->{'PATH_INFO'};
        };

        get '/app' => sub { app->name };

        foo_route;
    }

    my $r = dancer_response(GET => '/');
    is($r->content, '/', 'route defined by a plugin');

    $r = dancer_response(GET => '/foo');
    is($r->content, 'foo', 'DSL keyword wrapped by a plugin');

    $r = dancer_response(GET => '/app');
    is($r->content, 'main', 'app name is correct');
};

subtest 'plugin old syntax' => sub {
    {
        use Dancer;
        use t::lib::Dancer1Plugin;

        around_get;
    }

    my $r = dancer_response GET => '/foo/plugin';
    is $r->content, 'foo plugin';
};

subtest caller_dsl => sub {
    {
        use Dancer;
        use t::lib::Dancer1Plugin;
    }

    my $r = dancer_response GET => '/sitemap';
    is $r->content, '^\/$, ^\/app$, ^\/foo$, ^\/foo\/plugin$, ^\/sitemap$';
};

subtest 'hooks in plugins' => sub {
    my $counter = 0;

    {
        use Dancer;
        use t::lib::Hookee;

        hook 'third_hook' => sub {
            var(hook => 'third hook');
        };

        hook 'start_hookee' => sub {
            'hook for plugin';
        };

        get '/hook_with_var' => sub {
            some_other();
            is var('hook') => 'third hook', "Vars preserved from hooks";
        };

        get '/hooks_plugin' => sub {
            $counter++;
            some_keyword();
        };

    }

    is $counter, 0, "the hook has not been executed";
    my $r = dancer_response(GET => '/hooks_plugin');
    is($r->content, 'hook for plugin', '... route is rendered');
    is $counter, 1, "... and the hook has been executed exactly once";

    dancer_response(GET => '/hook_with_var');
};


done_testing;