You are here

public function TokenUserTest::testUserTokens in Token 8

Tests the user releated tokens.

File

tests/src/Functional/TokenUserTest.php, line 51

Class

TokenUserTest
Tests user tokens.

Namespace

Drupal\Tests\token\Functional

Code

public function testUserTokens() {

  // Enable user pictures.
  \Drupal::state()
    ->set('user_pictures', 1);
  \Drupal::state()
    ->set('user_picture_file_size', '');

  // Set up the pictures directory.
  $picture_path = 'public://' . \Drupal::state()
    ->get('user_picture_path', 'pictures');
  if (!\Drupal::service('file_system')
    ->prepareDirectory($picture_path, FileSystemInterface::CREATE_DIRECTORY)) {
    $this
      ->fail('Could not create directory ' . $picture_path . '.');
  }

  // Add a user picture to the account.
  $image = current($this
    ->getTestFiles('image'));
  $edit = [
    'files[user_picture_0]' => \Drupal::service('file_system')
      ->realpath($image->uri),
  ];
  $this
    ->drupalPostForm('user/' . $this->account
    ->id() . '/edit', $edit, 'Save');
  $storage = \Drupal::entityTypeManager()
    ->getStorage('user');

  // Load actual user data from database.
  $storage
    ->resetCache();
  $this->account = $storage
    ->load($this->account
    ->id());
  $this
    ->assertNotEmpty($this->account->user_picture->target_id, 'User picture uploaded.');
  $picture = [
    '#theme' => 'user_picture',
    '#account' => $this->account,
  ];

  /** @var \Drupal\Core\Render\RendererInterface $renderer */
  $renderer = \Drupal::service('renderer');
  $user_tokens = [
    'picture' => $renderer
      ->renderPlain($picture),
    'picture:fid' => $this->account->user_picture->target_id,
    'picture:size-raw' => 125,
    'ip-address' => NULL,
    'roles' => implode(', ', $this->account
      ->getRoles()),
  ];
  $this
    ->assertTokens('user', [
    'user' => $this->account,
  ], $user_tokens);

  // Remove the simpletest-created user role.
  $roles = $this->account
    ->getRoles();
  $this->account
    ->removeRole(end($roles));
  $this->account
    ->save();

  // Remove the user picture field and reload the user.
  FieldStorageConfig::loadByName('user', 'user_picture')
    ->delete();
  $storage
    ->resetCache();
  $this->account = $storage
    ->load($this->account
    ->id());
  $user_tokens = [
    'picture' => NULL,
    'picture:fid' => NULL,
    'ip-address' => NULL,
    'roles' => 'authenticated',
    'roles:keys' => AccountInterface::AUTHENTICATED_ROLE,
  ];
  $this
    ->assertTokens('user', [
    'user' => $this->account,
  ], $user_tokens);

  // The ip address token should work for the current user token type.
  $tokens = [
    'ip-address' => \Drupal::request()
      ->getClientIp(),
  ];
  $this
    ->assertTokens('current-user', [], $tokens);
  $anonymous = new AnonymousUserSession();
  $tokens = [
    'roles' => 'anonymous',
    'roles:keys' => AccountInterface::ANONYMOUS_ROLE,
  ];
  $this
    ->assertTokens('user', [
    'user' => $anonymous,
  ], $tokens);
}