You are here

public function ContentEntityCloneTest::testFieldEntityReferenceAfterClone in Drupal 8

Same name and namespace in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php \Drupal\KernelTests\Core\Entity\ContentEntityCloneTest::testFieldEntityReferenceAfterClone()
  2. 10 core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php \Drupal\KernelTests\Core\Entity\ContentEntityCloneTest::testFieldEntityReferenceAfterClone()

Tests if entity references on fields are still correct after cloning.

File

core/tests/Drupal/KernelTests/Core/Entity/ContentEntityCloneTest.php, line 38

Class

ContentEntityCloneTest
Tests proper cloning of content entities.

Namespace

Drupal\KernelTests\Core\Entity

Code

public function testFieldEntityReferenceAfterClone() {
  $user = $this
    ->createUser();

  // Create a test entity.
  $entity = EntityTestMul::create([
    'name' => $this
      ->randomString(),
    'user_id' => $user
      ->id(),
    'language' => 'en',
  ]);
  $translation = $entity
    ->addTranslation('de');

  // Initialize the fields on the translation objects in order to check that
  // they are properly cloned and have a reference to the cloned entity
  // object and not to the original one.
  $entity
    ->getFields();
  $translation
    ->getFields();
  $clone = clone $translation;
  $this
    ->assertEqual($entity
    ->getTranslationLanguages(), $clone
    ->getTranslationLanguages(), 'The entity and its clone have the same translation languages.');
  $default_langcode = $entity
    ->getUntranslated()
    ->language()
    ->getId();
  foreach (array_keys($clone
    ->getTranslationLanguages()) as $langcode) {
    $translation = $clone
      ->getTranslation($langcode);
    foreach ($translation
      ->getFields() as $field_name => $field) {
      if ($field
        ->getFieldDefinition()
        ->isTranslatable()) {
        $args = [
          '%field_name' => $field_name,
          '%langcode' => $langcode,
        ];
        $this
          ->assertEqual($langcode, $field
          ->getEntity()
          ->language()
          ->getId(), new FormattableMarkup('Translatable field %field_name on translation %langcode has correct entity reference in translation %langcode after cloning.', $args));
        $this
          ->assertSame($translation, $field
          ->getEntity(), new FormattableMarkup('Translatable field %field_name on translation %langcode has correct reference to the cloned entity object.', $args));
      }
      else {
        $args = [
          '%field_name' => $field_name,
          '%langcode' => $langcode,
          '%default_langcode' => $default_langcode,
        ];
        $this
          ->assertEqual($default_langcode, $field
          ->getEntity()
          ->language()
          ->getId(), new FormattableMarkup('Non translatable field %field_name on translation %langcode has correct entity reference in the default translation %default_langcode after cloning.', $args));
        $this
          ->assertSame($translation
          ->getUntranslated(), $field
          ->getEntity(), new FormattableMarkup('Non translatable field %field_name on translation %langcode has correct reference to the cloned entity object in the default translation %default_langcode.', $args));
      }
    }
  }
}