Skip to content
node.test 13.9 KiB
Newer Older
<?php
// $Id$

/**
 * Test node migration.
 */
class MigrateNodeUnitTest extends DrupalWebTestCase {
  public static function getInfo() {
    return array(
      'name' => 'Node migration',
      'description' => 'Test migration of node data',
      'group' => 'Migrate',
    );
  }

  function setUp() {
    parent::setUp('autoload', 'dbtng', 'taxonomy', 'content', 'text', 'number',
      'date_api', 'date_timezone', 'date', 'filefield', 'imagefield',
      'migrate', 'migrate_extras', 'migrate_example');
    autoload_registry_update();
    // Create and login user
    $migrate_user = $this->drupalCreateUser(array('access content',
      'administer nodes', 'create page content', 'delete any page content'));
    $this->drupalLogin($migrate_user);
  }

  function testNodeImport() {
Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineVariety');
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Variety term import returned RESULT_COMPLETED'));
Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineRegion');
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Region term import returned RESULT_COMPLETED'));
Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineBestWith');
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('"Best With" term import returned RESULT_COMPLETED'));
Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineUser');
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('User import returned RESULT_COMPLETED'));
Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineProducer');
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Producer node import returned RESULT_COMPLETED'));
Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineWine');
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import returned RESULT_COMPLETED'));

    // Gather wine and producer nodes, and their corresponding input data
    $nids = db_select('node', 'n')
            ->fields('n', array('nid'))
            ->condition('type', 'migrate_example_producer')
            ->execute()
            ->fetchCol();
    foreach ($nids as $nid) {
      $node = node_load($nid);
      $producer_nodes[$node->title] = $node;
    }

    $query = db_select('migrate_example_wine_producer', 'p')
             ->fields('p', array('producerid', 'name', 'body', 'excerpt', 'accountid'));
    // Region term is singletons, handled straighforwardly
    $query->leftJoin('migrate_example_wine_category_producer', 'reg',
      "p.producerid = reg.producerid");
    $query->addField('reg', 'categoryid', 'region');
    $result = $query->execute();
    $producer_rows = array();
    foreach ($result as $row) {
      $producer_rows[$row->name] = $row;
    }
    $this->assertEqual(count($producer_nodes), count($producer_rows),
      t('Counts of producer nodes and input rows match'));
    $nids = db_select('node', 'n')
            ->fields('n', array('nid'))
            ->condition('type', 'migrate_example_wine')
            ->execute()
            ->fetchCol();
    foreach ($nids as $nid) {
      $node = node_load($nid);
      $wine_nodes[$node->title] = $node;
    $query = db_select('migrate_example_wine', 'w')
             ->fields('w', array('wineid', 'name', 'body', 'excerpt', 'accountid',
               'image', 'posted', 'last_changed', 'variety', 'region', 'rating'));
    $query->leftJoin('migrate_example_wine_category_wine', 'cwbw',
      "w.wineid = cwbw.wineid");
    $query->leftJoin('migrate_example_wine_categories', 'bw',
      "cwbw.categoryid = bw.categoryid AND bw.type = 'best_with'");
    // Gives a single comma-separated list of related terms
    $query->groupBy('cwbw.wineid');
    $query->addExpression('GROUP_CONCAT(bw.categoryid)', 'best_with');
    $result = $query->execute();
    $wine_rows = array();
    foreach ($result as $row) {
      $wine_rows[$row->name] = $row;
    }
    $this->assertEqual(count($wine_nodes), count($wine_rows),
      t('Counts of wine nodes and input rows match'));

    // Test each base node field
    $producer_node = $producer_nodes['Montes'];
    $producer_row = $producer_rows['Montes'];
    $wine_node = $wine_nodes['Montes Classic Cabernet Sauvignon'];
    $wine_row = $wine_rows['Montes Classic Cabernet Sauvignon'];
Mike Ryan's avatar
Mike Ryan committed
    $user_migration = MigrationBase::getInstance('WineUser');

    $mapped_uid = $user_migration->getMap()->lookupDestinationID(
      array($producer_row->accountid), $migration);
    if (is_array($mapped_uid)) {
      $this->assertEqual($producer_node->uid, reset($mapped_uid),
        t('uid properly migrated'));
    }
    else {
      $this->error(t('Account ID !id not migrated', array('!id' => $producer_row->accountid)));
    }
    $this->assertEqual($wine_node->created, $wine_row->posted,
      t('created properly migrated'));
    $this->assertEqual($wine_node->changed, $wine_row->last_changed,
      t('changed properly migrated'));
    $this->assertEqual($wine_node->body, $wine_row->body,
      t('body properly migrated'));
    $this->assertEqual($wine_node->teaser, $wine_row->excerpt,
      t('teaser properly migrated'));
    // Taxonomy terms - single and multiple
Mike Ryan's avatar
Mike Ryan committed
    $variety_migration = MigrationBase::getInstance('WineVariety');
    $mapped_tid = $variety_migration->getMap()->lookupDestinationID(
      array($wine_row->variety), $migration);
    if (is_array($mapped_tid)) {
      $this->assertNotNull($wine_node->taxonomy[reset($mapped_tid)],
        t('Single taxonomy_term_reference properly migrated'));
    }
    else {
      $this->error(t('Variety !var not migrated', array('!var' => $wine_row->variety)));
    }
Mike Ryan's avatar
Mike Ryan committed
    $best_with_migration = MigrationBase::getInstance('WineBestWith');
    $source_ids = explode(',', $wine_row->best_with);
    $mapped_tids = array();
    foreach ($source_ids as $source_id) {
      $tid = $best_with_migration->getMap()->lookupDestinationID(
        array($source_id), $migration);
      if ($tid) {
        $mapped_tids[reset($tid)] = reset($tid);
      }
    }
/*    $this->assertEqual(count($best_with), count($mapped_tids),
      t('Counts of Best With match'));*/
    foreach ($mapped_tids as $tid) {
      $this->assertNotNull($wine_node->taxonomy[$tid],
        t('Multiple value taxonomy_term_reference properly migrated'));
    }

    // Test Field API fields of all types
    $this->assertEqual($wine_node->field_migrate_example_wine_ratin[0]['value'],
      $wine_row->rating, t('Decimal field (rating) matches'));

    // Test the vintages field (demonstrating prepareRow() works) - we know
    // the valid vintages for this node are 2006 and 2007
    $expected = array(array('value' => 2006), array('value' => 2007));
    $this->assertEqual($wine_node->field_migrate_example_top_vintag, $expected,
      t('Vintages match (prepareRow works)'));

    // Test highwater marks - add new wines, modify an old one, and see what changes
    $fields = array('wineid', 'name', 'body', 'excerpt', 'accountid', 'image',
      'posted', 'last_changed', 'variety', 'region', 'rating');
    $query = db_insert('migrate_example_wine')
             ->fields($fields);
    $data = array(
      // Timestamps 1284008523, 1284120550
      array(3, 'Schloss Muhlenhof Dornfelder', 'Juicy black & red berry fruits', 'Pretty good', 9, NULL,
        strtotime('2010-09-09 01:02:03'), strtotime('2010-09-10 08:09:10'), 25, 17, 95),
      // Timestamps 1286122209, 1286122209
      array(4, 'Gachot-Monot Bourgogne Rge 06', 'Funky', 'Pair with white sauced dishes', 3, NULL,
        strtotime('2010-10-03 12:10:09'), strtotime('2010-10-03 12:10:09'), 26, 2, 85),
    );
    foreach ($data as $row) {
      $query->values(array_combine($fields, $row));
    }
    $query->execute();

    db_update('migrate_example_wine')
             ->fields(array(
              'body' => 'Not so much berry character',
              // Timestamp 1285058521
              'last_changed' => strtotime('2010-10-21 04:42:01'),
             ))
             ->condition('wineid', 2)
             ->execute();

Mike Ryan's avatar
Mike Ryan committed
    $migration = Migration::getInstance('WineWine');
    $result = $migration->processImport();

    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import returned RESULT_COMPLETED'));
    $count = db_select('node', 'n')
             ->fields('n', array('nid'))
             ->condition('n.type', 'migrate_example_wine')
             ->countQuery()
             ->execute()
             ->fetchField();
    if (!$this->assertEqual($count, 4, t('Now 4 wine nodes exist'))) {
      $this->error(t('There are now !count nodes', array('!count' => count($rawnodes))));
    }
    $nid = db_select('node', 'n')
             ->fields('n', array('nid'))
             ->condition('n.title', 'Archeo Ruggero di Tasso Nero d\'Avola')
             ->execute()
             ->fetchField();
    $node = node_load($nid, NULL, TRUE);
    $body = $node->body;
    if (!$this->assertEqual($body, 'Not so much berry character', t('Body updated'))) {
      $this->error(t('Actual body !body', array('!body' => $body)));
    }

    // Test rollback
    $result = $migration->processRollback();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node rollback returned RESULT_COMPLETED'));
    $count = db_select('node', 'n')
              ->condition('type', 'migrate_example_wine')
              ->countQuery()
              ->execute()
              ->fetchField();
    $this->assertEqual($count, 0, t('All nodes deleted'));
    $count = db_select('migrate_map_winewine', 'map')
              ->fields('map', array('sourceid1'))
              ->countQuery()
              ->execute()
              ->fetchField();
    $this->assertEqual($count, 0, t('Map cleared'));
    $count = db_select('migrate_message_winewine', 'msg')
              ->fields('msg', array('sourceid1'))
              ->countQuery()
              ->execute()
              ->fetchField();
    $this->assertEqual($count, 0, t('Messages cleared'));
    // Now test highwater with unjoined map table
    $migration->getSource()->setMapJoinable(FALSE);
    $result = $migration->processImport(array('itemlimit' => 2));
    $query = db_update('migrate_example_wine')
             ->fields(array(
              'body' => 'Very berry',
              // Timestamp 1286008921
              'last_changed' => strtotime('2010-10-02 04:42:01'),
             ))
             ->condition('wineid', 1)
             ->execute();
    $result = $migration->processImport();
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import returned RESULT_COMPLETED'));
    $count = db_select('node', 'n')
              ->fields('n', array('nid'))
              ->condition('type', 'migrate_example_wine')
              ->countQuery()
              ->execute()
              ->fetchField();
    if (!$this->assertEqual($count, 4, t('Now 4 wine nodes exist'))) {
      $this->error(t('There are now !count nodes', array('!count' => count($rawnodes))));
    }
    $nid = db_select('node', 'n')
             ->fields('n', array('nid'))
             ->condition('n.title', 'Montes Classic Cabernet Sauvignon')
             ->execute()
             ->fetchField();
    $node = node_load($nid, NULL, TRUE);
    $body = $node->body;
    if (!$this->assertEqual($body, 'Very berry', t('Body updated'))) {
      $this->error(t('Actual body !body', array('!body' => $body)));
    }

    // Test itemlimit (joined map table)
    $result = $migration->processRollback();
    $migration->getSource()->setMapJoinable(TRUE);
    $result = $migration->processImport(array('itemlimit' => 1));
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import with itemlimit returned RESULT_COMPLETED'));
    $titles = db_select('node', 'n')
              ->fields('n', array('title'))
              ->condition('type', 'migrate_example_wine')
              ->execute()
              ->fetchCol();
    $this->assertEqual(count($titles), 1, t('One node imported'));

    // Test idlist (joined map table)
    $result = $migration->processRollback();
    $result = $migration->processImport(array('idlist' => 2));
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import with idlist returned RESULT_COMPLETED'));
    $titles = db_select('node', 'n')
              ->fields('n', array('title'))
              ->condition('type', 'migrate_example_wine')
              ->execute()
              ->fetchCol();
    $this->assertEqual(count($titles), 1, t('One node imported'));
    $this->assertEqual($titles[0], 'Archeo Ruggero di Tasso Nero d\'Avola',
      t('Single specified node imported'));

    // Test itemlimit (unjoined map table)
    $result = $migration->processRollback();
    $migration->getSource()->setMapJoinable(FALSE);
    $result = $migration->processImport(array('itemlimit' => 1));
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import with itemlimit returned RESULT_COMPLETED'));
    $titles = db_select('node', 'n')
              ->fields('n', array('title'))
              ->condition('type', 'migrate_example_wine')
              ->execute()
              ->fetchCol();
    $this->assertEqual(count($titles), 1, t('One node imported'));

    // Test idlist (unjoined map table)
    $result = $migration->processRollback();
    $result = $migration->processImport(array('idlist' => 2));
    $this->assertEqual($result, Migration::RESULT_COMPLETED,
      t('Wine node import with idlist returned RESULT_COMPLETED'));
    $titles = db_select('node', 'n')
              ->fields('n', array('title'))
              ->condition('type', 'migrate_example_wine')
              ->execute()
              ->fetchCol();
    $this->assertEqual(count($titles), 1, t('One node imported'));
    $this->assertEqual($titles[0], 'Archeo Ruggero di Tasso Nero d\'Avola',
      t('Single specified node imported'));