Make both pg and mysql execute t/98savepoints.t if present
Peter Rabbitson [Fri, 25 Nov 2011 23:20:16 +0000 (00:20 +0100)]
t/98savepoints.t

index 7bc6d64..03365ec 100644 (file)
@@ -4,142 +4,144 @@ use warnings;
 use Test::More;
 use DBIx::Class::Optional::Dependencies ();
 
-my ($create_sql, $dsn, $user, $pass);
+my $env2optdep = {
+  DBICTEST_PG => 'rdbms_pg',
+  DBICTEST_MYSQL => 'test_rdbms_mysql',
+};
 
-if ($ENV{DBICTEST_PG_DSN}) {
-  plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('rdbms_pg')
-    unless DBIx::Class::Optional::Dependencies->req_ok_for ('rdbms_pg');
-
-  ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
-
-  $create_sql = "CREATE TABLE artist (artistid serial PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10))";
-} elsif ($ENV{DBICTEST_MYSQL_DSN}) {
-  plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_rdbms_mysql')
-    unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_rdbms_mysql');
-
-  ($dsn, $user, $pass) = @ENV{map { "DBICTEST_MYSQL_${_}" } qw/DSN USER PASS/};
-
-  $create_sql = "CREATE TABLE artist (artistid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10)) ENGINE=InnoDB";
-} else {
-  plan skip_all => 'Set DBICTEST_(PG|MYSQL)_DSN _USER and _PASS if you want to run savepoint tests';
-}
+plan skip_all => join (' ',
+  'Set $ENV{DBICTEST_PG_DSN} and/or $ENV{DBICTEST_MYSQL_DSN} _USER and _PASS to run these tests.',
+) unless grep { $ENV{"${_}_DSN"} } keys %$env2optdep;
 
 use lib qw(t/lib);
 use DBICTest;
 use DBICTest::Stats;
 
-plan tests => 16;
+my $schema;
 
-my $schema = DBICTest::Schema->connect ($dsn,$user,$pass,{ auto_savepoint => 1 });
+for my $prefix (keys %$env2optdep) { SKIP: {
+  my ($dsn, $user, $pass) = map { $ENV{"${prefix}_$_"} } qw/DSN USER PASS/;
 
-my $stats = DBICTest::Stats->new;
+  skip ("Skipping tests with $prefix: set \$ENV{${prefix}_DSN} _USER and _PASS", 1)
+    unless $dsn;
 
-$schema->storage->debugobj($stats);
+  skip ("Testing with ${prefix}_DSN needs " . DBIx::Class::Optional::Dependencies->req_missing_for( $env2optdep->{$prefix} ), 1)
+    unless  DBIx::Class::Optional::Dependencies->req_ok_for($env2optdep->{$prefix});
 
-$schema->storage->debug(1);
+  $schema = DBICTest::Schema->connect ($dsn,$user,$pass,{ auto_savepoint => 1 });
 
-{
-    local $SIG{__WARN__} = sub {};
-    $schema->storage->dbh->do ('DROP TABLE IF EXISTS artist');
-    $schema->storage->dbh->do ($create_sql);
-}
+  my $create_sql;
+  $schema->storage->ensure_connected;
+  if ($schema->storage->isa('DBIx::Class::Storage::DBI::Pg')) {
+    $create_sql = "CREATE TABLE artist (artistid serial PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10))";
+    $schema->storage->dbh->do('SET client_min_messages=WARNING');
+  }
+  elsif ($schema->storage->isa('DBIx::Class::Storage::DBI::mysql')) {
+    $create_sql = "CREATE TABLE artist (artistid INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY, name VARCHAR(100), rank INTEGER NOT NULL DEFAULT '13', charfield CHAR(10)) ENGINE=InnoDB";
+  }
+  else {
+    skip( 'Untested driver ' . $schema->storage, 1 );
+  }
 
-$schema->resultset('Artist')->create({ name => 'foo' });
+  note "Testing $prefix";
 
-$schema->txn_begin;
+  my $stats = DBICTest::Stats->new;
+  $schema->storage->debugobj($stats);
+  $schema->storage->debug(1);
 
-my $arty = $schema->resultset('Artist')->find(1);
+  $schema->storage->dbh->do ('DROP TABLE IF EXISTS artist');
+  $schema->storage->dbh->do ($create_sql);
 
-my $name = $arty->name;
+  $schema->resultset('Artist')->create({ name => 'foo' });
 
-# First off, test a generated savepoint name
-$schema->svp_begin;
+  $schema->txn_begin;
 
-cmp_ok($stats->{'SVP_BEGIN'}, '==', 1, 'Statistics svp_begin tickled');
+  my $arty = $schema->resultset('Artist')->find(1);
 
-$arty->update({ name => 'Jheephizzy' });
+  my $name = $arty->name;
 
-$arty->discard_changes;
+  # First off, test a generated savepoint name
+  $schema->svp_begin;
 
-cmp_ok($arty->name, 'eq', 'Jheephizzy', 'Name changed');
+  cmp_ok($stats->{'SVP_BEGIN'}, '==', 1, 'Statistics svp_begin tickled');
 
-# Rollback the generated name
-# Active: 0
-$schema->svp_rollback;
+  $arty->update({ name => 'Jheephizzy' });
 
-cmp_ok($stats->{'SVP_ROLLBACK'}, '==', 1, 'Statistics svp_rollback tickled');
+  $arty->discard_changes;
 
-$arty->discard_changes;
+  cmp_ok($arty->name, 'eq', 'Jheephizzy', 'Name changed');
 
-cmp_ok($arty->name, 'eq', $name, 'Name rolled back');
+  # Rollback the generated name
+  # Active: 0
+  $schema->svp_rollback;
 
-$arty->update({ name => 'Jheephizzy'});
+  cmp_ok($stats->{'SVP_ROLLBACK'}, '==', 1, 'Statistics svp_rollback tickled');
 
-# Active: 0 1
-$schema->svp_begin('testing1');
+  $arty->discard_changes;
 
-$arty->update({ name => 'yourmom' });
+  cmp_ok($arty->name, 'eq', $name, 'Name rolled back');
 
-# Active: 0 1 2
-$schema->svp_begin('testing2');
+  $arty->update({ name => 'Jheephizzy'});
 
-$arty->update({ name => 'gphat' });
-$arty->discard_changes;
-cmp_ok($arty->name, 'eq', 'gphat', 'name changed');
-# Active: 0 1 2
-# Rollback doesn't DESTROY the savepoint, it just rolls back to the value
-# at it's conception
-$schema->svp_rollback('testing2');
-$arty->discard_changes;
-cmp_ok($arty->name, 'eq', 'yourmom', 'testing2 reverted');
+  # Active: 0 1
+  $schema->svp_begin('testing1');
 
-# Active: 0 1 2 3
-$schema->svp_begin('testing3');
-$arty->update({ name => 'coryg' });
-# Active: 0 1 2 3 4
-$schema->svp_begin('testing4');
-$arty->update({ name => 'watson' });
+  $arty->update({ name => 'yourmom' });
 
-# Release 3, which implicitly releases 4
-# Active: 0 1 2
-$schema->svp_release('testing3');
-$arty->discard_changes;
-cmp_ok($arty->name, 'eq', 'watson', 'release left data');
-# This rolls back savepoint 2
-# Active: 0 1 2
-$schema->svp_rollback;
-$arty->discard_changes;
-cmp_ok($arty->name, 'eq', 'yourmom', 'rolled back to 2');
+  # Active: 0 1 2
+  $schema->svp_begin('testing2');
 
-# Rollback the original savepoint, taking us back to the beginning, implicitly
-# rolling back savepoint 1 and 2
-$schema->svp_rollback('savepoint_0');
-$arty->discard_changes;
-cmp_ok($arty->name, 'eq', 'foo', 'rolled back to start');
+  $arty->update({ name => 'gphat' });
+  $arty->discard_changes;
+  cmp_ok($arty->name, 'eq', 'gphat', 'name changed');
+  # Active: 0 1 2
+  # Rollback doesn't DESTROY the savepoint, it just rolls back to the value
+  # at it's conception
+  $schema->svp_rollback('testing2');
+  $arty->discard_changes;
+  cmp_ok($arty->name, 'eq', 'yourmom', 'testing2 reverted');
 
-$schema->txn_commit;
+  # Active: 0 1 2 3
+  $schema->svp_begin('testing3');
+  $arty->update({ name => 'coryg' });
+  # Active: 0 1 2 3 4
+  $schema->svp_begin('testing4');
+  $arty->update({ name => 'watson' });
 
-# And now to see if txn_do will behave correctly
+  # Release 3, which implicitly releases 4
+  # Active: 0 1 2
+  $schema->svp_release('testing3');
+  $arty->discard_changes;
+  cmp_ok($arty->name, 'eq', 'watson', 'release left data');
+  # This rolls back savepoint 2
+  # Active: 0 1 2
+  $schema->svp_rollback;
+  $arty->discard_changes;
+  cmp_ok($arty->name, 'eq', 'yourmom', 'rolled back to 2');
 
-$schema->txn_do (sub {
-    $schema->txn_do (sub {
-        $arty->name ('Muff');
+  # Rollback the original savepoint, taking us back to the beginning, implicitly
+  # rolling back savepoint 1 and 2
+  $schema->svp_rollback('savepoint_0');
+  $arty->discard_changes;
+  cmp_ok($arty->name, 'eq', 'foo', 'rolled back to start');
 
-        $arty->update;
-      });
+  $schema->txn_commit;
+
+  # And now to see if txn_do will behave correctly
+  $schema->txn_do (sub {
+    $schema->txn_do (sub {
+      $arty->name ('Muff');
+      $arty->update;
+    });
 
     eval {
       $schema->txn_do (sub {
-          $arty->name ('Moff');
-
-          $arty->update;
-
-          $arty->discard_changes;
-
-          is($arty->name,'Moff','Value updated in nested transaction');
-
-          $schema->storage->dbh->do ("GUARANTEED TO PHAIL");
-        });
+        $arty->name ('Moff');
+        $arty->update;
+        $arty->discard_changes;
+        is($arty->name,'Moff','Value updated in nested transaction');
+        $schema->storage->dbh->do ("GUARANTEED TO PHAIL");
+      });
     };
 
     ok ($@,'Nested transaction failed (good)');
@@ -153,15 +155,20 @@ $schema->txn_do (sub {
     $arty->update;
   });
 
-$arty->discard_changes;
+  $arty->discard_changes;
+
+  is($arty->name,'Miff','auto_savepoint worked');
+
+  cmp_ok($stats->{'SVP_BEGIN'},'==',7,'Correct number of savepoints created');
 
-is($arty->name,'Miff','auto_savepoint worked');
+  cmp_ok($stats->{'SVP_RELEASE'},'==',3,'Correct number of savepoints released');
 
-cmp_ok($stats->{'SVP_BEGIN'},'==',7,'Correct number of savepoints created');
+  cmp_ok($stats->{'SVP_ROLLBACK'},'==',5,'Correct number of savepoint rollbacks');
 
-cmp_ok($stats->{'SVP_RELEASE'},'==',3,'Correct number of savepoints released');
+  $schema->storage->dbh->do ("DROP TABLE artist");
+}}
 
-cmp_ok($stats->{'SVP_ROLLBACK'},'==',5,'Correct number of savepoint rollbacks');
+done_testing;
 
-END { $schema->storage->dbh->do ("DROP TABLE artist") if defined $schema }
+END { eval { $schema->storage->dbh->do ("DROP TABLE artist") } if defined $schema }