Untodoify tests - these are not 'nice to have', they must work
Peter Rabbitson [Sun, 12 Dec 2010 07:14:10 +0000 (08:14 +0100)]
lib/DBIx/Class/ResultSource.pm
t/relationship/custom.t

index 4e9408a..834555a 100644 (file)
@@ -1554,26 +1554,14 @@ sub _resolve_condition {
   my ($self, $cond, $as, $for, $rel) = @_;
   if (ref $cond eq 'CODE') {
 
-    # heuristic for the actual relname
-    if (! defined $rel) {
-      if (!ref $as) {
-        $rel = $as;
-      }
-      elsif (!ref $for) {
-        $rel = $for;
-      }
-    }
-
-    if (! defined $rel) {
-      $self->throw_exception ('Unable to determine relationship name for condition resolution');
-    }
+    my $obj_rel = !!ref $for;
 
     return $cond->({
-      self_alias => ref $for ? $as : $for,
-      foreign_alias => ref $for ? $self->related_source($rel)->resultset->current_source_alias : $as,
+      self_alias => $obj_rel ? $as : $for,
+      foreign_alias => $obj_rel ? 'me' : $as,
       self_resultsource => $self,
-      foreign_relname => $rel,
-      self_rowobj => ref $for ? $for : undef
+      foreign_relname => $rel || ($obj_rel ? $as : $for),
+      self_rowobj => $obj_rel ? $for : undef
     });
 
   } elsif (ref $cond eq 'HASH') {
index 4fb96ff..68936e3 100644 (file)
@@ -35,50 +35,49 @@ foreach my $artwork (@artworks) {
 
 
 my $cds_80s_rs = $artist->cds_80s;
-is_same_sql_bind($cds_80s_rs->as_query,
-                 '(SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track FROM cd me'.
-                 ' WHERE ( ( me.artist = ? AND ( me.year < ? AND me.year > ? ) ) ))',
-                 [
-                  [ 'me.artist' => 4    ],
-                  [ 'me.year'   => 1990 ],
-                  [ 'me.year'   => 1979 ],
-                 ]);
+is_same_sql_bind(
+  $cds_80s_rs->as_query,
+  '(
+    SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
+      FROM cd me
+    WHERE ( ( me.artist = ? AND ( me.year < ? AND me.year > ? ) ) )
+  )',
+  [
+    [ 'me.artist' => 21   ],
+    [ 'me.year' => 1990 ],
+    [ 'me.year' => 1979 ],
+  ]
+);
 my @cds_80s = $cds_80s_rs->all;
 is(@cds_80s, 6, '6 80s cds found (1980 - 1985)');
 map { ok($_->year < 1990 && $_->year > 1979) } @cds_80s;
 
-# this is the current version, enhanced version below.
-my $cds_90s_rs = $artist2->cds_90s;
-is_same_sql_bind($cds_90s_rs->as_query,
-                 '(SELECT cds_90s.cdid, cds_90s.artist, cds_90s.title, cds_90s.year, cds_90s.genreid,'.
-                 ' cds_90s.single_track FROM artist artist__row JOIN cd cds_90s ON ( cds_90s.artist = artist__row.artistid'.
-                 ' AND ( cds_90s.year < ? AND cds_90s.year > ? ) ) WHERE ( artist__row.artistid = ? ))',
-                 [
-                  [ 'cds_90s.year' => 2000 ],
-                  [ 'cds_90s.year' => 1989 ],
-                  [ 'artist__row.artistid'  => 5    ],
-                 ]);
 
-TODO: {
-  local $TODO = 'enhanced aliasing in search_related';
-  my $cds_90s_rs = $artist2->cds_90s;
-  is_same_sql_bind($cds_90s_rs->as_query,
-                   '(SELECT me.cdid, me.artist, me.title, me.year, me.genreid,'.
-                   ' me.single_track FROM artist artist__row JOIN cd me ON ( me.artist = artist__row.artistid'.
-                   ' AND ( me.year < ? AND me.year > ? ) ) WHERE ( artist__row.artistid = ? ))',
-                   [
-                    [ 'me.year' => 2000 ],
-                    [ 'me.year' => 1989 ],
-                    [ 'artist__row.artistid'  => 5    ],
-                   ]);
-}
+my $cds_90s_rs = $artist2->cds_90s;
+is_same_sql_bind(
+  $cds_90s_rs->as_query,
+  '(
+    SELECT me.cdid, me.artist, me.title, me.year, me.genreid, me.single_track
+      FROM artist artist__row
+      JOIN cd me
+        ON ( me.artist = artist__row.artistid AND ( me.year < ? AND me.year > ? ) )
+      WHERE ( artist__row.artistid = ? )
+  )',
+  [
+    [ 'me.year' => 2000 ],
+    [ 'me.year' => 1989 ],
+    [ 'artist__row.artistid' => 22 ],
+  ]
+);
 my @cds_90s = $cds_90s_rs->all;
 is(@cds_90s, 6, '6 90s cds found (1990 - 1995) even with non-optimized search');
 map { ok($_->year < 2000 && $_->year > 1989) } @cds_90s;
 
-my @cds_90s_95 = $artist2->cds_90s->search({ 'year' => 1995 });
-is(@cds_90s_95, 1, '1 90s (95) cds found even with non-optimized search');
-map { ok($_->year == 1995) } @cds_90s_95;
+lives_ok {
+  my @cds_90s_95 = $artist2->cds_90s->search({ 'me.year' => 1995 });
+  is(@cds_90s_95, 1, '1 90s (95) cds found even with non-optimized search');
+  map { ok($_->year == 1995) } @cds_90s_95;
+} 'should preserve chain-head "me" alias (API-consistency)';
 
 # search for all artists prefetching published cds in the 80s...
 my @all_artists_with_80_cds = $schema->resultset("Artist")->search