Force xt/ tests to run on anything involving a create_distdir
[dbsrgits/DBIx-Class.git] / t / 90join_torture.t
index 90a78b2..17d5116 100644 (file)
@@ -3,62 +3,34 @@ use warnings;
 
 use Test::More;
 use Test::Exception;
-
 use lib qw(t/lib);
 use DBICTest;
 use DBIC::SqlMakerTest;
 my $schema = DBICTest->init_schema();
 
-lives_ok (sub {
-  my $rs = $schema->resultset( 'CD' )->search(
-    {
-      'producer.name'   => 'blah',
-      'producer_2.name' => 'foo',
-    },
-    {
-      'join' => [
-        { cd_to_producer => 'producer' },
-        { cd_to_producer => 'producer' },
-      ],
-      'prefetch' => [
-        'artist',
-        { cd_to_producer => { producer => 'producer_to_cd' } },
-      ],
-    }
-  );
+ {
+   my $rs = $schema->resultset( 'CD' )->search(
+     {
+       'producer.name'   => 'blah',
+       'producer_2.name' => 'foo',
+     },
+     {
+       'join' => [
+         { cd_to_producer => 'producer' },
+         { cd_to_producer => 'producer' },
+       ],
+       'prefetch' => [
+         'artist',
+         { cd_to_producer => 'producer' },
+       ],
+     }
+   );
+
+   lives_ok {
+     my @rows = $rs->all();
+   };
+ }
 
-  my @executed = $rs->all();
-
-  is_same_sql_bind (
-    $rs->as_query,
-    '(
-      SELECT  me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track,
-              artist.artistid, artist.name, artist.rank, artist.charfield,
-              cd_to_producer.cd, cd_to_producer.producer, cd_to_producer.attribute,
-              producer.producerid, producer.name,
-              producer_to_cd.cd, producer_to_cd.producer, producer_to_cd.attribute
-        FROM cd me
-        LEFT JOIN cd_to_producer cd_to_producer
-          ON cd_to_producer.cd = me.cdid
-        LEFT JOIN producer producer
-          ON producer.producerid = cd_to_producer.producer
-        LEFT JOIN cd_to_producer producer_to_cd
-          ON producer_to_cd.producer = producer.producerid
-        LEFT JOIN cd_to_producer cd_to_producer_2
-          ON cd_to_producer_2.cd = me.cdid
-        LEFT JOIN producer producer_2
-          ON producer_2.producerid = cd_to_producer_2.producer
-        JOIN artist artist ON artist.artistid = me.artist
-      WHERE ( ( producer.name = ? AND producer_2.name = ? ) )
-      ORDER BY cd_to_producer.cd, producer_to_cd.producer
-    )',
-    [
-      [ 'producer.name' => 'blah' ],
-      [ 'producer_2.name' => 'foo' ],
-    ],
-  );
-
-}, 'Complex join parsed/executed properly');
 
 my @rs1a_results = $schema->resultset("Artist")->search_related('cds', {title => 'Forkful of bees'}, {order_by => 'title'});
 is($rs1a_results[0]->title, 'Forkful of bees', "bare field conditions okay after search related");
@@ -133,7 +105,7 @@ my $merge_rs_2 = $schema->resultset("Artist")->search({ }, { join => 'cds' })->s
 is(scalar(@{$merge_rs_2->{attrs}->{join}}), 1, 'only one join kept when inherited');
 my $merge_rs_2_cd = $merge_rs_2->next;
 
-eval {
+lives_ok (sub {
 
   my @rs_with_prefetch = $schema->resultset('TreeLike')
                                 ->search(
@@ -142,9 +114,7 @@ eval {
     prefetch => [ 'parent', { 'children' => 'parent' } ],
     });
 
-};
-
-ok(!$@, "pathological prefetch ok");
+}, 'pathological prefetch ok');
 
 my $rs = $schema->resultset("Artist")->search({}, { join => 'twokeys' });
 my $second_search_rs = $rs->search({ 'cds_2.cdid' => '2' }, { join =>
@@ -152,4 +122,60 @@ my $second_search_rs = $rs->search({ 'cds_2.cdid' => '2' }, { join =>
 is(scalar(@{$second_search_rs->{attrs}->{join}}), 3, 'both joins kept');
 ok($second_search_rs->next, 'query on double joined rel runs okay');
 
+# test joinmap pruner
+lives_ok ( sub {
+  my $rs = $schema->resultset('Artwork')->search (
+    {
+    },
+    {
+      distinct => 1,
+      join => [
+        { artwork_to_artist => 'artist' },
+        { cd => 'artist' },
+      ],
+    },
+  );
+
+  is_same_sql_bind (
+    $rs->count_rs->as_query,
+    '(
+      SELECT COUNT( * )
+        FROM (
+          SELECT me.cd_id
+            FROM cd_artwork me
+            JOIN cd cd ON cd.cdid = me.cd_id
+            JOIN artist artist_2 ON artist_2.artistid = cd.artist
+          GROUP BY me.cd_id
+        ) me
+    )',
+    [],
+  );
+
+  ok (defined $rs->count);
+});
+
+# make sure multiplying endpoints do not lose heir join-path
+lives_ok (sub {
+  my $rs = $schema->resultset('CD')->search (
+    { },
+    { join => { artwork => 'images' } },
+  )->get_column('cdid');
+
+  is_same_sql_bind (
+    $rs->as_query,
+    '(
+      SELECT me.cdid
+        FROM cd me
+        LEFT JOIN cd_artwork artwork
+          ON artwork.cd_id = me.cdid
+        LEFT JOIN images images
+          ON images.artwork_id = artwork.cd_id
+    )',
+    [],
+  );
+
+  # execution
+  $rs->next;
+});
+
 done_testing;