You are here

public function MigrateUserTest::testUser in Drupal 9

Same name in this branch
  1. 9 core/modules/user/tests/src/Kernel/Migrate/d6/MigrateUserTest.php \Drupal\Tests\user\Kernel\Migrate\d6\MigrateUserTest::testUser()
  2. 9 core/modules/user/tests/src/Kernel/Migrate/d7/MigrateUserTest.php \Drupal\Tests\user\Kernel\Migrate\d7\MigrateUserTest::testUser()
Same name and namespace in other branches
  1. 8 core/modules/user/tests/src/Kernel/Migrate/d6/MigrateUserTest.php \Drupal\Tests\user\Kernel\Migrate\d6\MigrateUserTest::testUser()

Tests the Drupal6 user to Drupal 8 migration.

File

core/modules/user/tests/src/Kernel/Migrate/d6/MigrateUserTest.php, line 75

Class

MigrateUserTest
Users migration.

Namespace

Drupal\Tests\user\Kernel\Migrate\d6

Code

public function testUser() {
  $users = Database::getConnection('default', 'migrate')
    ->select('users', 'u')
    ->fields('u')
    ->condition('uid', 0, '>')
    ->execute()
    ->fetchAll();
  foreach ($users as $source) {

    // Get roles directly from the source.
    $rids = Database::getConnection('default', 'migrate')
      ->select('users_roles', 'ur')
      ->fields('ur', [
      'rid',
    ])
      ->condition('ur.uid', $source->uid)
      ->execute()
      ->fetchCol();
    $roles = [
      RoleInterface::AUTHENTICATED_ID,
    ];
    $id_map = $this
      ->getMigration('d6_user_role')
      ->getIdMap();
    foreach ($rids as $rid) {
      $role = $id_map
        ->lookupDestinationIds([
        $rid,
      ])[0];
      $roles[] = reset($role);
    }

    /** @var \Drupal\user\UserInterface $user */
    $user = User::load($source->uid);
    $this
      ->assertSame($source->uid, $user
      ->id());
    $this
      ->assertSame($source->name, $user
      ->label());
    $this
      ->assertSame($source->mail, $user
      ->getEmail());
    $this
      ->assertSame($source->created, $user
      ->getCreatedTime());
    $this
      ->assertSame($source->access, $user
      ->getLastAccessedTime());
    $this
      ->assertSame($source->login, $user
      ->getLastLoginTime());
    $is_blocked = $source->status == 0;
    $this
      ->assertSame($is_blocked, $user
      ->isBlocked());
    $expected_timezone_name = $source->timezone_name ?: $this
      ->config('system.date')
      ->get('timezone.default');
    $this
      ->assertSame($expected_timezone_name, $user
      ->getTimeZone());
    $this
      ->assertSame($source->init, $user
      ->getInitialEmail());
    $this
      ->assertSame($roles, $user
      ->getRoles());

    // Ensure the user's langcode, preferred_langcode and
    // preferred_admin_langcode are valid.
    // $user->getPreferredLangcode() might fallback to default language if the
    // user preferred language is not configured on the site. We just want to
    // test if the value was imported correctly.
    $language_manager = $this->container
      ->get('language_manager');
    $default_langcode = $language_manager
      ->getDefaultLanguage()
      ->getId();
    if (empty($source->language)) {
      $this
        ->assertSame('en', $user->langcode->value);
      $this
        ->assertSame($default_langcode, $user->preferred_langcode->value);
      $this
        ->assertSame($default_langcode, $user->preferred_admin_langcode->value);
    }
    elseif ($language_manager
      ->getLanguage($source->language) === NULL) {
      $this
        ->assertSame($default_langcode, $user->langcode->value);
      $this
        ->assertSame($default_langcode, $user->preferred_langcode->value);
      $this
        ->assertSame($default_langcode, $user->preferred_admin_langcode->value);
    }
    else {
      $this
        ->assertSame($source->language, $user->langcode->value);
      $this
        ->assertSame($source->language, $user->preferred_langcode->value);
      $this
        ->assertSame($source->language, $user->preferred_admin_langcode->value);
    }

    // We have one empty picture in the data so don't try load that.
    if (!empty($source->picture)) {

      // Test the user picture.
      $file = File::load($user->user_picture->target_id);
      $this
        ->assertSame(basename($source->picture), $file
        ->getFilename());
    }
    else {

      // Ensure the user does not have a picture.
      $this
        ->assertEmpty($user->user_picture->target_id, sprintf('User %s does not have a picture', $user
        ->id()));
    }

    // Use the API to check if the password has been salted and re-hashed to
    // conform to Drupal >= 7 for non-admin users.
    if ($user
      ->id() != 1) {
      $this
        ->assertTrue(\Drupal::service('password')
        ->check($source->pass_plain, $user
        ->getPassword()));
    }
  }

  // Rollback the migration and make sure everything is deleted but uid 1.
  (new MigrateExecutable($this->migration, $this))
    ->rollback();
  $users = Database::getConnection('default', 'migrate')
    ->select('users', 'u')
    ->fields('u', [
    'uid',
  ])
    ->condition('uid', 0, '>')
    ->execute()
    ->fetchCol();
  foreach ($users as $uid) {
    $account = User::load($uid);
    if ($uid == 1) {
      $this
        ->assertNotNull($account, 'User 1 was preserved after rollback');
    }
    else {
      $this
        ->assertNull($account);
    }
  }
}