summaryrefslogtreecommitdiff
path: root/modules/simpletest/tests/upgrade/upgrade.taxonomy.test
blob: 6160235327a7ebe048e69dbf7f5771ac8ee30034 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
<?php
// $Id$

/**
 * Test taxonomy upgrades.
 */
class UpgradePathTaxonomyTestCase extends UpgradePathTestCase {
  public static function getInfo() {
    return array(
      'name'  => 'Taxonomy upgrade path',
      'description'  => 'Taxonomy upgrade path tests.',
      'group' => 'Upgrade path',
    );
  }

  public function setUp() {
    // Path to the database dump.
    $this->databaseDumpFile = drupal_get_path('module', 'simpletest') . '/tests/upgrade/drupal-6.filled.database.php';
    parent::setUp();
  }

  /**
   * Retrieve an array mapping allowed vocabulary id to field name for
   * all taxonomy_term_reference fields for which an instance exists
   * for the specified entity type and bundle.
   */
  function instanceVocabularies($entity_type, $bundle) {
    $instances = array();
    foreach (field_info_instances($entity_type, $bundle) as $instance) {
      $field = field_info_field($instance['field_name']);
      if ($field['type'] == 'taxonomy_term_reference') {
        foreach ($field['settings']['allowed_values'] as $tree) {
          // Prefer valid taxonomy term reference fields for a given vocabulary
          // when they exist.
          if (empty($instances[$tree['vid']]) || $instances[$tree['vid']] == 'taxonomyextra') {
            $instances[$tree['vid']] = $field['field_name'];
          }
        }
      }
    }
    return $instances;
  }

  /**
   * Basic tests for the taxonomy upgrade.
   */
  public function testTaxonomyUpgrade() {
    $this->assertTrue($this->performUpgrade(), t('The upgrade was completed successfully.'));

    // Visit the front page to assert for PHP warning and errors.
    $this->drupalGet('');

    // Check that taxonomy_vocabulary_node_type and taxonomy_term_node have been
    // removed.
    $this->assertFalse(db_table_exists('taxonomy_vocabulary_node_type'), t('taxonomy_vocabulary_node_type has been removed.'));
    $this->assertFalse(db_table_exists('taxonomy_term_node'), t('taxonomy_term_node has been removed.'));

    // Check that the node type 'page' has been associated to a taxonomy
    // reference field for each vocabulary.
    $vocabularies = taxonomy_get_vocabularies();
    $voc_keys = array_keys($vocabularies);
    $instances = $this->instanceVocabularies('node', 'page');
    $inst_keys = array_keys($instances);
    sort($voc_keys);
    sort($inst_keys);
    $this->assertEqual($voc_keys, $inst_keys, t('Node type page has instances for every vocabulary.'));

    // Node type 'story' was not explicitly in $vocabulary->nodes but
    // each node of type 'story' was associated to one or more terms.
    // Check that the node type 'story' has been associated only to
    // the taxonomyextra field. 
    $instances = $this->instanceVocabularies('node', 'story');
    $field_names = array_flip($instances);
    $this->assertEqual(count($field_names), 1, t('Only one taxonomy term field instance exists for story nodes'));
    $this->assertEqual(key($field_names), 'taxonomyextra', t('Only the excess taxonomy term field is used on story nodes'));

    // Check that the node type 'poll' has been associated to no taxonomy
    // reference field.
    $instances = $this->instanceVocabularies('node', 'poll');
    $this->assertTrue(empty($instances), t('Node type poll has no taxonomy term reference field instances.'));

    // Check that each node of type 'page' and 'story' is associated to all the
    // terms except terms whose ID is equal to the node ID or is equal to the
    // node ID subtracted from 49.
    $nodes = node_load_multiple(array(), array('type' => 'page'));
    $nodes += node_load_multiple(array(), array('type' => 'story'));
    $terms = db_select('taxonomy_term_data', 'td')
      ->fields('td')
      ->execute()
      ->fetchAllAssoc('tid');
    field_attach_prepare_view('node', $nodes, 'full');
    foreach ($nodes as $nid => $node) {
      $node->content = field_attach_view('node', $node, 'full');
      $render = drupal_render($node->content);
      $this->drupalSetContent($render);
      debug("Testing node $nid");
      $this->verbose($render);
      foreach ($terms as $tid => $term) {
        $args = array(
          '%name' => $term->name,
          '@tid' => $tid,
          '%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));
        }
        else {
          $this->assertRaw($link, t('Term %name (@tid) is displayed on node %nid', $args));
        }
      }

      // The first 12 nodes have two revisions. For nodes with
      // revisions, check that the oldest revision is associated only
      // to terms whose ID is equal to the node ID or 49 less the node ID.
      $revisions = node_revision_list($node);
      if ($node->nid < 13) {
        $this->assertEqual(count($revisions), 2, t('Node %nid has two revisions.', $args));
        $last_rev = end($revisions);
        $args['%old_vid'] = $last_rev->vid;

        $node_old = node_load($node->nid, $last_rev->vid);
        field_attach_prepare_view('node', array($node_old->nid => $node_old), 'full');
        $node_old->content = field_attach_view('node', $node_old, 'full');
        $render = drupal_render($node_old->content);
        $this->drupalSetContent($render);
        $this->verbose($render);

        $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));
        $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));
      }
      else {
        $this->assertEqual(count($revisions), 1, t('Node %nid has one revision.', $args));
      }
    }
  }
}