function FieldEntityOperationsTest::testEntityOperations

Same name and namespace in other branches
  1. 9 core/modules/views/tests/src/Functional/Handler/FieldEntityOperationsTest.php \Drupal\Tests\views\Functional\Handler\FieldEntityOperationsTest::testEntityOperations()
  2. 8.9.x core/modules/views/tests/src/Functional/Handler/FieldEntityOperationsTest.php \Drupal\Tests\views\Functional\Handler\FieldEntityOperationsTest::testEntityOperations()
  3. 11.x 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 49

Class

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

Namespace

Drupal\Tests\views\Functional\Handler

Code

public function testEntityOperations() : void {
  // 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]');
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.