X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=t%2F72pg.t;h=5a79709e0c69b086143cb2c63562d2cc92e8b6de;hb=4bea1fe7a2b4827947b3d0d64b16a0f2c5e594bd;hp=a981fc813526ac6f2dfb85d478e1d022b17e3246;hpb=9727774577b1cbf4d0a3c5eb2def2c19a2ba0b17;p=dbsrgits%2FDBIx-Class.git diff --git a/t/72pg.t b/t/72pg.t index a981fc8..5a79709 100644 --- a/t/72pg.t +++ b/t/72pg.t @@ -10,12 +10,12 @@ use DBICTest; 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', +'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 @@ -32,8 +32,10 @@ DBICTest::Schema->load_classes( map {s/.+:://;$_} @test_classes ) if @test_class # Check that datetime_parser returns correctly before we explicitly connect. SKIP: { - eval { require DateTime::Format::Pg }; - skip "DateTime::Format::Pg required", 2 if $@; + 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'); @@ -72,6 +74,16 @@ DBICTest::Schema->load_classes( map {s/.+:://;$_} @test_classes ) if @test_class $it->next; $it->next; is( $it->next, undef, "next past end of resultset ok" ); + + # Limit with select-lock + lives_ok { + $schema->txn_do (sub { + isa_ok ( + $schema->resultset('Artist')->find({artistid => 1}, {for => 'update', rows => 1}), + 'DBICTest::Schema::Artist', + ); + }); + } 'Limited FOR UPDATE select works'; } # check if we indeed do support stuff @@ -186,7 +198,7 @@ for my $use_insert_returning ($test_server_supports_insert_returning use strict; use warnings; - use base 'DBIx::Class::Core'; + use base 'DBICTest::BaseResult'; __PACKAGE__->table('dbic_t_schema.array_test'); __PACKAGE__->add_columns(qw/id arrayfield/); @@ -197,32 +209,88 @@ for my $use_insert_returning ($test_server_supports_insert_returning SKIP: { skip "Need DBD::Pg 2.9.2 or newer for array tests", 4 if $DBD::Pg::VERSION < 2.009002; + my $arr_rs = $schema->resultset('ArrayTest'); + lives_ok { - $schema->resultset('ArrayTest')->create({ + $arr_rs->create({ arrayfield => [1, 2], }); } 'inserting arrayref as pg array data'; lives_ok { - $schema->resultset('ArrayTest')->update({ + $arr_rs->update({ arrayfield => [3, 4], }); } 'updating arrayref as pg array data'; - $schema->resultset('ArrayTest')->create({ + $arr_rs->create({ arrayfield => [5, 6], }); - my $count; + # Search using arrays lives_ok { - $count = $schema->resultset('ArrayTest')->search({ - arrayfield => \[ '= ?' => [arrayfield => [3, 4]] ], #Todo anything less ugly than this? - })->count; - } 'comparing arrayref to pg array data does not blow up'; - is($count, 1, 'comparing arrayref to pg array data gives correct result'); - } + is_deeply ( + $arr_rs->search({ arrayfield => { -value => [3,4] } })->first->arrayfield, + [3,4], + 'Array value matches' + ); + } 'searching by arrayref'; + lives_ok { + is_deeply ( + $arr_rs->search({ arrayfield => { '=' => { -value => [3,4] }} })->first->arrayfield, + [3,4],, + 'Array value matches explicit equal' + ); + } 'searching by arrayref (explicit equal sign)'; + lives_ok { + is_deeply ( + $arr_rs->search({ arrayfield => { '>' => { -value => [3,1] }} })->first->arrayfield, + [3,4], + 'Array value matches greater than' + ); + } 'searching by arrayref (greater than)'; + + lives_ok { + is ( + $arr_rs->search({ arrayfield => { '>' => { -value => [3,7] }} })->count, + 1, + 'Greater than search found [5,6]', + ); + } 'searching by arrayref (greater than)'; + + # Find using arrays + lives_ok { + is_deeply ( + $arr_rs->find({ arrayfield => { -value => [3,4] } })->arrayfield, + [3,4], + 'Array value matches implicit equal' + ); + } 'find by arrayref'; + + lives_ok { + is_deeply ( + $arr_rs->find({ arrayfield => { '=' => { -value => [3,4] }} })->arrayfield, + [3,4], + 'Array value matches explicit equal' + ); + } 'find by arrayref (equal)'; + + # test inferred condition for creation + TODO: for my $cond ( + { -value => [3,4] }, + \[ '= ?' => [arrayfield => [3, 4]] ], + ) { + local $TODO = 'No introspection of complex conditions :('; + my $arr_rs_cond = $arr_rs->search({ arrayfield => $cond }); + + my $row = $arr_rs_cond->create({}); + is_deeply ($row->arrayfield, [3,4], 'Array value taken from $rs condition'); + $row->discard_changes; + is_deeply ($row->arrayfield, [3,4], 'Array value made it to storage'); + } + } ########## Case check @@ -255,16 +323,12 @@ my $artist = $schema->resultset('Artist')->first; my $cds = $artist->cds_unordered->search({ year => { '!=' => 2010 } }, { prefetch => 'liner_notes' }); -TODO: { - todo_skip 'update resultset with a prefetch over a might_have rel', 1; - $cds->update({ year => '2010' }); -} - +lives_ok { $cds->update({ year => '2010' }) } 'Update on prefetched rs'; ## Test SELECT ... FOR UPDATE SKIP: { - if(eval "require Sys::SigAction" && !$@) { + if(eval { require Sys::SigAction }) { Sys::SigAction->import( 'set_sig_handler' ); } else { @@ -423,8 +487,7 @@ CREATE TABLE dbic_t_schema.track ( position int, title varchar(255), last_updated_on date, - last_updated_at date, - small_dt date + last_updated_at date ) EOS @@ -499,12 +562,12 @@ sub drop_test_schema { for my $stat ( 'DROP SCHEMA dbic_t_schema_5 CASCADE', - 'DROP SEQUENCE public.artist_artistid_seq', + 'DROP SEQUENCE public.artist_artistid_seq CASCADE', 'DROP SCHEMA dbic_t_schema_4 CASCADE', 'DROP SCHEMA dbic_t_schema CASCADE', - 'DROP SEQUENCE pkid1_seq', - 'DROP SEQUENCE pkid2_seq', - 'DROP SEQUENCE nonpkid_seq', + 'DROP SEQUENCE pkid1_seq CASCADE', + 'DROP SEQUENCE pkid2_seq CASCADE', + 'DROP SEQUENCE nonpkid_seq CASCADE', 'DROP SCHEMA dbic_t_schema_2 CASCADE', 'DROP SCHEMA dbic_t_schema_3 CASCADE', ) {