3 namespace Drupal\KernelTests\Core\Entity;
5 use Drupal\Core\Entity\FieldableEntityInterface;
6 use Drupal\Core\Language\LanguageInterface;
7 use Drupal\field\Entity\FieldStorageConfig;
10 * Tests Field translation SQL Storage.
14 class FieldTranslationSqlStorageTest extends EntityLanguageTestBase {
17 * Tests field SQL storage.
19 public function testFieldSqlStorage() {
20 $entity_type = 'entity_test_mul';
22 $controller = $this->entityManager->getStorage($entity_type);
24 $this->fieldName => $this->randomMachineName(),
25 $this->untranslatableFieldName => $this->randomMachineName(),
27 $entity = $controller->create($values);
30 // Tests that when changing language field language codes are still correct.
31 $langcode = $this->langcodes[0];
32 $entity->langcode->value = $langcode;
34 $this->assertFieldStorageLangcode($entity, 'Field language successfully changed from language neutral.');
35 $langcode = $this->langcodes[1];
36 $entity->langcode->value = $langcode;
38 $this->assertFieldStorageLangcode($entity, 'Field language successfully changed.');
39 $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
40 $entity->langcode->value = $langcode;
42 $this->assertFieldStorageLangcode($entity, 'Field language successfully changed to language neutral.');
44 // Test that after switching field translatability things keep working as
46 $this->toggleFieldTranslatability($entity_type, $entity_type);
47 $entity = $this->reloadEntity($entity);
48 foreach ([$this->fieldName, $this->untranslatableFieldName] as $field_name) {
49 $this->assertEqual($entity->get($field_name)->value, $values[$field_name], 'Field language works as expected after switching translatability.');
52 // Test that after disabling field translatability translated values are not
54 $this->toggleFieldTranslatability($entity_type, $entity_type);
55 $entity = $this->reloadEntity($entity);
56 $entity->langcode->value = $this->langcodes[0];
57 $translation = $entity->addTranslation($this->langcodes[1]);
58 $translated_value = $this->randomMachineName();
59 $translation->get($this->fieldName)->value = $translated_value;
61 $this->toggleFieldTranslatability($entity_type, $entity_type);
62 $entity = $this->reloadEntity($entity);
63 $this->assertEqual($entity->getTranslation($this->langcodes[1])->get($this->fieldName)->value, $values[$this->fieldName], 'Existing field translations are not loaded for untranslatable fields.');
67 * Checks whether field languages are correctly stored for the given entity.
69 * @param \Drupal\Core\Entity\FieldableEntityInterface $entity
70 * The entity fields are attached to.
71 * @param string $message
72 * (optional) A message to display with the assertion.
74 protected function assertFieldStorageLangcode(FieldableEntityInterface $entity, $message = '') {
76 $entity_type = $entity->getEntityTypeId();
78 $langcode = $entity->getUntranslated()->language()->getId();
79 $fields = [$this->fieldName, $this->untranslatableFieldName];
80 /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */
81 $table_mapping = \Drupal::entityManager()->getStorage($entity_type)->getTableMapping();
83 foreach ($fields as $field_name) {
84 $field_storage = FieldStorageConfig::loadByName($entity_type, $field_name);
85 $table = $table_mapping->getDedicatedDataTableName($field_storage);
87 $record = \Drupal::database()
90 ->condition('f.entity_id', $id)
91 ->condition('f.revision_id', $id)
95 if ($record->langcode != $langcode) {
101 return $this->assertTrue($status, $message);