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 File::Temp qw(tempdir);
use lib "t/lib";

use ok qw(Dancer :syntax);
use ok qw(Dancer::Plugin::DBIC);
use ok qw(Dancer::Plugin::Auth::RBAC);
use ok qw(Dancer::Plugin::Auth::RBAC::Credentials::DBIC);
use ok qw(Dancer::Plugin::Auth::RBAC::Permissions::DBIC);

my $dir = tempdir(CLEANUP => 1);
set appdir => $dir;

my @settings = <DATA>;
set session => "Simple";
set plugins => from_yaml("@settings");

schema->deploy;

my $dbic_user = schema->resultset('User')->find({ login => "foobar" });
foreach my $args ([], [qw(foobar)], [qw(foobar warble)]) {
    my $fail = auth(@{$args});
    ok $fail->errors, "has errors, login failed";
}

my $auth = auth("foobar", "wibble");
isa_ok $auth, "Dancer::Plugin::Auth::RBAC";
ok !$auth->errors, "login successful, no errors";
my $user = session('user');

foreach (qw(id name login)) {
    is( $user->{$_}, $dbic_user->$_, "user $_" );
}

is_deeply $user->{roles}, [], "no roles";

ok $auth->revoke, "Login revoked";
ok ! session('user')->{id}, "Session user element no longer exists";

$auth = auth("barbaz", "wobble");
isa_ok $auth, "Dancer::Plugin::Auth::RBAC";
ok !$auth->errors, "2nd login successful, no errors";
$user = session('user');

is_deeply $user->{roles}, ["user"], "user roles";

ok auth->asa('user'), "asa method";
ok auth->can('products', 'view'), "can method";
ok !auth->can('products', 'update'), "user can not!";

done_testing;

__DATA__
---
DBIC:
  Auth:
    schema_class: TestSchema
    dsn: "dbi:SQLite:dbname=:memory:"
  default:
    schema_class: TestSchema
    dsn: "dbi:SQLite:dbname=:memory:"
Auth::RBAC:
  credentials:
    class: DBIC
  permissions:
    class: DBIC