added t/lib/DBICTest/Schema/EventTZWarning.pm
[dbsrgits/DBIx-Class-Historic.git] / t / storage / txn_scope_guard.t
index dbfc6a4..ca67c98 100644 (file)
@@ -24,7 +24,7 @@ use DBICTest;
     });
 
    $guard->commit;
-  } qr/No such column made_up_column .*? at .*?\Q$fn\E line \d+/s, "Error propogated okay";
+  } qr/No such column 'made_up_column' .*? at .*?\Q$fn\E line \d+/s, "Error propogated okay";
 
   ok(!$artist_rs->find({name => 'Death Cab for Cutie'}), "Artist not created");
 
@@ -92,7 +92,9 @@ use DBICTest;
 
   no strict 'refs';
   no warnings 'redefine';
+
   local *{DBIx::Class::Storage::DBI::txn_rollback} = sub { die 'die die my darling' };
+  Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO;
 
   throws_ok (sub {
     my $guard = $schema->txn_scope_guard;
@@ -104,19 +106,26 @@ use DBICTest;
     #$schema->storage->_dbh( $schema->storage->_dbh->clone );
 
     die 'Deliberate exception';
-  }, qr/Deliberate exception.+Rollback failed/s);
+  }, ($] >= 5.013008 )
+    ? qr/Deliberate exception/s # temporary until we get the generic exception wrapper rolling
+    : qr/Deliberate exception.+Rollback failed/s
+  );
 
   # just to mask off warning since we could not disconnect above
   $schema->storage->_dbh->disconnect;
 }
 
 # make sure it warns *big* on failed rollbacks
-{
-  my $schema = DBICTest->init_schema();
+# test with and without a poisoned $@
+for my $pre_poison (0,1) {
+for my $post_poison (0,1) {
+
+  my $schema = DBICTest->init_schema(no_populate => 1);
 
   no strict 'refs';
   no warnings 'redefine';
   local *{DBIx::Class::Storage::DBI::txn_rollback} = sub { die 'die die my darling' };
+  Class::C3->reinitialize() if DBIx::Class::_ENV_::OLD_MRO;
 
 #The warn from within a DESTROY callback freaks out Test::Warn, do it old-school
 =begin
@@ -153,15 +162,86 @@ use DBICTest;
       warn $_[0];
     }
   };
+
   {
-      my $guard = $schema->txn_scope_guard;
-      $schema->resultset ('Artist')->create ({ name => 'bohhoo'});
+    eval { die 'pre-GIFT!' if $pre_poison };
+    my $guard = $schema->txn_scope_guard;
+    eval { die 'post-GIFT!' if $post_poison };
+    $schema->resultset ('Artist')->create ({ name => 'bohhoo'});
   }
 
-  is (@w, 2, 'Both expected warnings found');
+  local $TODO = 'Do not know how to deal with trapped exceptions occuring after guard instantiation...'
+    if ( $post_poison and (
+      # take no chances on installation
+      ( DBICTest::RunMode->is_plain and ($ENV{TRAVIS}||'') ne 'true' )
+        or
+      # this always fails
+      ! $pre_poison
+        or
+      # I do not underdtand why but on <= 5.8.8 and $pre_poison && $post_poison passes...
+      $] > 5.008008
+    ));
+
+  is (@w, 2, "Both expected warnings found - \$\@ pre-poison: $pre_poison, post-poison: $post_poison" );
 
   # just to mask off warning since we could not disconnect above
   $schema->storage->_dbh->disconnect;
+}}
+
+# add a TODO to catch when Text::Balanced is finally fixed
+# https://rt.cpan.org/Public/Bug/Display.html?id=74994
+#
+# while it doesn't matter much for DBIC itself, this particular bug
+# is a *BANE*, and DBIC is to bump its dep as soon as possible
+{
+
+  require Text::Balanced;
+
+  my $great_success;
+  {
+    local $TODO = 'RT#74994 *STILL* not fixed';
+
+    lives_ok {
+      # this is what poisons $@
+      Text::Balanced::extract_bracketed( '(foo', '()' );
+
+      my $s = DBICTest->init_schema( deploy => 0 );
+      my $g = $s->txn_scope_guard;
+      $g->commit;
+      $great_success++;
+    } 'Text::Balanced is no longer screwing up $@';
+  }
+
+  # delete all of this when T::B dep is bumped
+  unless ($great_success) {
+
+# hacky workaround for desperate folk
+# intended to be copypasted into your app
+    {
+      require Text::Balanced;
+      require overload;
+
+      local $@;
+
+      # this is what poisons $@
+      Text::Balanced::extract_bracketed( '(foo', '()' );
+
+      if ($@ and overload::Overloaded($@) and ! overload::Method($@,'fallback') ) {
+        my $class = ref $@;
+        eval "package $class; overload->import(fallback => 1);"
+      }
+    }
+# end of hacky workaround
+
+    lives_ok {
+      # this is what poisons $@
+      Text::Balanced::extract_bracketed( '(foo', '()' );
+
+      my $s = DBICTest->init_schema( deploy => 0 );
+      my $g = $s->txn_scope_guard;
+      $g->commit;
+    } 'Monkeypatched Text::Balanced is no longer screwing up $@';
+  }
 }
 
 done_testing;