function EntityReferenceFormatterTest::testEntityFormatterRecursiveRendering
Same name in other branches
- 9 core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php \Drupal\Tests\field\Kernel\EntityReference\EntityReferenceFormatterTest::testEntityFormatterRecursiveRendering()
- 8.9.x core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php \Drupal\Tests\field\Kernel\EntityReference\EntityReferenceFormatterTest::testEntityFormatterRecursiveRendering()
- 10 core/modules/field/tests/src/Kernel/EntityReference/EntityReferenceFormatterTest.php \Drupal\Tests\field\Kernel\EntityReference\EntityReferenceFormatterTest::testEntityFormatterRecursiveRendering()
Tests the recursive rendering protection of the entity formatter.
File
-
core/
modules/ field/ tests/ src/ Kernel/ EntityReference/ EntityReferenceFormatterTest.php, line 240
Class
- EntityReferenceFormatterTest
- Tests the formatters functionality.
Namespace
Drupal\Tests\field\Kernel\EntityReferenceCode
public function testEntityFormatterRecursiveRendering() : void {
/** @var \Drupal\Core\Render\RendererInterface $renderer */
$renderer = $this->container
->get('renderer');
$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 = \Drupal::entityTypeManager()->getStorage($this->entityType);
$referencing_entity_1 = $storage->create([
'name' => $this->randomMachineName(),
]);
$referencing_entity_1->save();
// Create a self-reference.
$referencing_entity_1->{$this->fieldName}->entity = $referencing_entity_1;
$referencing_entity_1->save();
// Check that the recursive rendering stops after it reaches the specified
// limit.
$build = $view_builder->view($referencing_entity_1, 'default');
$output = (string) $renderer->renderRoot($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 = EntityReferenceEntityFormatter::RECURSIVE_RENDER_LIMIT * 2 + 2;
$actual_occurrences = substr_count($output, $referencing_entity_1->label());
$this->assertEquals($expected_occurrences, $actual_occurrences);
// Repeat the process with another entity in order to check that the
// 'recursive_render_id' counter is generated properly.
$referencing_entity_2 = $storage->create([
'name' => $this->randomMachineName(),
]);
$referencing_entity_2->save();
$referencing_entity_2->{$this->fieldName}->entity = $referencing_entity_2;
$referencing_entity_2->save();
$build = $view_builder->view($referencing_entity_2, 'default');
$output = (string) $renderer->renderRoot($build);
$actual_occurrences = substr_count($output, $referencing_entity_2->label());
$this->assertEquals($expected_occurrences, $actual_occurrences);
// Now render both entities at the same time and check again.
$build = $view_builder->viewMultiple([
$referencing_entity_1,
$referencing_entity_2,
], 'default');
$output = (string) $renderer->renderRoot($build);
$actual_occurrences = substr_count($output, $referencing_entity_1->label());
$this->assertEquals($expected_occurrences, $actual_occurrences);
$actual_occurrences = substr_count($output, $referencing_entity_2->label());
$this->assertEquals($expected_occurrences, $actual_occurrences);
}
Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.