DBICx-TestDatabase

 view release on metacpan or  search on metacpan

lib/DBICx/TestDatabase.pm  view on Meta::CPAN

package DBICx::TestDatabase;
use strict;
use warnings;

use File::Temp 'tempfile';

our $VERSION = '0.05';

# avoid contaminating the schema with the tempfile
my @TMPFILES;

sub new {
    my ($class, $schema_class, $opts) = @_;

    eval "require $schema_class"
      or die "failed to require $schema_class: $@";

    my $filename = ':memory:'; # use in-memory database

    if($ENV{DBIC_KEEP_TEST}){
        (undef, $filename) = tempfile;
        push @TMPFILES, $filename;
    }

    my $schema = $schema_class->connect( "DBI:SQLite:$filename", '', '',
        { sqlite_unicode => 1 } )
        or die "failed to connect to DBI:SQLite:$filename ($schema_class)";

    $schema->deploy unless $opts->{nodeploy};
    return $schema;
}

END {
    if($ENV{DBIC_KEEP_TEST}){
        print {*STDERR} "Keeping DBICx::TestDatabase databases: @TMPFILES\n";
    }
}

*connect = *new;

1;

__END__

=head1 NAME

DBICx::TestDatabase - create a temporary database from a DBIx::Class::Schema

=head1 SYNOPSIS

Given a L<DBIx::Class::Schema|DBIx::Class::Schema> at C<MyApp::Schema>,
create a test database like this:

   use DBICx::TestDatabase;
   my $schema = DBICx::TestDatabase->new('MyApp::Schema');

Then you can use C<$schema> normally:

   $schema->resultset('Blah')->create({ blah => '123' });

When your program exits, the temporary database will go away.

=head1 DESCRIPTION

This module creates a temporary SQLite database, deploys your DBIC
schema, and then connects to it.  This lets you easily test your DBIC
schema.  Since you have a fresh database for every test, you don't
have to worry about cleaning up after your tests, ordering of tests
affecting failure, etc.

=head1 METHODS

=head2 new($schema)

Loads C<$schema> and returns a connection to it.

=head2 connect

Alias for new.

=head1 ENVIRONMENT

You can control the behavior of this module at runtime by setting
environment variables.

=head2 DBIC_KEEP_TEST



( run in 2.146 seconds using v1.01-cache-2.11-cpan-39bf76dae61 )