Some test suite corrections ahead of next commits
[dbsrgits/DBIx-Class.git] / t / 72pg.t
index 384eee9..9d37930 100644 (file)
--- a/t/72pg.t
+++ b/t/72pg.t
@@ -1,3 +1,4 @@
+BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
 use DBIx::Class::Optional::Dependencies -skip_all_without => 'test_rdbms_pg';
 
 use strict;
@@ -5,13 +6,11 @@ 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';
+use DBIx::Class::_Util qw( is_exception set_subname );
 
 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_PG_${_}" } qw/DSN USER PASS/};
 
@@ -22,28 +21,6 @@ DBICTest::Schema->load_classes( map {s/.+:://;$_} @test_classes ) if @test_class
 ###  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');
@@ -102,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;
@@ -296,7 +278,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;
@@ -309,6 +291,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
@@ -464,7 +489,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;