Warn in case of iterative collapse being upgraded to an eager cursor slurp
[dbsrgits/DBIx-Class.git] / t / prefetch / manual.t
index 6914cae..c6d1f6a 100644 (file)
@@ -2,6 +2,8 @@ use strict;
 use warnings;
 
 use Test::More;
+use Test::Deep;
+use Test::Warn;
 use Test::Exception;
 use lib qw(t/lib);
 use DBICTest;
@@ -64,7 +66,7 @@ my $rs = $schema->resultset ('CD')->search ({}, {
 
 my $hri_rs = $rs->search({}, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' });
 
-is_deeply (
+cmp_deeply (
   [$hri_rs->all],
   [
     {
@@ -185,11 +187,11 @@ is_deeply (
 );
 
 TODO: {
-  my $row = $rs->next;
+  my ($row) = $rs->all;
   local $TODO = 'Something is wrong with filter type rels, they throw on incomplete objects >.<';
 
   lives_ok {
-    is_deeply (
+    cmp_deeply (
       { $row->single_track->get_columns },
       {},
       'empty intermediate object ok',
@@ -197,9 +199,6 @@ TODO: {
   } 'no exception';
 }
 
-is ($rs->cursor->next, undef, 'cursor exhausted');
-
-
 TODO: {
 local $TODO = 'this does not work at all, need to promote rsattrs to an object on its own';
 # make sure has_many column redirection does not do weird stuff when collapse is requested
@@ -268,9 +267,12 @@ $schema->storage->debug (1);
 for my $use_next (0, 1) {
   my @random_cds;
   if ($use_next) {
-    while (my $o = $rs_random->next) {
-      push @random_cds, $o;
-    }
+    warnings_exist {
+      while (my $o = $rs_random->next) {
+        push @random_cds, $o;
+      }
+    } qr/performed an eager cursor slurp underneath/,
+    'Warned on auto-eager cursor';
   }
   else {
     @random_cds = $rs_random->all;
@@ -300,9 +302,8 @@ for my $use_next (0, 1) {
       like( $_->title, qr/^e\d/, "correct title" )
         for $cd->tracks;
       ok( defined $cd->single_track, 'single track prefetched on 1987 cd' );
-      # FIXME - crap! skipping prefetch also doesn't work, next commit
-      #is( $cd->single_track->cd->artist->id, 1, 'Single_track->cd->artist prefetched on 1978 cd' );
-      #is( scalar $cd->single_track->cd->artist->cds, 6, '6 cds prefetched on artist' );
+      is( $cd->single_track->cd->artist->id, 1, 'Single_track->cd->artist prefetched on 1978 cd' );
+      is( scalar $cd->single_track->cd->artist->cds, 6, '6 cds prefetched on artist' );
     }
   }
 }
@@ -311,13 +312,30 @@ $schema->storage->debugcb(undef);
 $schema->storage->debug($orig_debug);
 is ($queries, 2, "Only two queries for rwo prefetch calls total");
 
-# can't is_deeply a random set - need *some* order
-my @hris = sort { $a->{year} cmp $b->{year} } @{$rs->search({}, {
+# can't cmp_deeply a random set - need *some* order
+my $ord_rs = $rs->search({}, {
   order_by => [ 'tracks_2.title', 'tracks.title', 'cds.cdid', \ 'RANDOM()' ],
-})->all_hri};
-is (@hris, 6, 'hri count matches' );
+  result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+});
+my @hris_all = sort { $a->{year} cmp $b->{year} } $ord_rs->all;
+is (@hris_all, 6, 'hri count matches' );
+
+my $iter_rs = $rs->search({}, {
+  order_by => [ 'me.year', 'me.cdid', 'tracks_2.title', 'tracks.title', 'cds.cdid', \ 'RANDOM()' ],
+  result_class => 'DBIx::Class::ResultClass::HashRefInflator',
+});
+my @hris_iter;
+while (my $r = $iter_rs->next) {
+  push @hris_iter, $r;
+}
+
+cmp_deeply(
+  \@hris_iter,
+  \@hris_all,
+  'Iteration works correctly',
+);
 
-is_deeply (\@hris, [
+cmp_deeply (\@hris_all, [
   {
     single_track => undef,
     tracks => [
@@ -464,4 +482,46 @@ is_deeply (\@hris, [
   },
 ], 'W00T, multi-has_many manual underdefined root prefetch with collapse works');
 
+$rs = $rs->search({}, { order_by => [ 'me.year', 'me.cdid', \ 'RANDOM()' ] });
+my @objs_iter;
+while (my $r = $rs->next) {
+  push @objs_iter, $r;
+}
+
+for my $i (0 .. $#objs_iter) {
+  is ($objs_iter[$i]->year, $hris_all[$i]{year}, "Expected year on object $i" );
+  is (
+    (defined $objs_iter[$i]->single_track),
+    (defined $hris_all[$i]{single_track}),
+    "Expected single relation on object $i"
+  );
+}
+
+$rs = $schema->resultset('Artist')->search({}, {
+  join => 'cds',
+  columns => ['cds.title', 'cds.artist' ],
+  collapse => 1,
+  order_by => [qw( me.name cds.title )],
+});
+
+$rs->create({ name => "${_}_cdless" })
+  for (qw( Z A ));
+
+cmp_deeply (
+  $rs->all_hri,
+  [
+    { cds => [] },
+    { cds => [
+      { artist => 1, title => "Equinoxe" },
+      { artist => 1, title => "Magnetic Fields" },
+      { artist => 1, title => "Oxygene" },
+      { artist => 1, title => "fuzzy_1" },
+      { artist => 1, title => "fuzzy_2" },
+      { artist => 1, title => "fuzzy_3" },
+    ] },
+    { cds => [] },
+  ],
+  'Expected HRI of 1:M with empty root selection',
+);
+
 done_testing;