X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F72pg.t;h=1f0cc0700fbce5aa04f4814b08af9f411dce2d0c;hb=HEAD;hp=5f00ff9d86a21835bdae5efd07c484deb0e02ed3;hpb=f45dc928a3d4a50b495dde22a423b3ce0da5234c;p=dbsrgits%2FDBIx-Class.git diff --git a/t/72pg.t b/t/72pg.t index 5f00ff9..1f0cc07 100644 --- a/t/72pg.t +++ b/t/72pg.t @@ -1,60 +1,26 @@ +BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) } +use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_rdbms_pg'; + use strict; use warnings; use Test::More; use Test::Exception; -use Sub::Name; +use Test::Warn; use Config; -use DBIx::Class::Optional::Dependencies (); -use lib qw(t/lib); use DBICTest; use SQL::Abstract 'is_literal_value'; -use DBIx::Class::_Util 'is_exception'; - -plan skip_all => 'Test needs ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_rdbms_pg') - unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_rdbms_pg'); +use DBIx::Class::_Util qw( is_exception set_subname ); my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/}; -plan skip_all => <<'EOM' unless $dsn && $user; -Set $ENV{DBICTEST_PG_DSN}, _USER and _PASS to run this test -( NOTE: This test drops and creates tables called 'artist', 'cd', -'timestamp_primary_key_test', 'track', 'casecheck', 'array_test' and -'sequence_test' as well as following sequences: 'pkid1_seq', 'pkid2_seq' and -'nonpkid_seq'. as well as following schemas: 'dbic_t_schema', -'dbic_t_schema_2', 'dbic_t_schema_3', 'dbic_t_schema_4', and 'dbic_t_schema_5') -EOM - ### load any test classes that are defined further down in the file via BEGIN blocks - our @test_classes; #< array that will be pushed into by test classes defined in this file DBICTest::Schema->load_classes( map {s/.+:://;$_} @test_classes ) if @test_classes; ### pre-connect tests (keep each test separate as to make sure rebless() runs) { my $s = DBICTest::Schema->connect($dsn, $user, $pass); - - ok (!$s->storage->_dbh, 'definitely not connected'); - - # Check that datetime_parser returns correctly before we explicitly connect. - SKIP: { - skip ( - "Pg parser detection test needs " . DBIx::Class::Optional::Dependencies->req_missing_for ('test_dt_pg'), - 2 - ) unless DBIx::Class::Optional::Dependencies->req_ok_for ('test_dt_pg'); - - my $store = ref $s->storage; - is($store, 'DBIx::Class::Storage::DBI', 'Started with generic storage'); - - my $parser = $s->storage->datetime_parser; - is( $parser, 'DateTime::Format::Pg', 'datetime_parser is as expected'); - } - - ok (!$s->storage->_dbh, 'still not connected'); - } - - { - my $s = DBICTest::Schema->connect($dsn, $user, $pass); # make sure sqlt_type overrides work (::Storage::DBI::Pg does this) ok (!$s->storage->_dbh, 'definitely not connected'); is ($s->storage->sqlt_type, 'PostgreSQL', 'sqlt_type correct pre-connection'); @@ -113,9 +79,14 @@ for my $use_insert_returning ($test_server_supports_insert_returning : (0) ) { - no warnings qw/once redefine/; + # doing it here instead of the actual class to keep the main thing under dfs + # and thus keep catching false positives (so far none, but one never knows) + mro::set_mro("DBICTest::Schema", "c3"); + my $old_connection = DBICTest::Schema->can('connection'); - local *DBICTest::Schema::connection = subname 'DBICTest::Schema::connection' => sub { + + no warnings qw/once redefine/; + local *DBICTest::Schema::connection = set_subname 'DBICTest::Schema::connection' => sub { my $s = shift->$old_connection(@_); $s->storage->_use_insert_returning ($use_insert_returning); $s; @@ -225,6 +196,9 @@ for my $use_insert_returning ($test_server_supports_insert_returning __PACKAGE__->column_info_from_storage(1); __PACKAGE__->set_primary_key('id'); + # FIXME - for some reason column_info_from_storage does not properly find + # the is_auto_increment setting... + __PACKAGE__->column_info('id')->{is_auto_increment} = 1; } SKIP: { skip "Need DBD::Pg 2.9.2 or newer for array tests", 4 if $DBD::Pg::VERSION < 2.009002; @@ -307,7 +281,7 @@ for my $use_insert_returning ($test_server_supports_insert_returning # test inferred condition for creation for my $cond ( { -value => [3,4] }, - \[ '= ?' => [arrayfield => [3, 4]] ], + \[ '= ?' => [3, 4] ], ) { local $TODO = 'No introspection of complex literal conditions :(' if is_literal_value $cond; @@ -320,6 +294,49 @@ for my $use_insert_returning ($test_server_supports_insert_returning $row->discard_changes; is_deeply ($row->arrayfield, [3,4], 'Array value made it to storage'); } + + my $arr = [ 1..10 ]; + # exercise the creation-logic even more (akin to t/100populate.t) + for my $insert_value ( + $arr, + { -value => $arr }, + \[ '?', $arr ], + ) { + $arr_rs->delete; + + my @objs = ( + $arr_rs->create({ arrayfield => $insert_value }), + $arr_rs->populate([ { arrayfield => $insert_value } ]), + $arr_rs->populate([ ['arrayfield'], [ $insert_value ] ]), + ); + + my $loose_obj = $arr_rs->new({ arrayfield => $insert_value }); + + unless (is_literal_value $insert_value) { + is_deeply( $_->arrayfield, $arr, 'array value preserved during set_columns' ) + for ($loose_obj, @objs) + } + + push @objs, $loose_obj->insert; + + $_->discard_changes for @objs; + is_deeply( $_->arrayfield, $arr, 'array value correct after discard_changes' ) + for (@objs); + + # insert couple more in void ctx + $arr_rs->populate([ { arrayfield => $insert_value } ]); + $arr_rs->populate([ ['arrayfield'], [ $insert_value ] ]); + + # should have a total of 6 now, all pristine + my @retrieved_objs = $arr_rs->search({ + arrayfield => ref $insert_value eq 'ARRAY' + ? { -value => $insert_value } + : { '=' => $insert_value } + })->all; + is scalar @retrieved_objs, 6, 'Correct count of inserted rows'; + is_deeply( $_->arrayfield, $arr, 'array value correct after storage retrieval' ) + for (@retrieved_objs); + } } ########## Case check @@ -407,9 +424,15 @@ lives_ok { $cds->update({ year => '2010' }) } 'Update on prefetched rs'; sub { die "DBICTestTimeout" }, )); - alarm(2); $artist2 = $schema2->resultset('Artist')->find(1); $artist2->name('fooey'); + + # FIXME - this needs to go away in lieu of a non-retrying runner + # ( i.e. after solving RT#47005 ) + local *DBIx::Class::Storage::DBI::_ping = sub { 1 }, DBIx::Class::_ENV_::OLD_MRO && Class::C3->reinitialize() + if DBIx::Class::_Util::modver_gt_or_eq( 'DBD::Pg' => '3.5.0' ); + + alarm(1); $artist2->update; }; @@ -469,7 +492,24 @@ lives_ok { $cds->update({ year => '2010' }) } 'Update on prefetched rs'; $schema->resultset('Track')->create({ trackid => 1, cd => 9999, position => 1, title => 'Track1' }); - } qr/constraint/i, 'with_deferred_fk_checks is off'; + } qr/violates foreign key constraint/i, 'with_deferred_fk_checks is off outside of TXN'; + + # rerun the same under with_deferred_fk_checks + # it is expected to fail, hence the eval + # but it also should not warn + warnings_like { + eval { + $schema->storage->with_deferred_fk_checks(sub { + $schema->resultset('Track')->create({ + trackid => 1, cd => 9999, position => 1, title => 'Track1' + }); + } ) + }; + + like $@, qr/violates foreign key constraint/i, + "Still expected exception on deferred failure at commit time"; + + } [], 'No warnings on deferred rollback'; } done_testing;