Version 1
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Entity / FieldTranslationSqlStorageTest.php
diff --git a/web/core/tests/Drupal/KernelTests/Core/Entity/FieldTranslationSqlStorageTest.php b/web/core/tests/Drupal/KernelTests/Core/Entity/FieldTranslationSqlStorageTest.php
new file mode 100644 (file)
index 0000000..c398732
--- /dev/null
@@ -0,0 +1,104 @@
+<?php
+
+namespace Drupal\KernelTests\Core\Entity;
+
+use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Language\LanguageInterface;
+use Drupal\field\Entity\FieldStorageConfig;
+
+/**
+ * Tests Field translation SQL Storage.
+ *
+ * @group Entity
+ */
+class FieldTranslationSqlStorageTest extends EntityLanguageTestBase {
+
+  /**
+   * Tests field SQL storage.
+   */
+  public function testFieldSqlStorage() {
+    $entity_type = 'entity_test_mul';
+
+    $controller = $this->entityManager->getStorage($entity_type);
+    $values = [
+      $this->fieldName => $this->randomMachineName(),
+      $this->untranslatableFieldName => $this->randomMachineName(),
+    ];
+    $entity = $controller->create($values);
+    $entity->save();
+
+    // Tests that when changing language field language codes are still correct.
+    $langcode = $this->langcodes[0];
+    $entity->langcode->value = $langcode;
+    $entity->save();
+    $this->assertFieldStorageLangcode($entity, 'Field language successfully changed from language neutral.');
+    $langcode = $this->langcodes[1];
+    $entity->langcode->value = $langcode;
+    $entity->save();
+    $this->assertFieldStorageLangcode($entity, 'Field language successfully changed.');
+    $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
+    $entity->langcode->value = $langcode;
+    $entity->save();
+    $this->assertFieldStorageLangcode($entity, 'Field language successfully changed to language neutral.');
+
+    // Test that after switching field translatability things keep working as
+    // before.
+    $this->toggleFieldTranslatability($entity_type, $entity_type);
+    $entity = $this->reloadEntity($entity);
+    foreach ([$this->fieldName, $this->untranslatableFieldName] as $field_name) {
+      $this->assertEqual($entity->get($field_name)->value, $values[$field_name], 'Field language works as expected after switching translatability.');
+    }
+
+    // Test that after disabling field translatability translated values are not
+    // loaded.
+    $this->toggleFieldTranslatability($entity_type, $entity_type);
+    $entity = $this->reloadEntity($entity);
+    $entity->langcode->value = $this->langcodes[0];
+    $translation = $entity->addTranslation($this->langcodes[1]);
+    $translated_value = $this->randomMachineName();
+    $translation->get($this->fieldName)->value = $translated_value;
+    $translation->save();
+    $this->toggleFieldTranslatability($entity_type, $entity_type);
+    $entity = $this->reloadEntity($entity);
+    $this->assertEqual($entity->getTranslation($this->langcodes[1])->get($this->fieldName)->value, $values[$this->fieldName], 'Existing field translations are not loaded for untranslatable fields.');
+  }
+
+  /**
+   * Checks whether field languages are correctly stored for the given entity.
+   *
+   * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
+   *   The entity fields are attached to.
+   * @param string $message
+   *   (optional) A message to display with the assertion.
+   */
+  protected function assertFieldStorageLangcode(FieldableEntityInterface $entity, $message = '') {
+    $status = TRUE;
+    $entity_type = $entity->getEntityTypeId();
+    $id = $entity->id();
+    $langcode = $entity->getUntranslated()->language()->getId();
+    $fields = [$this->fieldName, $this->untranslatableFieldName];
+    /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
+    $table_mapping = \Drupal::entityManager()->getStorage($entity_type)->getTableMapping();
+
+    foreach ($fields as $field_name) {
+      $field_storage = FieldStorageConfig::loadByName($entity_type, $field_name);
+      $table = $table_mapping->getDedicatedDataTableName($field_storage);
+
+      $record = \Drupal::database()
+        ->select($table, 'f')
+        ->fields('f')
+        ->condition('f.entity_id', $id)
+        ->condition('f.revision_id', $id)
+        ->execute()
+        ->fetchObject();
+
+      if ($record->langcode != $langcode) {
+        $status = FALSE;
+        break;
+      }
+    }
+
+    return $this->assertTrue($status, $message);
+  }
+
+}