The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
BEGIN {
  package Dancer2::Plugin::Plugin1;
  use Dancer2::Plugin;

    has one => (
      is => 'ro',
      default => sub { 'uno' },
      plugin_keyword => 1,
    );

    plugin_hooks 'un';
}

BEGIN {
  package Dancer2::Plugin::Plugin2;
  use Dancer2::Plugin;

    has two => (
      is => 'ro',
      default => sub { 'dos' },
      plugin_keyword => 1,
    );

    plugin_hooks 'deux';

}

use Test::More;

my %tests = (
    'Plugin1' => { keywords => [ 'one' ], hooks => [ 'un' ] },
    'Plugin2' => { keywords => [ 'two' ], hooks => [ 'deux' ] },
);

subtest $_ => sub {
    my $plugin = join '::', 'Dancer2', 'Plugin', $_;

    is_deeply [ keys %{ $plugin->keywords } ] => $tests{$_}{keywords}, 'keywords';
    is_deeply [ @{ $plugin->ClassHooks } ] => $tests{$_}{hooks}, 'hooks';

} for sort keys %tests;


subtest app_side => sub {
    package MyApp;

    use Dancer2 '!pass';
    use Dancer2::Plugin::Plugin1;
    use Dancer2::Plugin::Plugin2;

    use Test::More;

    Test::More::is one() => 'uno', 'from plugin1';
    Test::More::is two() => 'dos', 'from plugin2';

    is_deeply { map { ref $_ => [ keys %{ $_->hooks } ] } @{ app()->plugins } },
        {
            'Dancer2::Plugin::Plugin1' => [ 'plugin.plugin1.un' ],
            'Dancer2::Plugin::Plugin2' => [ 'plugin.plugin2.deux' ],
        };
};

done_testing();