Institute a central "load this first in testing" package
[dbsrgits/DBIx-Class.git] / t / 84serialize.t
index 55aa74b..0cacfc1 100644 (file)
@@ -1,15 +1,18 @@
+BEGIN { do "./t/lib/ANFANG.pm" or die ( $@ || $! ) }
+
 use strict;
 use warnings;
 
 use Test::More;
 use Test::Exception;
-use lib qw(t/lib);
+
 use DBICTest;
 use Storable qw(dclone freeze nfreeze thaw);
 use Scalar::Util qw/refaddr/;
+use Carp;
 
 sub ref_ne {
-  my ($refa, $refb) = map { refaddr $_ or die "$_ is not a reference!" } @_[0,1];
+  my ($refa, $refb) = map { refaddr $_ or croak "$_ is not a reference!" } @_[0,1];
   cmp_ok (
     $refa,
       '!=',
@@ -55,23 +58,37 @@ my %stores = (
       return $fire;
     },
 
-    ($ENV{DBICTEST_MEMCACHED})
-      ? do {
-        require Cache::Memcached;
-        my $memcached = Cache::Memcached->new(
-          { servers => [ $ENV{DBICTEST_MEMCACHED} ] } );
-
-        my $key = 'tmp_dbic_84serialize_memcached_test';
-
-        ( memcached => sub {
-            $memcached->set( $key, $_[0], 60 );
-            local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
-            return $memcached->get($key);
-        });
-      } : ()
-    ,
 );
 
+if ($ENV{DBICTEST_MEMCACHED}) {
+  if (DBIx::Class::Optional::Dependencies->req_ok_for ('test_memcached')) {
+    my $memcached = Cache::Memcached->new(
+      { servers => [ $ENV{DBICTEST_MEMCACHED} ] }
+    );
+
+    my $key = 'tmp_dbic_84serialize_memcached_test';
+
+    $stores{memcached} = sub {
+      $memcached->set( $key, $_[0], 60 )
+        or die "Unable to insert into $ENV{DBICTEST_MEMCACHED} - is server running?";
+      local $DBIx::Class::ResultSourceHandle::thaw_schema = $schema;
+      return $memcached->get($key);
+    };
+  }
+  else {
+    SKIP: {
+      skip 'Memcached tests need ' . DBIx::Class::Optional::Dependencies->req_missing_for ('test_memcached'), 1;
+    }
+  }
+}
+else {
+  SKIP: {
+    skip 'Set $ENV{DBICTEST_MEMCACHED} to run the memcached serialization tests', 1;
+  }
+}
+
+
+
 for my $name (keys %stores) {
 
     my $store = $stores{$name};
@@ -123,17 +140,12 @@ for my $name (keys %stores) {
 
 
     # Test resultsource with cached rows
-    my $query_count;
-    $cd_rs = $cd_rs->search ({}, { cache => 1 });
-
-    my $orig_debug = $schema->storage->debug;
-    $schema->storage->debug(1);
-    $schema->storage->debugcb(sub { $query_count++ } );
+    $schema->is_executed_querycount( sub {
+      $cd_rs = $cd_rs->search ({}, { cache => 1 });
 
-    # this will hit the database once and prime the cache
-    my @cds = $cd_rs->all;
+      # this will hit the database once and prime the cache
+      my @cds = $cd_rs->all;
 
-    lives_ok {
       $copy = $store->($cd_rs);
       ref_ne($copy, $cd_rs, 'Cached resultset cloned');
       is_deeply (
@@ -143,12 +155,45 @@ for my $name (keys %stores) {
       );
 
       is ($copy->count, $cd_rs->count, 'Cached count identical');
-    } "serialize cached resultset lives: $name";
+    }, 1, 'Only one db query fired');
+}
+
+# test schema-less detached thaw
+{
+  my $artist = $schema->resultset('Artist')->find(1);
+
+  $artist = dclone $artist;
+
+  is( $artist->name, 'Caterwauler McCrae', 'getting column works' );
+
+  ok( $artist->update, 'Non-dirty update noop' );
+
+  ok( $artist->name( 'Beeeeeeees' ), 'setting works' );
+
+  ok( $artist->is_column_changed( 'name' ), 'Column dirtyness works' );
+  ok( $artist->is_changed, 'object dirtyness works' );
+
+  my $rs = $artist->result_source->resultset;
+  $rs->set_cache([ $artist ]);
+
+  is( $rs->count, 1, 'Synthetic resultset count works' );
+
+  my $exc = qr/Unable to perform storage-dependent operations with a detached result source.+use \$schema->thaw/;
+
+  throws_ok { $artist->update }
+    $exc,
+    'Correct exception on row op'
+  ;
 
-    is ($query_count, 1, 'Only one db query fired');
+  throws_ok { $artist->discard_changes }
+    $exc,
+    'Correct exception on row op'
+  ;
 
-    $schema->storage->debug($orig_debug);
-    $schema->storage->debugcb(undef);
+  throws_ok { $rs->find(1) }
+    $exc,
+    'Correct exception on rs op'
+  ;
 }
 
 done_testing;