function FieldSqlStorageTestCase::testFieldAttachLoad

7.x field_sql_storage.test FieldSqlStorageTestCase::testFieldAttachLoad()

Uses the mysql tables and records to verify field_load_revision works correctly.

File

drupal-7.x/modules/field/modules/field_sql_storage/field_sql_storage.test, line 43
Tests for field_sql_storage.module.

Class

FieldSqlStorageTestCase
Tests field storage.

Code

function testFieldAttachLoad() {
  $entity_type = 'test_entity';
  $eid = 0;
  $langcode = LANGUAGE_NONE;

  $columns = array('entity_type', 'entity_id', 'revision_id', 'delta', 'language', $this->field_name . '_value');

  // Insert data for four revisions to the field revisions table
  $query = db_insert($this->revision_table)->fields($columns);
  for ($evid = 0; $evid < 4; ++$evid) {
    $values[$evid] = array();
    // Note: we insert one extra value ('<=' instead of '<').
    for ($delta = 0; $delta <= $this->field['cardinality']; $delta++) {
      $value = mt_rand(1, 127);
      $values[$evid][] = $value;
      $query->values(array($entity_type, $eid, $evid, $delta, $langcode, $value));
    }
  }
  $query->execute();

  // Insert data for the "most current revision" into the field table
  $query = db_insert($this->table)->fields($columns);
  foreach ($values[0] as $delta => $value) {
    $query->values(array($entity_type, $eid, 0, $delta, $langcode, $value));
  }
  $query->execute();

  // Load the "most current revision"
  $entity = field_test_create_stub_entity($eid, 0, $this->instance['bundle']);
  field_attach_load($entity_type, array($eid => $entity));
  foreach ($values[0] as $delta => $value) {
    if ($delta < $this->field['cardinality']) {
      $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['value'], $value, "Value $delta is loaded correctly for current revision");
    }
    else {
      $this->assertFalse(array_key_exists($delta, $entity->{$this->field_name}[$langcode]), "No extraneous value gets loaded for current revision.");
    }
  }

  // Load every revision
  for ($evid = 0; $evid < 4; ++$evid) {
    $entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']);
    field_attach_load_revision($entity_type, array($eid => $entity));
    foreach ($values[$evid] as $delta => $value) {
      if ($delta < $this->field['cardinality']) {
        $this->assertEqual($entity->{$this->field_name}[$langcode][$delta]['value'], $value, "Value $delta for revision $evid is loaded correctly");
      }
      else {
        $this->assertFalse(array_key_exists($delta, $entity->{$this->field_name}[$langcode]), "No extraneous value gets loaded for revision $evid.");
      }
    }
  }

  // Add a translation in an unavailable language and verify it is not loaded.
  $eid = $evid = 1;
  $unavailable_language = 'xx';
  $entity = field_test_create_stub_entity($eid, $evid, $this->instance['bundle']);
  $values = array($entity_type, $eid, $evid, 0, $unavailable_language, mt_rand(1, 127));
  db_insert($this->table)->fields($columns)->values($values)->execute();
  db_insert($this->revision_table)->fields($columns)->values($values)->execute();
  field_attach_load($entity_type, array($eid => $entity));
  $this->assertFalse(array_key_exists($unavailable_language, $entity->{$this->field_name}), 'Field translation in an unavailable language ignored');
}