You are here

function MigrateNodeUnitTest::testNodeImport in Migrate 6.2

Same name and namespace in other branches
  1. 7.2 tests/plugins/destinations/node.test \MigrateNodeUnitTest::testNodeImport()

File

tests/plugins/destinations/node.test, line 29

Class

MigrateNodeUnitTest
Test node migration.

Code

function testNodeImport() {
  $migration = Migration::getInstance('WineVariety');
  $result = $migration
    ->processImport();
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('Variety term import returned RESULT_COMPLETED'));
  $migration = Migration::getInstance('WineRegion');
  $result = $migration
    ->processImport();
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('Region term import returned RESULT_COMPLETED'));
  $migration = Migration::getInstance('WineBestWith');
  $result = $migration
    ->processImport();
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('"Best With" term import returned RESULT_COMPLETED'));
  $migration = Migration::getInstance('WineRole');
  $result = $migration
    ->processImport();
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('Role import returned RESULT_COMPLETED'));
  $migration = Migration::getInstance('WineUser');
  $result = $migration
    ->processImport();
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('User import returned RESULT_COMPLETED'));
  $migration = Migration::getInstance('WineProducer');
  $result = $migration
    ->processImport();
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('Producer node import returned RESULT_COMPLETED'));
  $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();
  $producer_nodes = array();
  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();
  $wine_nodes = array();
  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',
    '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'];
  $user_migration = MigrationBase::getInstance('WineUser');
  $mapped_uid = $user_migration
    ->getMap()
    ->lookupDestinationID(array(
    $producer_row->accountid,
  ));
  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, 'REVIEW: ' . drupal_strtoupper($wine_row->body), t('body properly migrated'));
  $this
    ->assertEqual($wine_node->teaser, $wine_row->excerpt, t('teaser properly migrated'));

  // Taxonomy terms - single and multiple
  $variety_migration = MigrationBase::getInstance('WineVariety');
  $mapped_tid = $variety_migration
    ->getMap()
    ->lookupDestinationID(array(
    $wine_row->variety,
  ));
  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,
    )));
  }
  $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,
    ));
    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',
    '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,
      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,
      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();
  $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,
    )));
  }
  $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, 'REVIEW: NOT SO MUCH BERRY CHARACTER', t('Body updated'))) {
    $this
      ->error(t('Actual body !body', array(
      '!body' => $body,
    )));
  }

  // Test rollback
  $result = $migration
    ->processRollback(array(
    'force' => TRUE,
  ));
  $this
    ->assertEqual($result, Migration::RESULT_COMPLETED, t('Wine node rollback returned RESULT_COMPLETED'));
  $count = db_select('node', 'n')
    ->fields('n', array(
    'nid',
  ))
    ->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(
    'limit' => array(
      'value' => 2,
      'unit' => 'items',
    ),
  ));
  $query = db_update('migrate_example_wine')
    ->fields(array(
    'body' => 'Very berry',
    // Timestamp 1286008921
    'last_changed' => strtotime('2011-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, 'REVIEW: VERY BERRY', t('Body updated'))) {
    $this
      ->error(t('Actual body !body', array(
      '!body' => $body,
    )));
  }

  // Test itemlimit (joined map table)
  $result = $migration
    ->processRollback(array(
    'force' => TRUE,
  ));
  $migration
    ->getSource()
    ->setMapJoinable(TRUE);
  $result = $migration
    ->processImport(array(
    'limit' => array(
      'value' => 1,
      'unit' => 'item',
    ),
  ));
  $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();
  if (!$this
    ->assertEqual(count($titles), 1, t('One node imported'))) {
    $this
      ->error(t('Actual nodes imported: !count', array(
      '!count' => count($titles),
    )));
  }

  // Test idlist (joined map table)
  $result = $migration
    ->processRollback(array(
    'force' => TRUE,
  ));
  $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(array(
    'force' => TRUE,
  ));
  $migration
    ->getSource()
    ->setMapJoinable(FALSE);
  $result = $migration
    ->processImport(array(
    'limit' => array(
      'value' => 1,
      'unit' => 'item',
    ),
  ));
  $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();
  if (!$this
    ->assertEqual(count($titles), 1, t('One node imported'))) {
    $this
      ->error(t('Actual nodes imported: !count', array(
      '!count' => count($titles),
    )));
  }

  // Test idlist (unjoined map table)
  $result = $migration
    ->processRollback(array(
    'force' => TRUE,
  ));
  $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 integer highwater marks (http://drupal.org/node/1161612)
  $result = $migration
    ->processRollback(array(
    'force' => TRUE,
  ));
  db_update('migrate_example_wine')
    ->fields(array(
    'last_changed' => 100000000,
  ))
    ->condition('wineid', 1)
    ->execute();
  db_update('migrate_example_wine')
    ->fields(array(
    'last_changed' => 200000000,
  ))
    ->condition('wineid', 2)
    ->execute();
  db_update('migrate_example_wine')
    ->fields(array(
    'last_changed' => 300000000,
  ))
    ->condition('wineid', 3)
    ->execute();
  db_update('migrate_example_wine')
    ->fields(array(
    'last_changed' => 400000000,
  ))
    ->condition('wineid', 4)
    ->execute();
  $result = $migration
    ->processImport();

  // Just a quick check to make sure we got four nodes with the right changed values
  $count = db_result(db_query("SELECT COUNT(nid)\n                       FROM {node} n\n                       INNER JOIN {migrate_map_winewine} map ON n.nid=map.destid1\n                       WHERE n.changed = map.sourceid1*100000000"));
  $this
    ->assertEqual($count, 4, t('Four nodes with updated changed values imported'));

  // We mark two nodes with higher updated values. If these end up being treated
  // as strings in saveHighwater(), the saved highwater mark will end up as
  // 500000000 instead of 1000000000.
  db_update('migrate_example_wine')
    ->fields(array(
    'last_changed' => 1000000000,
  ))
    ->condition('wineid', 2)
    ->execute();
  db_update('migrate_example_wine')
    ->fields(array(
    'last_changed' => 500000000,
  ))
    ->condition('wineid', 3)
    ->execute();
  $result = $migration
    ->processImport();
  $newHighwater = db_select('migrate_status', 'ms')
    ->fields('ms', array(
    'highwater',
  ))
    ->condition('machine_name', 'WineWine')
    ->execute()
    ->fetchField();
  if (!$this
    ->assertEqual($newHighwater, 1000000000, t('Correct highwater mark set'))) {
    $this
      ->error(t('Unexpected highwater mark !highwater', array(
      '!highwater' => $newHighwater,
    )));
  }
}