function FieldAttachOtherTest::testEntityDisplayBuild

Same name and namespace in other branches
  1. 9 core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php \Drupal\Tests\field\Kernel\FieldAttachOtherTest::testEntityDisplayBuild()
  2. 8.9.x core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php \Drupal\Tests\field\Kernel\FieldAttachOtherTest::testEntityDisplayBuild()
  3. 11.x core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php \Drupal\Tests\field\Kernel\FieldAttachOtherTest::testEntityDisplayBuild()

Tests rendering fields with EntityDisplay build().

File

core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php, line 30

Class

FieldAttachOtherTest
Tests other Field API functions.

Namespace

Drupal\Tests\field\Kernel

Code

public function testEntityDisplayBuild() : void {
  $this->createFieldWithStorage('_2');
  $entity_type = 'entity_test';
  $entity_init = $this->container
    ->get('entity_type.manager')
    ->getStorage($entity_type)
    ->create();
  // Populate values to be displayed.
  $values = $this->_generateTestFieldValues($this->fieldTestData->field_storage
    ->getCardinality());
  $entity_init->{$this->fieldTestData->field_name}
    ->setValue($values);
  $values_2 = $this->_generateTestFieldValues($this->fieldTestData->field_storage_2
    ->getCardinality());
  $entity_init->{$this->fieldTestData->field_name_2}
    ->setValue($values_2);
  // Simple formatter, label displayed.
  $entity = clone $entity_init;
  $display = \Drupal::service('entity_display.repository')->getViewDisplay($entity_type, $entity->bundle(), 'full');
  $formatter_setting = $this->randomMachineName();
  $display_options = [
    'label' => 'above',
    'type' => 'field_test_default',
    'settings' => [
      'test_formatter_setting' => $formatter_setting,
    ],
  ];
  $display->setComponent($this->fieldTestData->field_name, $display_options);
  $formatter_setting_2 = $this->randomMachineName();
  $display_options_2 = [
    'label' => 'above',
    'type' => 'field_test_default',
    'settings' => [
      'test_formatter_setting' => $formatter_setting_2,
    ],
  ];
  $display->setComponent($this->fieldTestData->field_name_2, $display_options_2);
  // View all fields.
  $content = $display->build($entity);
  $this->render($content);
  $this->assertRaw($this->fieldTestData->field
    ->getLabel(), "First field's label is displayed.");
  foreach ($values as $delta => $value) {
    $this->assertRaw("{$formatter_setting}|{$value['value']}", "Value {$delta} is displayed, formatter settings are applied.");
  }
  $this->assertRaw($this->fieldTestData->field_2
    ->getLabel(), "Second field's label is displayed.");
  foreach ($values_2 as $delta => $value) {
    $this->assertRaw("{$formatter_setting_2}|{$value['value']}", "Value {$delta} is displayed, formatter settings are applied.");
  }
  // Label hidden.
  $entity = clone $entity_init;
  $display_options['label'] = 'hidden';
  $display->setComponent($this->fieldTestData->field_name, $display_options);
  $content = $display->build($entity);
  $this->render($content);
  $this->assertNoRaw($this->fieldTestData->field
    ->getLabel(), "Hidden label: label is not displayed.");
  // Field hidden.
  $entity = clone $entity_init;
  $display->removeComponent($this->fieldTestData->field_name);
  $content = $display->build($entity);
  $this->render($content);
  $this->assertNoRaw($this->fieldTestData->field
    ->getLabel(), "Hidden field: label is not displayed.");
  foreach ($values as $delta => $value) {
    $this->assertNoRaw("{$formatter_setting}|{$value['value']}", "Hidden field: value {$delta} is not displayed.");
  }
  // Multiple formatter.
  $entity = clone $entity_init;
  $formatter_setting = $this->randomMachineName();
  $display->setComponent($this->fieldTestData->field_name, [
    'label' => 'above',
    'type' => 'field_test_multiple',
    'settings' => [
      'test_formatter_setting_multiple' => $formatter_setting,
    ],
  ]);
  $content = $display->build($entity);
  $this->render($content);
  $expected_output = $formatter_setting;
  foreach ($values as $delta => $value) {
    $expected_output .= "|{$delta}:{$value['value']}";
  }
  $this->assertRaw($expected_output, "Multiple formatter: all values are displayed, formatter settings are applied.");
  // Test a formatter that uses hook_field_formatter_prepare_view().
  $entity = clone $entity_init;
  $formatter_setting = $this->randomMachineName();
  $display->setComponent($this->fieldTestData->field_name, [
    'label' => 'above',
    'type' => 'field_test_with_prepare_view',
    'settings' => [
      'test_formatter_setting_additional' => $formatter_setting,
    ],
  ]);
  $content = $display->build($entity);
  $this->render($content);
  foreach ($values as $delta => $value) {
    $expected = $formatter_setting . '|' . $value['value'] . '|' . ($value['value'] + 1);
    $this->assertRaw($expected, "Value {$delta} is displayed, formatter settings are applied.");
  }
  // @todo Check display order with several fields.
}

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