You are here

public function FieldEntityOperationsTest::testEntityOperations in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/views/tests/src/Functional/Handler/FieldEntityOperationsTest.php \Drupal\Tests\views\Functional\Handler\FieldEntityOperationsTest::testEntityOperations()

Tests entity operations field.

File

core/modules/views/tests/src/Functional/Handler/FieldEntityOperationsTest.php, line 46

Class

FieldEntityOperationsTest
Tests the core Drupal\views\Plugin\views\field\EntityOperations handler.

Namespace

Drupal\Tests\views\Functional\Handler

Code

public function testEntityOperations() {

  // Add languages and refresh the container so the entity type manager will
  // have fresh data.
  ConfigurableLanguage::createFromLangcode('hu')
    ->save();
  ConfigurableLanguage::createFromLangcode('es')
    ->save();
  $this
    ->rebuildContainer();

  // Create some test entities. Every other entity is Hungarian while all
  // have a Spanish translation.
  $entities = [];
  for ($i = 0; $i < 5; $i++) {
    $entity = Node::create([
      'title' => $this
        ->randomString(),
      'type' => 'article',
      'langcode' => $i % 2 === 0 ? 'hu' : 'en',
    ]);
    $entity
      ->save();
    $translation = $entity
      ->addTranslation('es');
    $translation
      ->set('title', $entity
      ->getTitle() . ' in Spanish');
    $translation
      ->save();
    $entities[$i] = $entity;
  }
  $admin_user = $this
    ->drupalCreateUser([
    'access administration pages',
    'administer nodes',
    'bypass node access',
    'administer views',
  ]);
  $this
    ->drupalLogin($admin_user);
  $this
    ->drupalGet('test-entity-operations');

  /** @var \Drupal\entity_test\Entity\EntityTest $entity */
  foreach ($entities as $entity) {

    /** @var \Drupal\Core\Language\LanguageInterface $language */
    foreach ($entity
      ->getTranslationLanguages() as $language) {
      $entity = $entity
        ->getTranslation($language
        ->getId());
      $operations = \Drupal::service('entity_type.manager')
        ->getListBuilder('node')
        ->getOperations($entity);
      $this
        ->assertNotEmpty($operations);
      foreach ($operations as $operation) {
        $expected_destination = Url::fromUri('internal:/test-entity-operations')
          ->toString();

        // Update destination property of the URL as generating it in the
        // test would by default point to the frontpage.
        $operation['url']
          ->setOption('query', [
          'destination' => $expected_destination,
        ]);
        $this
          ->assertSession()
          ->elementsCount('xpath', "//ul[contains(@class, dropbutton)]/li/a[@href='{$operation['url']->toString()}' and text()='{$operation['title']}']", 1);

        // Entities which were created in Hungarian should link to the Hungarian
        // edit form, others to the English one (which has no path prefix here).
        $base_path = \Drupal::request()
          ->getBasePath();
        $parts = explode('/', str_replace($base_path, '', $operation['url']
          ->toString()));
        $expected_prefix = $language
          ->getId() != 'en' ? $language
          ->getId() : 'node';
        $this
          ->assertEquals($expected_prefix, $parts[1], 'Entity operation links to the correct language for the entity.');
      }
    }
  }

  // Test that we can't enable click sorting on the operation field.
  $this
    ->drupalGet('admin/structure/views/nojs/display/test_entity_operations/page_2/style_options');
  $this
    ->assertSession()
    ->fieldExists('style_options[info][title][sortable]');
  $this
    ->assertSession()
    ->fieldNotExists('style_options[info][operations][sortable]');
}