'User migration', 'description' => 'Test migration of user data', 'group' => 'Migrate', ); } function setUp() { parent::setUp('migrate', 'migrate_example'); // To test timestamps date_default_timezone_set('US/Mountain'); } function testUserImport() { $migration = Migration::getInstance('WineFileCopy'); $result = $migration->processImport(); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('File import returned RESULT_COMPLETED')); $migration = Migration::getInstance('WineRole'); $result = $migration->processImport(); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('Role import returned RESULT_COMPLETED')); // Confirm both roles were successfully imported $result = db_select('role', 'r') ->fields('r', array('rid', 'name')) ->condition('name', array('Taster', 'Vintner'), 'IN') ->execute(); $roles = array(); foreach ($result as $row) { $roles[$row->name] = $row->rid; } $this->assertEqual(count($roles), 2, t('Both roles imported')); $migration = Migration::getInstance('WineUser'); $result = $migration->processImport(); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('User import returned RESULT_COMPLETED')); $result = db_select('migrate_example_wine_account', 'mea') ->fields('mea', array('accountid', 'status', 'posted', 'name', 'sex', 'password', 'mail', 'last_access', 'last_login', 'sig', 'original_mail')) ->execute(); $uids = db_select('users', 'u') ->fields('u', array('uid')) ->execute() ->fetchCol(); // Index by name $users = array(); foreach ($uids as $uid) { // Skip anon/admin users if ($uid > 1) { $account = user_load($uid); $users[$account->name] = $account; } } $rows = array(); foreach ($result as $row) { $rows[$row->name] = $row; } $this->assertEqual(count($users), count($rows), t('Counts of users and input rows match')); // Test each base user field $this->assert(isset($users['darren']) && isset($rows['darren']), t("Username 'darren' migrated correctly")); $this->assertEqual($users['darren']->mail, $rows['darren']->mail, t('Email addresses match')); $this->assertEqual($users['darren']->status, $rows['darren']->status, t('Statuses match')); $this->assertNotNull($users['darren']->roles[2], t('Authenticated role')); $this->assertNotNull($users['darren']->roles[$roles['Taster']], t('Taster role')); $this->assertFalse(isset($users['darren']->roles[$roles['Vintner']]), t('No Vintner role')); $this->assertEqual($users['darren']->created, strtotime($rows['darren']->posted), t('Created times match')); $this->assertEqual($users['darren']->access, strtotime($rows['darren']->last_access), t('Access times match')); $this->assertEqual($users['darren']->login, strtotime($rows['darren']->last_login), t('Login times match')); $this->assertTrue(user_check_password($rows['darren']->password, $users['darren']), t('Passwords match')); $this->assertEqual($users['darren']->init, $rows['darren']->original_mail, t('Init mails match')); $this->assertEqual($users['darren']->signature, $rows['darren']->sig, t('Signatures match')); $this->assertEqual($users['darren']->signature_format, $migration->basicFormat->format, t('Signature formats match')); $this->assertEqual($users['darren']->field_migrate_example_gender[LANGUAGE_NONE][0]['value'], 0, t('Male gender migrated')); $this->assertEqual($users['emily']->field_migrate_example_gender[LANGUAGE_NONE][0]['value'], 1, t('Female gender migrated')); $this->assert(!isset($users['fonzie']->field_migrate_example_gender[LANGUAGE_NONE][0]['value']), t('Missing gender left unmigrated')); $this->assert(is_object($users['fonzie']->picture) && $users['fonzie']->picture->filename == 'association-individual.png', t('Picture migrated')); $this->assertNotNull($users['fonzie']->roles[$roles['Taster']], t('Taster role')); $this->assertNotNull($users['fonzie']->roles[$roles['Vintner']], t('Vintner role')); // TODO: Theme, timezone, language // Test updates // Capture original users $query = new EntityFieldQuery; $result = $query ->entityCondition('entity_type', 'user') ->propertyCondition('uid', 1, '>') ->execute(); $uids = array_keys($result['user']); $original_users = user_load_multiple($uids, array(), TRUE); $update_migration = Migration::getInstance('WineUserUpdates'); $result = $update_migration->processImport(); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('Wine user updates import returned RESULT_COMPLETED')); $final_users = user_load_multiple($uids, array(), TRUE); foreach ($original_users as $uid => $original_user) { foreach ($original_user as $field => $value) { if ($field == 'field_migrate_example_gender') { if ($value == $final_users[$uid]->$field) { $this->error(t('For user !name, field !field should have changed but did not, value=!value', array('!name' => $final_users[$uid]->name, '!field' => $field, '!value' => print_r($value, TRUE)))); } } else { if ($value != $final_users[$uid]->$field) { // Core bug http://drupal.org/node/935592 causes picture mismatches, ignore until it's fixed if ($field != 'picture') { $this->error(t('For user !name, field !field mismatch: original !value1, result !value2', array('!name' => $final_users[$uid]->name, '!field' => $field, '!value1' => print_r($value, TRUE), '!value2' => print_r($final_users[$uid]->$field, TRUE)))); } } } } } // Test rollback $result = $migration->processRollback(array('force' => TRUE)); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('User rollback returned RESULT_COMPLETED')); $count = db_select('users', 'u') ->fields('u', array('uid')) ->countQuery() ->execute() ->fetchField(); // 2 users left - anon and admin $this->assertEqual($count, 2, t('All imported users deleted')); $count = db_select('migrate_map_wineuser', 'map') ->fields('map', array('sourceid1')) ->countQuery() ->execute() ->fetchField(); $this->assertEqual($count, 0, t('Map cleared')); $count = db_select('migrate_message_wineuser', 'msg') ->fields('msg', array('sourceid1')) ->countQuery() ->execute() ->fetchField(); $this->assertEqual($count, 0, t('Messages cleared')); // Test deduping // First, do the original import $migration = Migration::getInstance('BeerUser'); $result = $migration->processImport(); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('User import returned RESULT_COMPLETED')); $accounts = db_select('users', 'u') ->fields('u', array('mail', 'name')) ->execute() ->fetchAllKeyed(); if (!$this->assertEqual($accounts['alice@example.com'], 'alice', t('alice found'))) { $this->error(t('Expected alice, found !name', array('!name' => $accounts['alice@example.com']))); } if (!$this->assertEqual($accounts['alice2@example.com'], 'alice_2', t('alice_2 found'))) { $this->error(t('Expected alice_2, found !name', array('!name' => $accounts['alice2@example.com']))); } // Then, update in place and make sure the usernames did not change $migration->prepareUpdate(); $result = $migration->processImport(); $this->assertEqual($result, Migration::RESULT_COMPLETED, t('User import returned RESULT_COMPLETED')); $accounts = db_select('users', 'u') ->fields('u', array('mail', 'name')) ->execute() ->fetchAllKeyed(); if (!$this->assertEqual($accounts['alice@example.com'], 'alice', t('alice found'))) { $this->error(t('Expected alice, found !name', array('!name' => $accounts['alice@example.com']))); } if (!$this->assertEqual($accounts['alice2@example.com'], 'alice_2', t('alice_2 found'))) { $this->error(t('Expected alice_2, found !name', array('!name' => $accounts['alice2@example.com']))); } } }