You are here

public function EntityReferenceFieldTest::testTargetEntityNoLoad in Drupal 9

Same name and namespace in other branches
  1. 8 core/tests/Drupal/KernelTests/Core/Entity/EntityReferenceFieldTest.php \Drupal\KernelTests\Core\Entity\EntityReferenceFieldTest::testTargetEntityNoLoad()

Tests that the target entity is not unnecessarily loaded.

File

core/tests/Drupal/KernelTests/Core/Entity/EntityReferenceFieldTest.php, line 370

Class

EntityReferenceFieldTest
Tests for the entity reference field.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testTargetEntityNoLoad() {

  // Setup a test entity type with an entity reference field to itself. We use
  // a special storage class throwing exceptions when a load operation is
  // triggered to be able to detect them.
  $entity_type = clone $this->entityTypeManager
    ->getDefinition('entity_test_update');
  $entity_type
    ->setHandlerClass('storage', '\\Drupal\\entity_test\\EntityTestNoLoadStorage');
  $this->state
    ->set('entity_test_update.entity_type', $entity_type);
  $definitions = [
    'target_reference' => BaseFieldDefinition::create('entity_reference')
      ->setSetting('target_type', $entity_type
      ->id())
      ->setSetting('handler', 'default'),
  ];
  $this->state
    ->set('entity_test_update.additional_base_field_definitions', $definitions);
  $this->entityTypeManager
    ->clearCachedDefinitions();
  $this
    ->installEntitySchema($entity_type
    ->id());

  // Create the target entity.
  $storage = $this->entityTypeManager
    ->getStorage($entity_type
    ->id());
  $target_id = $this
    ->generateRandomEntityId();
  $target = $storage
    ->create([
    'id' => $target_id,
    'name' => $this
      ->randomString(),
  ]);
  $target
    ->save();
  $this
    ->assertEquals($target_id, $target
    ->id(), 'The target entity has a random identifier.');

  // Check that populating the reference with an existing target id does not
  // trigger a load operation.
  $message = 'The target entity was not loaded.';
  try {
    $entity = $this->entityTypeManager
      ->getStorage($entity_type
      ->id())
      ->create([
      'name' => $this
        ->randomString(),
    ]);
    $entity->target_reference = $target_id;
  } catch (EntityStorageException $e) {
    $this
      ->fail($message);
  }

  // Check that the storage actually triggers the expected exception when
  // trying to load the target entity.
  $message = 'An exception is thrown when trying to load the target entity';
  try {
    $storage
      ->load($target_id);
    $this
      ->fail($message);
  } catch (EntityStorageException $e) {

    // Expected exception; just continue testing.
  }
}