use strict; use warnings; use Test::More; use File::Spec; use Test::Database; my @drivers = Test::Database->drivers(); @drivers = grep { my $name = $_->name(); grep { $name eq $_ } @ARGV } @drivers if @ARGV; # DBD::DBM uses SQL::Statement if available # but SQL::Statement versions > 1.20 make the test fail # (see RT #56463, #56561) if (eval { require SQL::Statement; diag "SQL::Statement $SQL::Statement::VERSION"; $SQL::Statement::VERSION > 1.20; } ) { my $skip_DBM = 0; @drivers = grep { !( $_->name() eq 'DBM' and $skip_DBM = 1 ) } @drivers; diag "skipping DBM tests because of SQL::Statement bug" if $skip_DBM; } plan skip_all => 'No drivers available for testing' if !@drivers; # some SQL statements to try out my @sql = ( q{CREATE TABLE users (id INTEGER, name VARCHAR(64))}, q{INSERT INTO users (id, name) VALUES (1, 'book')}, q{INSERT INTO users (id, name) VALUES (2, 'echo')}, ); my $select = "SELECT id, name FROM users"; my $drop = 'DROP TABLE users'; plan tests => ( 1 + ( 3 + @sql + 1 ) * 2 + 1 + 2) * @drivers; for my $driver (@drivers) { my $drname = $driver->name(); diag "Testing driver $drname " . $driver->version() . ", DBD::$drname " . $driver->dbd_version(); isa_ok( $driver, 'Test::Database::Driver' ); my $count = 0; my $old; for my $request ( $drname, { dbd => $drname }, ) { # database handle to a database (created by the driver) my ($handle) = Test::Database->handles($request); my $dbname = $handle->{name}; isa_ok( $handle, 'Test::Database::Handle', "$drname $dbname" ); # check we always get the same database, when it's created is( $dbname, $old, "Got db $old again" ) if $old; $old ||= $dbname; # do some tests on the dbh my $desc = "$drname($dbname)"; my $dbh = $handle->dbh(); isa_ok( $dbh, 'DBI::db' ); # create some information ok( $dbh->do($_), "$desc: $_" ) for @sql; # check the data is there my $lines = $dbh->selectall_arrayref($select); is_deeply( $lines, [ [ 1, 'book' ], [ 2, 'echo' ] ], "$desc: $select" ); # remove everything ok( $dbh->do($drop), "$desc: $drop" ); $dbh->disconnect(); } ok( grep ( { $_ eq $old } $driver->databases() ), "Database $old still there" ); $driver->drop_database($old); ok( !grep ( { $_ eq $old } $driver->databases() ), "Database $old was dropped" ); }