The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package TestApp::Controller::DB;

use strict;
use warnings;
use base qw( Catalyst::Controller );

sub setup : Local {
  my ($self, $c) = @_;

  my $database = $c->model('TestDB')->database;

  if ( $database && -f $database && -s $database ) {
    $c->res->body('ok');
    return 1;
  }

  eval {
    $c->model('TestDB')->setup_database;
    die unless !$database or -f $database;

    $c->model('TestDB::User')->create(
      username  => 'joeuser',
      password  => 'hackme',
      email     => 'joeuser@nowhere.com',
      status    => 'active',
      role_text => 'admin',
    );
    $c->model('TestDB::User')->create(
      username  => 'spammer',
      password  => 'broken',
      email     => 'bob@spamhous.com',
      status    => 'disabled',
    );
    my $jayk = $c->model('TestDB::User')->create(
      username  => 'jayk',
      password  => 'letmein',
      email     => 'j@cpants.org',
      status    => 'active',
    );
    my $nuffin = $c->model('TestDB::User')->create(
      username  => 'nuffin',
      password  => 'much',
      email     => 'nada@mucho.net',
      status    => 'registered',
      role_text => 'user admin',
    );

    my $admin = $c->model('TestDB::Role')->create(
      role => 'admin',
    );
    my $user = $c->model('TestDB::Role')->create(
      role => 'user',
    );

    $c->model('TestDB::UserRole')->create(
      user => $jayk,
      role => $admin,
    );
    $c->model('TestDB::UserRole')->create(
      user => $jayk,
      role => $user,
    );
    $c->model('TestDB::UserRole')->create(
      user => $nuffin,
      role => $user,
    );
  };
  $c->detach('/error') if $@;

  $c->res->body('ok');
}

sub teardown : Local {
  my ($self, $c) = @_;

  $c->model('TestDB')->disconnect;

  my $dbfile = $c->model('TestDB')->database;
  if ( $dbfile && -f $dbfile ) {
    unlink $dbfile or $c->detach('/error');
  }

  $c->res->body('ok');
}

1;