X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F92storage.t;h=94bdfd360f834088206f4be4786d0e6bb111e35d;hb=a4fcda000aa9833874693ea9bc940a92abbe1b6f;hp=67a594f2a46cb2b7578ca31f6e00ab88d45dfb7f;hpb=2654e84a2867bf711cfa9ec5e0d0717ce4c53218;p=dbsrgits%2FDBIx-Class.git diff --git a/t/92storage.t b/t/92storage.t index 67a594f..94bdfd3 100644 --- a/t/92storage.t +++ b/t/92storage.t @@ -4,12 +4,167 @@ use warnings; use Test::More; use lib qw(t/lib); use DBICTest; +use Data::Dumper; -plan tests => 1; +{ + package DBICTest::ExplodingStorage::Sth; + use strict; + use warnings; -my $schema = DBICTest->init_schema(); + sub execute { die "Kablammo!" } + + sub bind_param {} + + package DBICTest::ExplodingStorage; + use strict; + use warnings; + use base 'DBIx::Class::Storage::DBI::SQLite'; + + my $count = 0; + sub sth { + my ($self, $sql) = @_; + return bless {}, "DBICTest::ExplodingStorage::Sth" unless $count++; + return $self->next::method($sql); + } + + sub connected { + return 0 if $count == 1; + return shift->next::method(@_); + } +} + +plan tests => 17; + +my $schema = DBICTest->init_schema( sqlite_use_file => 1 ); is( ref($schema->storage), 'DBIx::Class::Storage::DBI::SQLite', 'Storage reblessed correctly into DBIx::Class::Storage::DBI::SQLite' ); +my $storage = $schema->storage; +$storage->ensure_connected; + +eval { + $schema->storage->throw_exception('test_exception_42'); +}; +like($@, qr/\btest_exception_42\b/, 'basic exception'); + +eval { + $schema->resultset('CD')->search_literal('broken +%$#$1')->all; +}; +like($@, qr/prepare_cached failed/, 'exception via DBI->HandleError, etc'); + +bless $storage, "DBICTest::ExplodingStorage"; +$schema->storage($storage); + +eval { + $schema->resultset('Artist')->create({ name => "Exploding Sheep" }); +}; + +is($@, "", "Exploding \$sth->execute was caught"); + +is(1, $schema->resultset('Artist')->search({name => "Exploding Sheep" })->count, + "And the STH was retired"); + + +# testing various invocations of connect_info ([ ... ]) + +my $coderef = sub { 42 }; +my $invocations = { + 'connect_info ([ $d, $u, $p, \%attr, \%extra_attr])' => { + args => [ + 'foo', + 'bar', + undef, + { + on_connect_do => [qw/a b c/], + PrintError => 0, + }, + { + AutoCommit => 1, + on_disconnect_do => [qw/d e f/], + }, + { + unsafe => 1, + auto_savepoint => 1, + }, + ], + dbi_connect_info => [ + 'foo', + 'bar', + undef, + { + PrintError => 0, + AutoCommit => 1, + }, + ], + }, + + 'connect_info ([ \%code, \%extra_attr ])' => { + args => [ + $coderef, + { + on_connect_do => [qw/a b c/], + PrintError => 0, + AutoCommit => 1, + on_disconnect_do => [qw/d e f/], + }, + { + unsafe => 1, + auto_savepoint => 1, + }, + ], + dbi_connect_info => [ + $coderef, + ], + }, + + 'connect_info ([ \%attr ])' => { + args => [ + { + on_connect_do => [qw/a b c/], + PrintError => 0, + AutoCommit => 1, + on_disconnect_do => [qw/d e f/], + user => 'bar', + dsn => 'foo', + }, + { + unsafe => 1, + auto_savepoint => 1, + }, + ], + dbi_connect_info => [ + 'foo', + 'bar', + undef, + { + PrintError => 0, + AutoCommit => 1, + }, + ], + }, +}; + +for my $type (keys %$invocations) { + + # we can not use a cloner portably because of the coderef + # so compare dumps instead + local $Data::Dumper::Sortkeys = 1; + my $arg_dump = Dumper ($invocations->{$type}{args}); + + $storage->connect_info ($invocations->{$type}{args}); + + is ($arg_dump, Dumper ($invocations->{$type}{args}), "$type didn't modify passed arguments"); + + + is_deeply ($storage->_dbi_connect_info, $invocations->{$type}{dbi_connect_info}, "$type produced correct _dbi_connect_info"); + ok ( (not $storage->auto_savepoint and not $storage->unsafe), "$type correctly ignored extra hashref"); + + is_deeply ( + [$storage->on_connect_do, $storage->on_disconnect_do ], + [ [qw/a b c/], [qw/d e f/] ], + "$type correctly parsed DBIC specific on_[dis]connect_do", + ); +} + 1;