You are here

protected function ContentTranslationUITestBase::doTestBasicTranslation in Drupal 8

Same name in this branch
  1. 8 core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php \Drupal\content_translation\Tests\ContentTranslationUITestBase::doTestBasicTranslation()
  2. 8 core/modules/content_translation/tests/src/Functional/ContentTranslationUITestBase.php \Drupal\Tests\content_translation\Functional\ContentTranslationUITestBase::doTestBasicTranslation()

Tests the basic translation workflow.

1 call to ContentTranslationUITestBase::doTestBasicTranslation()
ContentTranslationUITestBase::testTranslationUI in core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
Tests the basic translation UI.

File

core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php, line 77

Class

ContentTranslationUITestBase
Tests the Content Translation UI.

Namespace

Drupal\content_translation\Tests

Code

protected function doTestBasicTranslation() {

  // Create a new test entity with original values in the default language.
  $default_langcode = $this->langcodes[0];
  $values[$default_langcode] = $this
    ->getNewEntityValues($default_langcode);

  // Create the entity with the editor as owner, so that afterwards a new
  // translation is created by the translator and the translation author is
  // tested.
  $this
    ->drupalLogin($this->editor);
  $this->entityId = $this
    ->createEntity($values[$default_langcode], $default_langcode);
  $this
    ->drupalLogin($this->translator);
  $storage = $this->container
    ->get('entity_type.manager')
    ->getStorage($this->entityTypeId);
  $storage
    ->resetCache([
    $this->entityId,
  ]);
  $entity = $storage
    ->load($this->entityId);
  $this
    ->assertTrue($entity, 'Entity found in the database.');
  $this
    ->drupalGet($entity
    ->toUrl());
  $this
    ->assertResponse(200, 'Entity URL is valid.');

  // Ensure that the content language cache context is not yet added to the
  // page.
  $this
    ->assertCacheContexts($this->defaultCacheContexts);
  $this
    ->drupalGet($entity
    ->toUrl('drupal:content-translation-overview'));
  $this
    ->assertNoText('Source language', 'Source language column correctly hidden.');
  $translation = $this
    ->getTranslation($entity, $default_langcode);
  foreach ($values[$default_langcode] as $property => $value) {
    $stored_value = $this
      ->getValue($translation, $property, $default_langcode);
    $value = is_array($value) ? $value[0]['value'] : $value;
    $message = new FormattableMarkup('@property correctly stored in the default language.', [
      '@property' => $property,
    ]);
    $this
      ->assertEqual($stored_value, $value, $message);
  }

  // Add a content translation.
  $langcode = 'it';
  $language = ConfigurableLanguage::load($langcode);
  $values[$langcode] = $this
    ->getNewEntityValues($langcode);
  $entity_type_id = $entity
    ->getEntityTypeId();
  $add_url = Url::fromRoute("entity.{$entity_type_id}.content_translation_add", [
    $entity
      ->getEntityTypeId() => $entity
      ->id(),
    'source' => $default_langcode,
    'target' => $langcode,
  ], [
    'language' => $language,
  ]);
  $this
    ->drupalPostForm($add_url, $this
    ->getEditValues($values, $langcode), $this
    ->getFormSubmitActionForNewTranslation($entity, $langcode));

  // Assert that HTML is not escaped unexpectedly.
  if ($this->testHTMLEscapeForAllLanguages) {
    $this
      ->assertNoRaw('<span class="translation-entity-all-languages">(all languages)</span>');
    $this
      ->assertRaw('<span class="translation-entity-all-languages">(all languages)</span>');
  }

  // Ensure that the content language cache context is not yet added to the
  // page.
  $storage = $this->container
    ->get('entity_type.manager')
    ->getStorage($this->entityTypeId);
  $storage
    ->resetCache([
    $this->entityId,
  ]);
  $entity = $storage
    ->load($this->entityId);
  $this
    ->drupalGet($entity
    ->toUrl());
  $this
    ->assertCacheContexts(Cache::mergeContexts([
    'languages:language_content',
  ], $this->defaultCacheContexts));

  // Reset the cache of the entity, so that the new translation gets the
  // updated values.
  $metadata_source_translation = $this->manager
    ->getTranslationMetadata($entity
    ->getTranslation($default_langcode));
  $metadata_target_translation = $this->manager
    ->getTranslationMetadata($entity
    ->getTranslation($langcode));
  $author_field_name = $entity
    ->hasField('content_translation_uid') ? 'content_translation_uid' : 'uid';
  if ($entity
    ->getFieldDefinition($author_field_name)
    ->isTranslatable()) {
    $this
      ->assertEqual($metadata_target_translation
      ->getAuthor()
      ->id(), $this->translator
      ->id(), new FormattableMarkup('Author of the target translation @langcode correctly stored for translatable owner field.', [
      '@langcode' => $langcode,
    ]));
    $this
      ->assertNotEqual($metadata_target_translation
      ->getAuthor()
      ->id(), $metadata_source_translation
      ->getAuthor()
      ->id(), new FormattableMarkup('Author of the target translation @target different from the author of the source translation @source for translatable owner field.', [
      '@target' => $langcode,
      '@source' => $default_langcode,
    ]));
  }
  else {
    $this
      ->assertEqual($metadata_target_translation
      ->getAuthor()
      ->id(), $this->editor
      ->id(), 'Author of the entity remained untouched after translation for non translatable owner field.');
  }
  $created_field_name = $entity
    ->hasField('content_translation_created') ? 'content_translation_created' : 'created';
  if ($entity
    ->getFieldDefinition($created_field_name)
    ->isTranslatable()) {
    $this
      ->assertTrue($metadata_target_translation
      ->getCreatedTime() > $metadata_source_translation
      ->getCreatedTime(), new FormattableMarkup('Translation creation timestamp of the target translation @target is newer than the creation timestamp of the source translation @source for translatable created field.', [
      '@target' => $langcode,
      '@source' => $default_langcode,
    ]));
  }
  else {
    $this
      ->assertEqual($metadata_target_translation
      ->getCreatedTime(), $metadata_source_translation
      ->getCreatedTime(), 'Creation timestamp of the entity remained untouched after translation for non translatable created field.');
  }
  if ($this->testLanguageSelector) {
    $this
      ->assertNoFieldByXPath('//select[@id="edit-langcode-0-value"]', NULL, 'Language selector correctly disabled on translations.');
  }
  $storage
    ->resetCache([
    $this->entityId,
  ]);
  $entity = $storage
    ->load($this->entityId);
  $this
    ->drupalGet($entity
    ->toUrl('drupal:content-translation-overview'));
  $this
    ->assertNoText('Source language', 'Source language column correctly hidden.');

  // Switch the source language.
  $langcode = 'fr';
  $language = ConfigurableLanguage::load($langcode);
  $source_langcode = 'it';
  $edit = [
    'source_langcode[source]' => $source_langcode,
  ];
  $entity_type_id = $entity
    ->getEntityTypeId();
  $add_url = Url::fromRoute("entity.{$entity_type_id}.content_translation_add", [
    $entity
      ->getEntityTypeId() => $entity
      ->id(),
    'source' => $default_langcode,
    'target' => $langcode,
  ], [
    'language' => $language,
  ]);

  // This does not save anything, it merely reloads the form and fills in the
  // fields with the values from the different source language.
  $this
    ->drupalPostForm($add_url, $edit, t('Change'));
  $this
    ->assertFieldByXPath("//input[@name=\"{$this->fieldName}[0][value]\"]", $values[$source_langcode][$this->fieldName][0]['value'], 'Source language correctly switched.');

  // Add another translation and mark the other ones as outdated.
  $values[$langcode] = $this
    ->getNewEntityValues($langcode);
  $edit = $this
    ->getEditValues($values, $langcode) + [
    'content_translation[retranslate]' => TRUE,
  ];
  $entity_type_id = $entity
    ->getEntityTypeId();
  $add_url = Url::fromRoute("entity.{$entity_type_id}.content_translation_add", [
    $entity
      ->getEntityTypeId() => $entity
      ->id(),
    'source' => $source_langcode,
    'target' => $langcode,
  ], [
    'language' => $language,
  ]);
  $this
    ->drupalPostForm($add_url, $edit, $this
    ->getFormSubmitActionForNewTranslation($entity, $langcode));
  $storage
    ->resetCache([
    $this->entityId,
  ]);
  $entity = $storage
    ->load($this->entityId);
  $this
    ->drupalGet($entity
    ->toUrl('drupal:content-translation-overview'));
  $this
    ->assertText('Source language', 'Source language column correctly shown.');

  // Check that the entered values have been correctly stored.
  foreach ($values as $langcode => $property_values) {
    $translation = $this
      ->getTranslation($entity, $langcode);
    foreach ($property_values as $property => $value) {
      $stored_value = $this
        ->getValue($translation, $property, $langcode);
      $value = is_array($value) ? $value[0]['value'] : $value;
      $message = new FormattableMarkup('%property correctly stored with language %language.', [
        '%property' => $property,
        '%language' => $langcode,
      ]);
      $this
        ->assertEqual($stored_value, $value, $message);
    }
  }
}