function FieldAttachStorageTest::testFieldAttachSaveMissingDataDefaultValue

Test insert with missing or NULL fields, with default value.

File

drupal/core/modules/field/lib/Drupal/field/Tests/FieldAttachStorageTest.php, line 345
Definition of Drupal\field\Tests\FieldAttachStorageTest.

Class

FieldAttachStorageTest
Unit test class for storage-related field_attach_* functions.

Namespace

Drupal\field\Tests

Code

function testFieldAttachSaveMissingDataDefaultValue() {

  // Add a default value function.
  $this->instance['default_value_function'] = 'field_test_default_value';
  field_update_instance($this->instance);

  // Verify that fields are populated with default values.
  $entity_type = 'test_entity';
  $entity_init = field_test_create_entity();
  $langcode = Language::LANGCODE_NOT_SPECIFIED;
  $default = field_test_default_value($entity_init, $this->field, $this->instance);
  $this
    ->assertEqual($entity_init->{$this->field_name}[$langcode], $default, 'Default field value correctly populated.');

  // Insert: Field is NULL.
  $entity = clone $entity_init;
  $entity->{$this->field_name}[$langcode] = NULL;
  field_attach_insert($entity);
  $entity = clone $entity_init;
  $entity->{$this->field_name} = array();
  field_attach_load($entity_type, array(
    $entity->ftid => $entity,
  ));
  $this
    ->assertTrue(empty($entity->{$this->field_name}[$langcode]), 'Insert: NULL field results in no value saved');

  // Insert: Field is missing.
  field_cache_clear();
  $entity = clone $entity_init;
  field_attach_insert($entity);
  $entity = clone $entity_init;
  $entity->{$this->field_name} = array();
  field_attach_load($entity_type, array(
    $entity->ftid => $entity,
  ));
  $this
    ->assertEqual($entity->{$this->field_name}[$langcode], $default, 'Insert: missing field results in default value saved');

  // Verify that prepopulated field values are not overwritten by defaults.
  $value = array(
    array(
      'value' => $default[0]['value'] - mt_rand(1, 127),
    ),
  );
  $entity = entity_create('test_entity', array(
    'fttype' => $entity_init
      ->bundle(),
    $this->field_name => array(
      $langcode => $value,
    ),
  ));
  $this
    ->assertEqual($entity->{$this->field_name}[$langcode], $value, 'Prepopulated field value correctly maintained.');
}