X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F34exception_action.t;h=aa803eb238bada7b3e1e2693e38f39c096bc427a;hb=ea3ee77d2d9e137b07ca4b2db14986e8310f4bec;hp=6de03f02bb8ea3a978d67c8ea6fef274028bde1a;hpb=65d351219882184861384aedac6f251b6797d0d7;p=dbsrgits%2FDBIx-Class.git diff --git a/t/34exception_action.t b/t/34exception_action.t index 6de03f0..aa803eb 100644 --- a/t/34exception_action.t +++ b/t/34exception_action.t @@ -1,10 +1,13 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } + use strict; use warnings; use Test::More; use Test::Exception; use Test::Warn; -use lib qw(t/lib); +use Scalar::Util 'weaken'; + use DBICTest; # Set up the "usual" sqlite for DBICTest @@ -28,8 +31,18 @@ throws_ok { $e->rethrow } isa_ok( $@, 'DBIx::Class::Exception' ); # Now lets rethrow via exception_action -$schema->exception_action(sub { die @_ }); -throws_ok \&$throw, $ex_regex; +{ + my $handler_execution_counter = 0; + + $schema->exception_action(sub { + $handler_execution_counter++; + like $_[0], $ex_regex, "Exception is precisely passed to exception_action"; + die @_ + }); + + throws_ok \&$throw, $ex_regex; + is $handler_execution_counter, 1, "exception_action handler executed exactly once"; +} # # This should have never worked!!! @@ -80,4 +93,45 @@ throws_ok \&$throw, throws_ok { $schema->storage->throw_exception('floob') } qr/DBICTest::Exception is handling this: floob/; +# test antipatterns +for my $ap (qw( + DBICTest::AntiPattern::TrueZeroLen + DBICTest::AntiPattern::NullObject +)) { + eval "require $ap"; + my $exp_warn = qr/\QObjects of external exception class '$ap' stringify to '' (the empty string)/; + + # make sure an exception_action can replace $@ with an antipattern + $schema->exception_action(sub { die $ap->new }); + warnings_exist { + eval { $throw->() }; + isa_ok $@, $ap; + } $exp_warn, 'proper warning on antipattern encountered within exception_action'; + + # and make sure that the rethrow works + $schema->exception_action(sub { die @_ }); + warnings_exist { + eval { + $schema->txn_do (sub { die $ap->new }); + }; + + isa_ok $@, $ap; + } $exp_warn, 'Proper warning on encountered antipattern'; +} + +# ensure we do not get into an infloop +{ + weaken( my $s = $schema ); + + $schema->exception_action(sub{ + $s->throw_exception(@_) + }); + + throws_ok { + $schema->storage->dbh_do(sub { + $_[1]->do('wgwfwfwghawhjsejsethjwetjesjesjsejsetjes') + } ) + } qr/syntax error/i; +} + done_testing;