/** * Tests field loading works correctly by inserting directly in the tables. */ function testFieldLoad() { $entity_type = $bundle = 'entity_test_rev'; $storage = $this->container->get('entity.manager')->getStorage($entity_type); $columns = array('bundle', 'deleted', 'entity_id', 'revision_id', 'delta', 'langcode', $this->tableMapping->getFieldColumnName($this->fieldStorage, 'value')); // Create an entity with four revisions. $revision_ids = array(); $entity = $this->container->get('entity_type.manager')->getStorage($entity_type)->create(); $entity->save(); $revision_ids[] = $entity->getRevisionId(); for ($i = 0; $i < 4; $i++) { $entity->setNewRevision(); $entity->save(); $revision_ids[] = $entity->getRevisionId(); } // Generate values and insert them directly in the storage tables. $values = array(); $query = db_insert($this->revisionTable)->fields($columns); foreach ($revision_ids as $revision_id) { // Put one value too many. for ($delta = 0; $delta <= $this->fieldCardinality; $delta++) { $value = mt_rand(1, 127); $values[$revision_id][] = $value; $query->values(array($bundle, 0, $entity->id(), $revision_id, $delta, $entity->language()->getId(), $value)); } $query->execute(); } $query = db_insert($this->table)->fields($columns); foreach ($values[$revision_id] as $delta => $value) { $query->values(array($bundle, 0, $entity->id(), $revision_id, $delta, $entity->language()->getId(), $value)); } $query->execute(); // Load every revision and check the values. foreach ($revision_ids as $revision_id) { $entity = $storage->loadRevision($revision_id); foreach ($values[$revision_id] as $delta => $value) { if ($delta < $this->fieldCardinality) { $this->assertEqual($entity->{$this->fieldName}[$delta]->value, $value); } else { $this->assertFalse(array_key_exists($delta, $entity->{$this->fieldName})); } } } // Load the "current revision" and check the values. $entity = $storage->load($entity->id()); foreach ($values[$revision_id] as $delta => $value) { if ($delta < $this->fieldCardinality) { $this->assertEqual($entity->{$this->fieldName}[$delta]->value, $value); } else { $this->assertFalse(array_key_exists($delta, $entity->{$this->fieldName})); } } // Add a translation in an unavailable language code and verify it is not // loaded. $unavailable_langcode = 'xx'; $values = array($bundle, 0, $entity->id(), $entity->getRevisionId(), 0, $unavailable_langcode, mt_rand(1, 127)); db_insert($this->table)->fields($columns)->values($values)->execute(); db_insert($this->revisionTable)->fields($columns)->values($values)->execute(); $entity = $storage->load($entity->id()); $this->assertFalse(array_key_exists($unavailable_langcode, $entity->{$this->fieldName})); }
/** * Tests DefaultTableMapping::getFieldColumnName() with invalid parameters. * * @param bool $base_field * Flag indicating whether the field should be treated as a base or bundle * field. * @param string[] $columns * An array of available field column names. * @param string $column * The name of the column to be processed. * * @expectedException \Drupal\Core\Entity\Sql\SqlContentEntityStorageException * @expectedExceptionMessage Column information not available for the 'test' field. * * @covers ::getFieldColumnName * * @dataProvider providerTestGetFieldColumnName */ public function testGetFieldColumnNameInvalid($base_field, $columns, $column) { $definitions['test'] = $this->setUpDefinition('test', $columns, $base_field); // Mark field storage definition as custom storage. $definitions['test']->expects($this->any())->method('hasCustomStorage')->willReturn(TRUE); $table_mapping = new DefaultTableMapping($this->entityType, $definitions); $table_mapping->getFieldColumnName($definitions['test'], $column); }