function TranslationTest::testTranslatableFieldSaveLoad

Test translatable fields storage/retrieval.

File

drupal/core/modules/field/lib/Drupal/field/Tests/TranslationTest.php, line 217
Definition of Drupal\field\Tests\TranslationTest.

Class

TranslationTest
Unit test class for the multilanguage fields logic.

Namespace

Drupal\field\Tests

Code

function testTranslatableFieldSaveLoad() {

  // Enable field translations for nodes.
  field_test_entity_info_translatable('node', TRUE);
  $entity_info = entity_get_info('node');
  $this
    ->assertTrue(count($entity_info['translatable']), 'Nodes are translatable.');

  // Prepare the field translations.
  field_test_entity_info_translatable('test_entity', TRUE);
  $eid = $evid = 1;
  $entity_type = 'test_entity';
  $entity = field_test_create_entity($eid, $evid, $this->instance['bundle']);
  $field_translations = array();
  $available_langcodes = field_available_languages($entity_type, $this->field);
  $this
    ->assertTrue(count($available_langcodes) > 1, 'Field is translatable.');
  foreach ($available_langcodes as $langcode) {
    $field_translations[$langcode] = $this
      ->_generateTestFieldValues($this->field['cardinality']);
  }

  // Save and reload the field translations.
  $entity->{$this->field_name} = $field_translations;
  field_attach_insert($entity);
  unset($entity->{$this->field_name});
  field_attach_load($entity_type, array(
    $eid => $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->{$this->field_name}[$langcode][$delta]['value'];
    }
    $this
      ->assertTrue($result, format_string('%language translation correctly handled.', array(
      '%language' => $langcode,
    )));
  }

  // Test default values.
  $field_name_default = drupal_strtolower($this
    ->randomName() . '_field_name');
  $field_definition = $this->field_definition;
  $field_definition['field_name'] = $field_name_default;
  $field = field_create_field($field_definition);
  $instance_definition = $this->instance_definition;
  $instance_definition['field_name'] = $field_name_default;
  $instance_definition['default_value'] = array(
    array(
      'value' => rand(1, 127),
    ),
  );
  $instance = field_create_instance($instance_definition);
  $translation_langcodes = array_slice($available_langcodes, 0, 2);
  asort($translation_langcodes);
  $translation_langcodes = array_values($translation_langcodes);
  $eid++;
  $evid++;
  $values = array(
    'eid' => $eid,
    'evid' => $evid,
    'fttype' => $instance['bundle'],
    'langcode' => $translation_langcodes[0],
  );
  foreach ($translation_langcodes as $langcode) {
    $values[$this->field_name][$langcode] = $this
      ->_generateTestFieldValues($this->field['cardinality']);
  }
  $entity = entity_create($entity_type, $values);
  ksort($entity->{$field_name_default});
  $field_langcodes = array_keys($entity->{$field_name_default});
  $this
    ->assertEqual($translation_langcodes, $field_langcodes, 'Missing translations did not get a default value.');
  foreach ($entity->{$field_name_default} as $langcode => $items) {
    $this
      ->assertEqual($items, $instance['default_value'], format_string('Default value correctly populated for language %language.', array(
      '%language' => $langcode,
    )));
  }

  // Check that explicit empty values are not overridden with default values.
  foreach (array(
    NULL,
    array(),
  ) as $empty_items) {
    $eid++;
    $evid++;
    $values = array(
      'eid' => $eid,
      'evid' => $evid,
      'fttype' => $instance['bundle'],
      'langcode' => $translation_langcodes[0],
    );
    foreach ($translation_langcodes as $langcode) {
      $values[$this->field_name][$langcode] = $this
        ->_generateTestFieldValues($this->field['cardinality']);
      $values[$field_name_default][$langcode] = $empty_items;
    }
    $entity = entity_create($entity_type, $values);
    foreach ($entity->{$field_name_default} as $langcode => $items) {
      $this
        ->assertEqual($items, $empty_items, format_string('Empty value correctly populated for language %language.', array(
        '%language' => $langcode,
      )));
    }
  }
}