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 tests => 8;

use Dancer::Session::DBIC;
use Dancer qw(:syntax :tests);

use File::Spec;
use lib File::Spec->catdir( 't', 'lib' );

use DBICx::TestDatabase;

test_session_schema('Test::Schema');
test_session_schema('Test::Custom', {resultset => 'Custom',
                                     id_column => 'customs_id',
                                     data_column => 'custom_data'});

sub test_session_schema {
    my ($schema_class, $schema_options) = @_;

    my $schema = DBICx::TestDatabase->new($schema_class);

    set session => 'DBIC';
    set session_options => {
                            %{$schema_options || {}},
                            schema => sub {return $schema},
                           };

    my $session = session->create;

    isa_ok($session, 'Dancer::Session::DBIC');

    my $session_id = session->id;

    ok(defined($session_id) && $session_id > 0, 'Testing session id')
        || diag "Session id: ", $session_id;

    session foo => 'bar';

    my $session_value = session('foo');

    ok($session_value eq 'bar', 'Testing session value')
        || diag "Session value: ", $session_value;

    # destroy session
    session->destroy;

    my $next_session_id = session->id;

    my $resultset = $schema_options->{resultset} || 'Session';
    my $ret = $schema->resultset($resultset)->find($session_id);

    ok(! defined($ret), 'Testing session destruction')
        || diag "Return value: ", $ret;
}