Upgraded drupal core with security updates
[yaffs-website] / web / core / tests / Drupal / KernelTests / Core / Entity / FieldTranslationSqlStorageTest.php
1 <?php
2
3 namespace Drupal\KernelTests\Core\Entity;
4
5 use Drupal\Core\Entity\FieldableEntityInterface;
6 use Drupal\Core\Language\LanguageInterface;
7 use Drupal\field\Entity\FieldStorageConfig;
8
9 /**
10  * Tests Field translation SQL Storage.
11  *
12  * @group Entity
13  */
14 class FieldTranslationSqlStorageTest extends EntityLanguageTestBase {
15
16   /**
17    * Tests field SQL storage.
18    */
19   public function testFieldSqlStorage() {
20     $entity_type = 'entity_test_mul';
21
22     $controller = $this->entityManager->getStorage($entity_type);
23     $values = [
24       $this->fieldName => $this->randomMachineName(),
25       $this->untranslatableFieldName => $this->randomMachineName(),
26     ];
27     $entity = $controller->create($values);
28     $entity->save();
29
30     // Tests that when changing language field language codes are still correct.
31     $langcode = $this->langcodes[0];
32     $entity->langcode->value = $langcode;
33     $entity->save();
34     $this->assertFieldStorageLangcode($entity, 'Field language successfully changed from language neutral.');
35     $langcode = $this->langcodes[1];
36     $entity->langcode->value = $langcode;
37     $entity->save();
38     $this->assertFieldStorageLangcode($entity, 'Field language successfully changed.');
39     $langcode = LanguageInterface::LANGCODE_NOT_SPECIFIED;
40     $entity->langcode->value = $langcode;
41     $entity->save();
42     $this->assertFieldStorageLangcode($entity, 'Field language successfully changed to language neutral.');
43
44     // Test that after switching field translatability things keep working as
45     // before.
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.');
50     }
51
52     // Test that after disabling field translatability translated values are not
53     // loaded.
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;
60     $translation->save();
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.');
64   }
65
66   /**
67    * Checks whether field languages are correctly stored for the given entity.
68    *
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.
73    */
74   protected function assertFieldStorageLangcode(FieldableEntityInterface $entity, $message = '') {
75     $status = TRUE;
76     $entity_type = $entity->getEntityTypeId();
77     $id = $entity->id();
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();
82
83     foreach ($fields as $field_name) {
84       $field_storage = FieldStorageConfig::loadByName($entity_type, $field_name);
85       $table = $table_mapping->getDedicatedDataTableName($field_storage);
86
87       $record = \Drupal::database()
88         ->select($table, 'f')
89         ->fields('f')
90         ->condition('f.entity_id', $id)
91         ->condition('f.revision_id', $id)
92         ->execute()
93         ->fetchObject();
94
95       if ($record->langcode != $langcode) {
96         $status = FALSE;
97         break;
98       }
99     }
100
101     return $this->assertTrue($status, $message);
102   }
103
104 }