function TranslationTest::testTranslatableFieldSaveLoad

Same name in other branches
  1. 9 core/modules/field/tests/src/Kernel/TranslationTest.php \Drupal\Tests\field\Kernel\TranslationTest::testTranslatableFieldSaveLoad()
  2. 8.9.x core/modules/field/tests/src/Kernel/TranslationTest.php \Drupal\Tests\field\Kernel\TranslationTest::testTranslatableFieldSaveLoad()
  3. 11.x core/modules/field/tests/src/Kernel/TranslationTest.php \Drupal\Tests\field\Kernel\TranslationTest::testTranslatableFieldSaveLoad()

Tests translatable fields storage/retrieval.

File

core/modules/field/tests/src/Kernel/TranslationTest.php, line 111

Class

TranslationTest
Tests multilingual fields logic.

Namespace

Drupal\Tests\field\Kernel

Code

public function testTranslatableFieldSaveLoad() : void {
    // Enable field translations for nodes.
    field_test_entity_info_translatable('node', TRUE);
    $entity_type = \Drupal::entityTypeManager()->getDefinition('node');
    $this->assertTrue($entity_type->isTranslatable(), 'Nodes are translatable.');
    // Prepare the field translations.
    $entity_type_id = 'entity_test';
    field_test_entity_info_translatable($entity_type_id, TRUE);
    $entity = $this->container
        ->get('entity_type.manager')
        ->getStorage($entity_type_id)
        ->create([
        'type' => $this->field
            ->getTargetBundle(),
    ]);
    $field_translations = [];
    $available_langcodes = array_keys($this->container
        ->get('language_manager')
        ->getLanguages());
    $entity->langcode->value = reset($available_langcodes);
    foreach ($available_langcodes as $langcode) {
        $field_translations[$langcode] = $this->_generateTestFieldValues($this->fieldStorage
            ->getCardinality());
        $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
        $translation->{$this->fieldName}
            ->setValue($field_translations[$langcode]);
    }
    // Save and reload the field translations.
    $entity = $this->entitySaveReload($entity);
    // Check if the correct values were saved/loaded.
    foreach ($field_translations as $langcode => $items) {
        $result = TRUE;
        foreach ($items as $delta => $item) {
            $result = $result && $item['value'] == $entity->getTranslation($langcode)->{$this->fieldName}[$delta]->value;
        }
        $this->assertTrue($result, "{$langcode} translation correctly handled.");
    }
    // Test default values.
    $field_name_default = $this->randomMachineName() . '_field_name';
    $field_storage_definition = $this->fieldStorageDefinition;
    $field_storage_definition['field_name'] = $field_name_default;
    $field_storage = FieldStorageConfig::create($field_storage_definition);
    $field_storage->save();
    $field_definition = $this->fieldDefinition;
    $field_definition['field_storage'] = $field_storage;
    $field_definition['default_value'] = [
        [
            'value' => rand(1, 127),
        ],
    ];
    $field = FieldConfig::create($field_definition);
    $field->save();
    $translation_langcodes = array_slice($available_langcodes, 0, 2);
    asort($translation_langcodes);
    $translation_langcodes = array_values($translation_langcodes);
    $values = [
        'type' => $field->getTargetBundle(),
        'langcode' => $translation_langcodes[0],
    ];
    $entity = $this->container
        ->get('entity_type.manager')
        ->getStorage($entity_type_id)
        ->create($values);
    foreach ($translation_langcodes as $langcode) {
        $values[$this->fieldName][$langcode] = $this->_generateTestFieldValues($this->fieldStorage
            ->getCardinality());
        $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
        $translation->{$this->fieldName}
            ->setValue($values[$this->fieldName][$langcode]);
    }
    $field_langcodes = array_keys($entity->getTranslationLanguages());
    sort($field_langcodes);
    $this->assertEquals($translation_langcodes, $field_langcodes, 'Missing translations did not get a default value.');
    // @todo Test every translation once the Entity Translation API allows for
    //   multilingual defaults.
    $langcode = $entity->language()
        ->getId();
    $this->assertEquals($field->getDefaultValueLiteral(), $entity->getTranslation($langcode)->{$field_name_default}
        ->getValue(), "Default value correctly populated for language {$langcode}.");
    $storage = \Drupal::entityTypeManager()->getStorage($entity_type_id);
    // Check that explicit empty values are not overridden with default values.
    foreach ([
        NULL,
        [],
    ] as $empty_items) {
        $values = [
            'type' => $field->getTargetBundle(),
            'langcode' => $translation_langcodes[0],
        ];
        $entity = $storage->create($values);
        foreach ($translation_langcodes as $langcode) {
            $values[$this->fieldName][$langcode] = $this->_generateTestFieldValues($this->fieldStorage
                ->getCardinality());
            $translation = $entity->hasTranslation($langcode) ? $entity->getTranslation($langcode) : $entity->addTranslation($langcode);
            $translation->{$this->fieldName}
                ->setValue($values[$this->fieldName][$langcode]);
            $translation->{$field_name_default}
                ->setValue($empty_items);
            $values[$field_name_default][$langcode] = $empty_items;
        }
        foreach ($entity->getTranslationLanguages() as $langcode => $language) {
            $this->assertEquals([], $entity->getTranslation($langcode)->{$field_name_default}
                ->getValue(), "Empty value correctly populated for language {$langcode}.");
        }
    }
}

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.