You are here

public function EntityReferenceFormatterTest::testEntityReferenceRecursiveProtectionWithManyRenderedEntities in Drupal 8

Same name and namespace in other branches
  1. 9 core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php \Drupal\Tests\field\Kernel\EntityReference\EntityReferenceFormatterTest::testEntityReferenceRecursiveProtectionWithManyRenderedEntities()

Renders the same entity referenced from different places.

File

core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php, line 303

Class

EntityReferenceFormatterTest
Tests the formatters functionality.

Namespace

Drupal\Tests\field\Kernel\EntityReference

Code

public function testEntityReferenceRecursiveProtectionWithManyRenderedEntities() {
  $formatter = 'entity_reference_entity_view';
  $view_builder = $this->entityTypeManager
    ->getViewBuilder($this->entityType);

  // Set the default view mode to use the 'entity_reference_entity_view'
  // formatter.
  \Drupal::service('entity_display.repository')
    ->getViewDisplay($this->entityType, $this->bundle)
    ->setComponent($this->fieldName, [
    'type' => $formatter,
  ])
    ->save();
  $storage = $this->entityTypeManager
    ->getStorage($this->entityType);

  /** @var \Drupal\Core\Entity\ContentEntityInterface $referenced_entity */
  $referenced_entity = $storage
    ->create([
    'name' => $this
      ->randomMachineName(),
  ]);
  $range = range(0, 30);
  $referencing_entities = array_map(function () use ($storage, $referenced_entity) {
    $referencing_entity = $storage
      ->create([
      'name' => $this
        ->randomMachineName(),
      $this->fieldName => $referenced_entity,
    ]);
    $referencing_entity
      ->save();
    return $referencing_entity;
  }, $range);
  $build = $view_builder
    ->viewMultiple($referencing_entities, 'default');
  $output = $this
    ->render($build);

  // The title of entity_test entities is printed twice by default, so we have
  // to multiply the formatter's recursive rendering protection limit by 2.
  // Additionally, we have to take into account 2 additional occurrences of
  // the entity title because we're rendering the full entity, not just the
  // reference field.
  $expected_occurrences = 30 * 2 + 2;
  $actual_occurrences = substr_count($output, $referenced_entity
    ->get('name')->value);
  $this
    ->assertEquals($expected_occurrences, $actual_occurrences);
}