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;
use Plack::Test;
use HTTP::Request::Common qw(GET DELETE);
use Dancer2;
use Dancer2::Plugin::DBIC;
use DBI;
use File::Temp qw(tempfile);
use File::Spec;
use lib File::Spec->catdir( 't', 'lib' );

use TestApp;

eval { require DBD::SQLite; require DBIx::Class::Schema::Loader };
if ($@) {
    plan skip_all =>
        'DBD::SQLite and DBIx::Class::Schema::Loader required for these tests';
}

my (undef, $dbfile) = tempfile(SUFFIX => '.db');

t::lib::TestApp::set plugins => {
    DBIC => {
        foo => {
            dsn =>  "dbi:SQLite:dbname=$dbfile",
        }
    }
};

my $dbh = DBI->connect("dbi:SQLite:dbname=$dbfile");

my @sql = (
    q/create table users (id INTEGER primary key, name VARCHAR(64))/,
    q/insert into users values (1, 'sukria')/,
    q/insert into users values (2, 'bigpresh')/,
);

$dbh->do($_) for @sql;

my $app = Dancer2->runner->psgi_app;
is( ref $app, 'CODE', 'Got app' );

my $test = Plack::Test->create($app);

subtest 'root' => sub {
    my $res = $test->request( GET '/' );

    like(
        $res->header('Content-Type'),
        qr{text/html},
        'Content-Type set up correctly',
    );

    like(
        $res->content,
        qr/2/,
        'content looks good for /',
    );
};

subtest 'user1' => sub {
    my $res = $test->request( GET '/user/1' );

    is(
        $res->status_line,
        '200 OK',
        'GET /user/1 is found',
    );

    like(
        $res->content,
        qr/sukria/,
        'content looks good for /user/1',
    );
};

subtest 'user2' => sub {
    my $res = $test->request( GET '/user/2' );

    is(
        $res->status_line,
        '200 OK',
        'GET /user/2 is found',
    );

    like(
        $res->content,
        qr/bigpresh/,
        "content looks good for /user/2",
    );
};

subtest 'delete' => sub {
    my $res = $test->request( DELETE '/user/2' );

    is(
        $res->status_line,
        '200 OK',
        'DELETE /user/2 is ok',
    );
};

subtest 'root again' => sub {
    my $res = $test->request( GET '/' );

    like(
        $res->header('Content-Type'),
        qr{text/html},
        'Content-Type set up correctly',
    );

    like(
        $res->content,
        qr/1/,
        'content looks good for /',
    );
};

unlink $dbfile;

done_testing;