#933270: Taxonomy terms are incorrectly affected.

From: Damien Tournoud <damien@commerceguys.com>


---
 simpletest/drupal_web_test_case.php            |    6 ++-
 simpletest/tests/upgrade/upgrade.taxonomy.test |   50 +++++++++++++++++++++---
 2 files changed, 48 insertions(+), 8 deletions(-)

diff --git modules/simpletest/drupal_web_test_case.php modules/simpletest/drupal_web_test_case.php
index 3355fc2..0f9da4a 100644
--- modules/simpletest/drupal_web_test_case.php
+++ modules/simpletest/drupal_web_test_case.php
@@ -2180,7 +2180,11 @@ class DrupalWebTestCase extends DrupalTestCase {
   protected function xpath($xpath, array $arguments = array()) {
     if ($this->parse()) {
       $xpath = $this->buildXPathQuery($xpath, $arguments);
-      return $this->elements->xpath($xpath);
+      $result = $this->elements->xpath($xpath);
+      // Some combinaisons of PHP / libxml versions return an empty array
+      // instead of the documented FALSE. Forcefully convert any falsish values
+      // to FALSE.
+      return $result ? $result : FALSE;
     }
     else {
       return FALSE;
diff --git modules/simpletest/tests/upgrade/upgrade.taxonomy.test modules/simpletest/tests/upgrade/upgrade.taxonomy.test
index 230d4f5..1be5730 100644
--- modules/simpletest/tests/upgrade/upgrade.taxonomy.test
+++ modules/simpletest/tests/upgrade/upgrade.taxonomy.test
@@ -90,6 +90,8 @@ class UpgradePathTaxonomyTestCase extends UpgradePathTestCase {
     $nodes += node_load_multiple(array(), array('type' => 'story'));
     $terms = db_select('taxonomy_term_data', 'td')
       ->fields('td')
+      ->orderBy('vid')
+      ->orderBy('tid')
       ->execute()
       ->fetchAllAssoc('tid');
     field_attach_prepare_view('node', $nodes, 'full');
@@ -98,22 +100,56 @@ class UpgradePathTaxonomyTestCase extends UpgradePathTestCase {
       $render = drupal_render($node->content);
       $this->drupalSetContent($render);
       $this->verbose($render);
+
+      $vocabulary_seen = array();
       foreach ($terms as $tid => $term) {
+        // In our test database, each node is arbitrary associated with all
+        // the terms, except two: one which tid is ($nid) and the other which
+        // tid is (49 - $nid).
+        $should_be_displayed = ($tid != $nid) && ($tid + $nid != 49);
+
+        // Moreover, only vocabularies 13 to 24 are properly associated with
+        // the node type 'page'. All other node types are not associated with
+        // any vocabulary, but still are associated with terms. Those terms
+        // will be moved to the taxonomy extra field.
+        if ($node->type == 'page' && $term->vid >= 13 && $term->vid <= 24) {
+          $vocabulary = taxonomy_vocabulary_load($term->vid);
+          $field_class = 'field-name-' . strtr('taxonomy_' . $vocabulary->machine_name, '_', '-');;
+        }
+        else {
+          $field_class = 'field-name-taxonomyextra';
+        }
+
+        // More over, odd vocabularies are single, so any additional term will
+        // be moved with the taxonomy extra field.
+        if ($should_be_displayed) {
+          if ($term->vid % 2 == 1 && !empty($vocabulary_seen[$term->vid])) {
+            $field_class = 'field-name-taxonomyextra';
+          }
+          $vocabulary_seen[$term->vid] = TRUE;
+        }
+
         $args = array(
           '%name' => $term->name,
-          '@tid' => $tid,
+          '@field' => $field_class,
           '%nid' => $nid,
         );
 
         // Use link rather than term name because migrated term names can be
         // substrings of other term names. e.g. "term 1 of vocabulary 2" is
         // found when "term 1 of vocabulary 20" is output.
-        $link = l($term->name, 'taxonomy/term/' . $term->tid);
-        if (($tid == $nid) || ($tid + $nid == 49)) {
-          $this->assertNoRaw($link, t('Term %name (@tid) is not displayed on node %nid', $args));
+        $term_path = url('taxonomy/term/' . $term->tid);
+        if (!$should_be_displayed) {
+          // Look for any link with the term path.
+          $links = $this->xpath('//a[@href=:term_path]', array(':term_path' => $term_path));
+          $this->assertFalse($links, t('Term %name (@field) is not displayed on node %nid', $args));
         }
         else {
-          $this->assertRaw($link, t('Term %name (@tid) is displayed on node %nid', $args));
+          // Look for a link with the term path inside the correct field.
+          // We search for "SPACE + class + SPACE" to avoid matching a substring
+          // of the class.
+          $links = $this->xpath('//div[contains(concat(" ", normalize-space(@class), " "), :field_class)]//a[@href=:term_path]', array(':field_class' => ' ' . $field_class . ' ', ':term_path' => $term_path));
+          $this->assertTrue($links, t('Term %name (@field) is displayed on node %nid', $args));
         }
       }
 
@@ -142,10 +178,10 @@ class UpgradePathTaxonomyTestCase extends UpgradePathTestCase {
 
         $term = $terms[$node->nid];
         $link = l($term->name, 'taxonomy/term/' . $term->tid);
-        $this->assertRaw($link, t('Term %name (@tid) is displayed on node %nid vid %old_vid.', $args));
+        $this->assertRaw($link, t('Term %name (@field) is displayed on node %nid vid %old_vid.', $args));
         $term = $terms[49-$node->nid];
         $link = l($term->name, 'taxonomy/term/' . $term->tid);
-        $this->assertRaw($link, t('Term %name (@tid) is displayed on node %nid %old_vid.', $args));
+        $this->assertRaw($link, t('Term %name (@field) is displayed on node %nid %old_vid.', $args));
       }
       else {
         $this->assertEqual(count($revisions), 1, t('Node %nid has one revision.', $args));
