1 field.test FieldAttachStorageTestCase::testFieldAttachLoadMultiple()

Test the 'multiple' load feature.

File

core/modules/field/tests/field.test, line 188
Tests for field.module.

Class

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

Code

function testFieldAttachLoadMultiple() {
  $entity_type = 'test_entity';
  $langcode = LANGUAGE_NONE;

  // Define 2 bundles.
  $bundles = array(
    1 => 'test_bundle_1',
    2 => 'test_bundle_2',
  );
  field_test_create_bundle($bundles[1]);
  field_test_create_bundle($bundles[2]);
  // Define 3 fields:
  // - field_1 is in bundle_1 and bundle_2,
  // - field_2 is in bundle_1,
  // - field_3 is in bundle_2.
  $field_bundles_map = array(
    1 => array(1, 2),
    2 => array(1),
    3 => array(2),
  );
  $field_names = array();
  $entities = array();
  for ($i = 1; $i <= 3; $i++) {
    $field_names[$i] = 'field_' . $i;
    $field = array('field_name' => $field_names[$i], 'type' => 'test_field');
    $field = field_create_field($field);
    $field_names[$i] = $field['field_name'];
    foreach ($field_bundles_map[$i] as $bundle) {
      $instance = array(
        'field_name' => $field_names[$i],
        'entity_type' => 'test_entity',
        'bundle' => $bundles[$bundle],
        'settings' => array(
          // Configure the instance so that we test hook_field_load()
          // (see field_test_field_load() in field_test.module).
          'test_hook_field_load' => TRUE,
        ),
      );
      field_create_instance($instance);
    }
  }

  // Create one test entity per bundle, with random values.
  $values = array();
  foreach ($bundles as $index => $bundle) {
    $entities[$index] = field_test_create_entity($index, $index, $bundle);
    $entity = clone($entities[$index]);
    $instances = field_info_instances('test_entity', $bundle);
    foreach ($instances as $field_name => $instance) {
      $values[$index][$field_name] = mt_rand(1, 127);
      $entity->$field_name = array($langcode => array(array('value' => $values[$index][$field_name])));
    }
    field_attach_insert($entity_type, $entity);
  }

  // Check that a single load correctly loads field values for both entities.
  field_attach_load($entity_type, $entities);
  foreach ($entities as $index => $entity) {
    $instances = field_info_instances($entity_type, $bundles[$index]);
    foreach ($instances as $field_name => $instance) {
      // The field value loaded matches the one inserted.
      $this->assertEqual($entity->{$field_name}[$langcode][0]['value'], $values[$index][$field_name], format_string('Entity %index: expected value was found.', array('%index' => $index)));
      // The value added in hook_field_load() is found.
      $this->assertEqual($entity->{$field_name}[$langcode][0]['additional_key'], 'additional_value', format_string('Entity %index: extra information was found', array('%index' => $index)));
    }
  }

  // Check that the single-field load option works.
  $entity = field_test_create_entity(1, 1, $bundles[1]);
  field_attach_load($entity_type, array(1 => $entity), FIELD_LOAD_CURRENT, array('field_name' => $field_names[1]));
  $this->assertEqual($entity->{$field_names[1]}[$langcode][0]['value'], $values[1][$field_names[1]], format_string('Entity %index: expected value was found.', array('%index' => 1)));
  $this->assertEqual($entity->{$field_names[1]}[$langcode][0]['additional_key'], 'additional_value', format_string('Entity %index: extra information was found', array('%index' => 1)));
  $this->assert(!isset($entity->{$field_names[2]}), format_string('Entity %index: field %field_name is not loaded.', array('%index' => 2, '%field_name' => $field_names[2])));
  $this->assert(!isset($entity->{$field_names[3]}), format_string('Entity %index: field %field_name is not loaded.', array('%index' => 3, '%field_name' => $field_names[3])));
}