more pg unqualified schema tests, which expose a gap in the coverage
[dbsrgits/DBIx-Class.git] / t / 746sybase.t
index cc43de6..295b76a 100644 (file)
@@ -12,7 +12,7 @@ require DBIx::Class::Storage::DBI::Sybase::NoBindVars;
 
 my ($dsn, $user, $pass) = @ENV{map { "DBICTEST_SYBASE_${_}" } qw/DSN USER PASS/};
 
-my $TESTS = 58 + 2;
+my $TESTS = 63 + 2;
 
 if (not ($dsn && $user)) {
   plan skip_all =>
@@ -211,7 +211,7 @@ SQL
 # test insert_bulk using populate.
   SKIP: {
     skip 'insert_bulk not supported', 4
-      unless $schema->storage->_can_insert_bulk;
+      unless $storage_type !~ /NoBindVars/i;
 
     lives_ok {
       $schema->resultset('Artist')->populate([
@@ -245,30 +245,35 @@ SQL
   }
 
 # make sure insert_bulk works a second time on the same connection
-  lives_ok {
-    $schema->resultset('Artist')->populate([
-      {
-        name => 'bulk artist 1',
-        charfield => 'bar',
-      },
-      {
-        name => 'bulk artist 2',
-        charfield => 'bar',
-      },
-      {
-        name => 'bulk artist 3',
-        charfield => 'bar',
-      },
-    ]);
-  } 'insert_bulk via populate called a second time';
+  SKIP: {
+    skip 'insert_bulk not supported', 3
+      unless $storage_type !~ /NoBindVars/i;
 
-  is $bulk_rs->count, 3,
-    'correct number inserted via insert_bulk';
+    lives_ok {
+      $schema->resultset('Artist')->populate([
+        {
+          name => 'bulk artist 1',
+          charfield => 'bar',
+        },
+        {
+          name => 'bulk artist 2',
+          charfield => 'bar',
+        },
+        {
+          name => 'bulk artist 3',
+          charfield => 'bar',
+        },
+      ]);
+    } 'insert_bulk via populate called a second time';
 
-  is ((grep $_->charfield eq 'bar', $bulk_rs->all), 3,
-    'column set correctly via insert_bulk');
+    is $bulk_rs->count, 3,
+      'correct number inserted via insert_bulk';
+
+    is ((grep $_->charfield eq 'bar', $bulk_rs->all), 3,
+      'column set correctly via insert_bulk');
 
-  $bulk_rs->delete;
+    $bulk_rs->delete;
+  }
 
 # test invalid insert_bulk (missing required column)
 #
@@ -280,15 +285,16 @@ SQL
         charfield => 'foo',
       }
     ]);
-  } qr/no value or default|does not allow null/i,
+  } qr/no value or default|does not allow null|placeholders/i,
 # The second pattern is the error from fallback to regular array insert on
 # incompatible charset.
+# The third is for ::NoBindVars with no syb_has_blk.
   'insert_bulk with missing required column throws error';
 
 # now test insert_bulk with IDENTITY_INSERT
   SKIP: {
     skip 'insert_bulk not supported', 3
-      unless $schema->storage->_can_insert_bulk;
+      unless $storage_type !~ /NoBindVars/i;
 
     lives_ok {
       $schema->resultset('Artist')->populate([
@@ -330,7 +336,7 @@ SQL
 
 # mostly stolen from the blob stuff Nniuq wrote for t/73oracle.t
   SKIP: {
-    skip 'TEXT/IMAGE support does not work with FreeTDS', 18
+    skip 'TEXT/IMAGE support does not work with FreeTDS', 22
       if $schema->storage->using_freetds;
 
     my $dbh = $schema->storage->_dbh;
@@ -342,7 +348,7 @@ SQL
         CREATE TABLE bindtype_test 
         (
           id    INT   IDENTITY PRIMARY KEY,
-          bytea INT   NULL,
+          bytea IMAGE NULL,
           blob  IMAGE NULL,
           clob  TEXT  NULL
         )
@@ -428,7 +434,7 @@ SQL
 
     $rs->delete;
 
-    # now try insert_bulk with blobs
+    # now try insert_bulk with blobs and only blobs
     $new_str = $binstr{large} . 'bar';
     lives_ok {
       $rs->populate([
@@ -451,26 +457,70 @@ SQL
     is((grep $_->clob eq $new_str, $rs->all), 2,
       'TEXT column set correctly via insert_bulk');
 
-    # make sure impossible blob update throws
-    throws_ok {
-      $rs->update({ clob => 'foo' });
-      $rs->create({ clob => 'bar' });
-      $rs->search({ clob => 'foo' })->update({ clob => 'bar' });
-    } qr/impossible/, 'impossible blob update throws';
+    # now try insert_bulk with blobs and a non-blob which also happens to be an
+    # identity column
+    SKIP: {
+      skip 'no insert_bulk without placeholders', 4
+        if $storage_type =~ /NoBindVars/i;
+
+      $rs->delete;
+      $new_str = $binstr{large} . 'bar';
+      lives_ok {
+        $rs->populate([
+          {
+            id => 1,
+            bytea => 1,
+            blob => $binstr{large},
+            clob => $new_str,
+          },
+          {
+            id => 2,
+            bytea => 1,
+            blob => $binstr{large},
+            clob => $new_str,
+          },
+        ]);
+      } 'insert_bulk with blobs and explicit identity does NOT die';
+
+      is((grep $_->blob eq $binstr{large}, $rs->all), 2,
+        'IMAGE column set correctly via insert_bulk with identity');
+
+      is((grep $_->clob eq $new_str, $rs->all), 2,
+        'TEXT column set correctly via insert_bulk with identity');
+
+      is_deeply [ map $_->id, $rs->all ], [ 1,2 ],
+        'explicit identities set correctly via insert_bulk with blobs';
+    }
+
+    lives_and {
+      $rs->delete;
+      $rs->create({ blob => $binstr{large} }) for (1..2);
+      $rs->update({ blob => undef });
+      is((grep !defined($_->blob), $rs->all), 2);
+    } 'blob update to NULL';
   }
 
-# test MONEY column support
+# test MONEY column support (and some other misc. stuff)
   $schema->storage->dbh_do (sub {
       my ($storage, $dbh) = @_;
       eval { $dbh->do("DROP TABLE money_test") };
       $dbh->do(<<'SQL');
 CREATE TABLE money_test (
    id INT IDENTITY PRIMARY KEY,
-   amount MONEY NULL
+   amount MONEY DEFAULT $999.99 NULL
 )
 SQL
   });
 
+  my $rs = $schema->resultset('Money');
+
+# test insert with defaults
+  lives_and {
+    $rs->create({});
+    is((grep $_->amount == 999.99, $rs->all), 1);
+  } 'insert with all defaults works';
+  $rs->delete;
+
 # test insert transaction when there's an active cursor
   {
     my $artist_rs = $schema->resultset('Artist');
@@ -502,8 +552,6 @@ SQL
   }
 
 # Now test money values.
-  my $rs = $schema->resultset('Money');
-
   my $row;
   lives_ok {
     $row = $rs->create({ amount => 100 });