diff --git a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php index 18e4334..ac60b72 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityDatabaseStorage.php @@ -152,17 +152,12 @@ public function __construct(EntityTypeInterface $entity_type, Connection $databa return !$definition->isComputed() && !$definition->hasCustomStorage() && !$definition->isMultiple(); }); - $this->idKey = $this->entityType->getKey('id') ?: 'id'; - - // The uuid and bundle keys are optional. - $this->uuidKey = $this->entityType->getKey('uuid'); - $this->bundleKey = $this->entityType->getKey('bundle'); - // @todo Remove table names from the entity type definition in // https://drupal.org/node/2232465 $this->baseTable = $this->entityType->getBaseTable() ?: $this->entityTypeId; - if ($this->entityType->hasKey('revision')) { + $revisionable = $this->entityType->hasKey('revision'); + if ($revisionable) { $this->revisionKey = $this->entityType->getKey('revision') ?: 'revision_id'; $this->revisionTable = $this->entityType->getRevisionTable() ?: $this->entityTypeId . '_revision'; } @@ -170,13 +165,13 @@ public function __construct(EntityTypeInterface $entity_type, Connection $databa // entity query and we have a views data controller. See: // - https://drupal.org/node/2068325 // - https://drupal.org/node/1740492 - $translatable = $this->entityType->getDataTable() && $this->entityType->isTranslatable(); + $translatable = $this->entityType->isTranslatable() && $this->entityType->getDataTable(); if ($translatable) { $this->dataTable = $this->entityType->getDataTable() ?: $this->entityTypeId . '_field_data'; $this->langcodeKey = $this->entityType->getKey('langcode') ?: 'langcode'; $this->defaultLangcodeKey = $this->entityType->getKey('default_langcode') ?: 'default_langcode'; } - if ($this->entityType->hasKey('revision') && $translatable) { + if ($revisionable && $translatable) { $this->revisionDataTable = $this->entityType->getRevisionDataTable() ?: $this->entityTypeId . '_field_revision'; } } @@ -271,17 +266,17 @@ public function getTableMapping() { $translatable = $this->entityType->getDataTable() && $this->entityType->isTranslatable(); if (!$this->entityType->hasKey('revision') && !$translatable) { // The base layout stores all the base field values in the base table. - $this->tableMapping->addFieldColumns($this->baseTable, $all_fields); + $this->tableMapping->setFieldNames($this->baseTable, $all_fields); } elseif ($this->entityType->hasKey('revision') && !$translatable) { // The revisionable layout stores all the base field values in the base // table, except for revision metadata fields. Revisionable fields // denormalized in the base table but also stored in the revision table // together with the entity ID and the revision ID as identifiers. - $this->tableMapping->addFieldColumns($this->baseTable, array_diff($all_fields, $revision_metadata_fields)); + $this->tableMapping->setFieldNames($this->baseTable, array_diff($all_fields, $revision_metadata_fields)); $revision_key_fields = array($this->idKey, $this->revisionKey); - $this->tableMapping->addFieldColumns($this->revisionTable, array_merge($revision_key_fields, $revisionable_fields)); + $this->tableMapping->setFieldNames($this->revisionTable, array_merge($revision_key_fields, $revisionable_fields)); } elseif (!$this->entityType->hasKey('revision') && $translatable) { // Multilingual layouts store key field values in the base table. The @@ -291,12 +286,12 @@ public function getTableMapping() { // performant queries. This means that only the UUID is not stored on // the data table. $this->tableMapping - ->addFieldColumns($this->baseTable, $key_fields) - ->addFieldColumns($this->dataTable, array_diff($all_fields, array($this->uuidKey))) + ->setFieldNames($this->baseTable, $key_fields) + ->setFieldNames($this->dataTable, array_diff($all_fields, array($this->uuidKey))) // Add the denormalized 'default_langcode' field to the mapping. Its // value is identical to the query expression // "base_table.langcode = data_table.langcode" - ->addExtraColumns($this->dataTable, array('default_langcode')); + ->setExtraColumns($this->dataTable, array('default_langcode')); } elseif ($this->entityType->hasKey('revision') && $translatable) { // The revisionable multilingual layout stores key field values in the @@ -306,31 +301,31 @@ public function getTableMapping() { // holds the data field values for all non-revisionable fields. The data // field values of revisionable fields are denormalized in the data // table, as well. - $this->tableMapping->addFieldColumns($this->baseTable, array_diff($key_fields, array($this->langcodeKey))); + $this->tableMapping->setFieldNames($this->baseTable, array_diff($key_fields, array($this->langcodeKey))); // Like in the multilingual, non-revisionable case the UUID is not // in the data table. Additionally, do not store revision metadata // fields in the data table. $data_fields = array_diff($all_fields, array($this->uuidKey), $revision_metadata_fields); $this->tableMapping - ->addFieldColumns($this->dataTable, $data_fields) + ->setFieldNames($this->dataTable, $data_fields) // Add the denormalized 'default_langcode' field to the mapping. Its // value is identical to the query expression // "base_langcode = data_table.langcode" where "base_langcode" is // the language code of the default revision. - ->addExtraColumns($this->dataTable, array('default_langcode')); + ->setExtraColumns($this->dataTable, array('default_langcode')); $revision_base_fields = array_merge(array($this->idKey, $this->revisionKey, $this->langcodeKey), $revision_metadata_fields); - $this->tableMapping->addFieldColumns($this->revisionTable, $revision_base_fields); + $this->tableMapping->setFieldNames($this->revisionTable, $revision_base_fields); $revision_data_key_fields = array($this->idKey, $this->revisionKey, $this->langcodeKey); $revision_data_fields = array_diff($revisionable_fields, $revision_metadata_fields); $this->tableMapping - ->addFieldColumns($this->revisionDataTable, array_merge($revision_data_key_fields, $revision_data_fields)) + ->setFieldNames($this->revisionDataTable, array_merge($revision_data_key_fields, $revision_data_fields)) // Add the denormalized 'default_langcode' field to the mapping. Its // value is identical to the query expression // "revision_table.langcode = data_table.langcode". - ->addExtraColumns($this->revisionDataTable, array('default_langcode')); + ->setExtraColumns($this->revisionDataTable, array('default_langcode')); } } diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php index bcdfaa4..203dde3 100644 --- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php +++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php @@ -38,6 +38,7 @@ public function __construct(EntityTypeInterface $entity_type) { parent::__construct($entity_type); + $this->uuidKey = $this->entityType->getKey('uuid'); $this->bundleKey = $this->entityType->getKey('bundle'); } diff --git a/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php b/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php index 624c290..51e7a67 100644 --- a/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php +++ b/core/lib/Drupal/Core/Entity/Schema/ContentEntitySchemaHandler.php @@ -55,7 +55,7 @@ class ContentEntitySchemaHandler implements ContentEntitySchemaHandlerInterface */ public function __construct(EntityManagerInterface $entity_manager, ContentEntityTypeInterface $entity_type, ContentEntityDatabaseStorage $storage) { $this->entityType = $entity_type; - $this->storageDefinitions = $entity_manager->getFieldStorageDefinitions($entity_type->id(), FALSE); + $this->storageDefinitions = $entity_manager->getFieldStorageDefinitions($entity_type->id()); $this->storage = $storage; } @@ -83,7 +83,7 @@ public function getSchema() { foreach ($table_mapping->getTableNames() as $table_name) { // Add the schema from field definitions. foreach ($table_mapping->getFieldNames($table_name) as $field_name) { - $column_names = $table_mapping->getColumnMapping($field_name); + $column_names = $table_mapping->getColumnNames($field_name); $this->addFieldSchema($schema[$table_name], $field_name, $column_names); } @@ -135,7 +135,7 @@ protected function getTables() { * The table schema to add the field schema to, passed by reference. * @param string $field_name * The name of the field. - * @param string[] $column_mappi + * @param string[] $column_mapping * A mapping of field column names to database column names. */ protected function addFieldSchema(array &$schema, $field_name, array $column_mapping) { @@ -321,9 +321,10 @@ protected function initializeBaseTable() { 'foreign keys' => array(), ); - if ($key = $this->entityType->getKey('uuid')) { + if ($this->entityType->hasKey('uuid')) { + $uuid_key = $this->entityType->getKey('uuid'); $schema['unique keys'] = array( - $this->getEntityIndexName($key) => array($key), + $this->getEntityIndexName($uuid_key) => array($uuid_key), ); } diff --git a/core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php b/core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php index 49ae477..46b4828 100644 --- a/core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php +++ b/core/lib/Drupal/Core/Entity/Sql/DefaultTableMapping.php @@ -95,7 +95,7 @@ public function getAllColumns($table_name) { $this->allColumns[$table_name] = array(); foreach ($this->getFieldNames($table_name) as $field_name) { - $this->allColumns[$table_name] = array_merge($this->allColumns[$table_name], array_values($this->getColumnMapping($field_name))); + $this->allColumns[$table_name] = array_merge($this->allColumns[$table_name], array_values($this->getColumnNames($field_name))); } $this->allColumns[$table_name] = array_merge($this->allColumns[$table_name], $this->getExtraColumns($table_name)); @@ -116,7 +116,7 @@ public function getFieldNames($table_name) { /** * {@inheritdoc} */ - public function getColumnMapping($field_name) { + public function getColumnNames($field_name) { if (!isset($this->columnMapping[$field_name])) { $column_names = array_keys($this->storageDefinitions[$field_name]->getColumns()); if (count($column_names) == 1) { @@ -142,7 +142,7 @@ public function getColumnMapping($field_name) { * * @return $this */ - public function addFieldColumns($table_name, array $field_names) { + public function setFieldNames($table_name, array $field_names) { $this->fieldNames[$table_name] = $field_names; // Force the re-computation of the column list. unset($this->allColumns[$table_name]); @@ -169,7 +169,7 @@ public function getExtraColumns($table_name) { * * @return $this */ - public function addExtraColumns($table_name, array $column_names) { + public function setExtraColumns($table_name, array $column_names) { $this->extraColumns[$table_name] = $column_names; // Force the re-computation of the column list. unset($this->allColumns[$table_name]); diff --git a/core/lib/Drupal/Core/Entity/Sql/TableMappingInterface.php b/core/lib/Drupal/Core/Entity/Sql/TableMappingInterface.php index 69e42d9..422daa3 100644 --- a/core/lib/Drupal/Core/Entity/Sql/TableMappingInterface.php +++ b/core/lib/Drupal/Core/Entity/Sql/TableMappingInterface.php @@ -53,7 +53,7 @@ public function getFieldNames($table_name); * FieldStorageDefinitionInterface::getColumns() while the respective values * are the names of the database columns for this table mapping. */ - public function getColumnMapping($field_name); + public function getColumnNames($field_name); /** * Returns a list of database columns which store denormalized data. diff --git a/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php b/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php index e71d1df..dbeb7fa 100644 --- a/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/ContentEntityDatabaseStorageTest.php @@ -23,6 +23,34 @@ class ContentEntityDatabaseStorageTest extends UnitTestCase { /** + * The content entity database storage used in this test. + * + * @var \Drupal\Core\Entity\ContentEntityDatabaseStorage|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityStorage; + + /** + * The mocked entity type used in this test. + * + * @var \Drupal\Core\Entity\ContentEntityTypeInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityType; + + /** + * An array of field definitions used for this test, keyed by field name. + * + * @var \Drupal\Core\Field\FieldDefinition[]|\PHPUnit_Framework_MockObject_MockObject[] + */ + protected $fieldDefinitions = array(); + + /** + * The mocked entity manager used in this test. + * + * @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject + */ + protected $entityManager; + + /** * {@inheritdoc} */ public static function getInfo() { @@ -34,27 +62,269 @@ public static function getInfo() { } /** + * {@inheritdoc} + */ + public function setUp() { + $this->entityType = $this->getMock('Drupal\Core\Entity\ContentEntityTypeInterface'); + $this->entityType->expects($this->any()) + ->method('id') + ->will($this->returnValue('entity_test')); + + $this->entityManager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface'); + } + + /** + * Tests ContentEntityDatabaseStorage::getBaseTable(). + * + * @param string $base_table + * The base table to be returned by the mocked entity type. + * @param string $expected + * The expected return value of + * ContentEntityDatabaseStorage::getBaseTable(). + * + * @covers ::__construct() + * @covers ::getBaseTable() + * + * @dataProvider providerTestGetBaseTable + */ + public function testGetBaseTable($base_table, $expected) { + $this->entityType->expects($this->once()) + ->method('getBaseTable') + ->will($this->returnValue('entity_test')); + + $this->setUpEntityStorage(); + + $this->assertSame($expected, $this->entityStorage->getBaseTable()); + } + + /** + * Provides test data for testGetBaseTable(). + * + * @return array[] + * An nested array where each inner array has the base table to be returned + * by the mocked entity type as the first value and the expected return + * value of ContentEntityDatabaseStorage::getBaseTable() as the second + * value. + */ + public function providerTestGetBaseTable() { + return array( + // Test that the entity type's base table is used, if provided. + array('entity_test', 'entity_test'), + // Test that the storage falls back to the entity type ID. + array(NULL, 'entity_test'), + ); + } + + /** + * Tests ContentEntityDatabaseStorage::getRevisionTable(). + * + * @param string $revision_table + * The revision table to be returned by the mocked entity type. + * @param string $expected + * The expected return value of + * ContentEntityDatabaseStorage::getRevisionTable(). + * + * @cover ::__construct() + * @covers ::getRevisionTable() + * + * @dataProvider providerTestGetRevisionTable + */ + public function testGetRevisionTable($revision_table, $expected) { + $this->entityType->expects($this->once()) + ->method('hasKey') + ->with('revision') + ->will($this->returnValue(TRUE)); + $this->entityType->expects($this->once()) + ->method('getRevisionTable') + ->will($this->returnValue($revision_table)); + + $this->setUpEntityStorage(); + + $this->assertSame($expected, $this->entityStorage->getRevisionTable()); + } + + /** + * Provides test data for testGetRevisionTable(). + * + * @return array[] + * An nested array where each inner array has the revision table to be + * returned by the mocked entity type as the first value and the expected + * return value of ContentEntityDatabaseStorage::getRevisionTable() as the + * second value. + */ + public function providerTestGetRevisionTable() { + return array( + // Test that the entity type's revision table is used, if provided. + array('entity_test_revision', 'entity_test_revision'), + // Test that the storage falls back to the entity type ID with a + // '_revision' suffix. + array(NULL, 'entity_test_revision'), + ); + } + + /** + * Tests ContentEntityDatabaseStorage::getDataTable(). + * + * @cover ::__construct() + * @covers ::getDataTable() + */ + public function testGetDataTable() { + $this->entityType->expects($this->once()) + ->method('isTranslatable') + ->will($this->returnValue(TRUE)); + $this->entityType->expects($this->exactly(2)) + ->method('getDataTable') + ->will($this->returnValue('entity_test_field_data')); + + $this->setUpEntityStorage(); + + $this->assertSame('entity_test_field_data', $this->entityStorage->getDataTable()); + } + + /** + * Tests ContentEntityDatabaseStorage::getRevisionDataTable(). + * + * @param string $revision_data_table + * The revision data table to be returned by the mocked entity type. + * @param string $expected + * The expected return value of + * ContentEntityDatabaseStorage::getRevisionDataTable(). + * + * @cover ::__construct() + * @covers ::getRevisionDataTable() + * + * @dataProvider providerTestGetRevisionDataTable + */ + public function testGetRevisionDataTable($revision_data_table, $expected) { + $this->entityType->expects($this->once()) + ->method('hasKey') + ->with('revision') + ->will($this->returnValue(TRUE)); + $this->entityType->expects($this->once()) + ->method('getRevisionDataTable') + ->will($this->returnValue($revision_data_table)); + $this->entityType->expects($this->once()) + ->method('isTranslatable') + ->will($this->returnValue(TRUE)); + $this->entityType->expects($this->exactly(2)) + ->method('getDataTable') + ->will($this->returnValue('entity_test_field_data')); + + $this->setUpEntityStorage(); + + $actual = $this->entityStorage->getRevisionDataTable(); + $this->assertSame($expected, $actual); + } + + /** + * Provides test data for testGetRevisionDataTable(). + * + * @return array[] + * An nested array where each inner array has the revision data table to be + * returned by the mocked entity type as the first value and the expected + * return value of ContentEntityDatabaseStorage::getRevisionDataTable() as + * the second value. + */ + public function providerTestGetRevisionDataTable() { + return array( + // Test that the entity type's revision data table is used, if provided. + array('entity_test_field_revision', 'entity_test_field_revision'), + // Test that the storage falls back to the entity type ID with a + // '_field_revision' suffix. + array(NULL, 'entity_test_field_revision'), + ); + } + + /** + * Tests ContentEntityDatabaseStorage::getSchema(). + * + * @covers ::__construct + * @covers ::getSchema + * @covers ::schemaHandler + * @covers ::getTableMapping + */ + public function testGetSchema() { + $columns = array( + 'value' => array( + 'type' => 'int', + ), + ); + + $this->fieldDefinitions['id'] = $this->getMock('Drupal\Core\Field\FieldDefinitionInterface'); + $this->fieldDefinitions['id']->expects($this->once()) + ->method('getColumns') + ->will($this->returnValue($columns)); + $this->fieldDefinitions['id']->expects($this->once()) + ->method('getSchema') + ->will($this->returnValue(array('columns' => $columns))); + + $this->entityType->expects($this->once()) + ->method('getKeys') + ->will($this->returnValue(array('id' => 'id'))); + $this->entityType->expects($this->any()) + ->method('getKey') + ->will($this->returnValueMap(array( + // EntityStorageBase::__construct() + array('id', 'id'), + // ContentEntityStorageBase::__construct() + array('uuid', NULL), + array('bundle', NULL), + // ContentEntitySchemaHandler::initializeBaseTable() + array('id' => 'id'), + // ContentEntitySchemaHandler::processBaseTable() + array('id' => 'id'), + ))); + + $this->entityManager->expects($this->once()) + ->method('getFieldStorageDefinitions') + ->with($this->entityType->id()) + ->will($this->returnValue($this->fieldDefinitions)); + + $this->setUpEntityStorage(); + + $expected = array( + 'entity_test' => array( + 'description' => 'The base table for entity_test entities.', + 'fields' => array( + 'id' => array( + 'type' => 'serial', + 'description' => NULL, + 'not null' => TRUE, + ), + ), + 'primary key' => array('id'), + 'indexes' => array(), + 'foreign keys' => array(), + ), + ); + $this->assertEquals($expected, $this->entityStorage->getSchema()); + + // Test that repeated calls do not result in repeatedly instantiating + // ContentEntitySchemaHandler as getFieldStorageDefinitions() is only + // expected to be called once. + $this->assertEquals($expected, $this->entityStorage->getSchema()); + } + + /** * Tests field SQL schema generation for an entity with a string identifier. * * @covers ::_fieldSqlSchema() */ public function testFieldSqlSchemaForEntityWithStringIdentifier() { $field_type_manager = $this->getMock('Drupal\Core\Field\FieldTypePluginManagerInterface'); - $entity_manager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface'); $container = new ContainerBuilder(); $container->set('plugin.manager.field.field_type', $field_type_manager); - $container->set('entity.manager', $entity_manager); + $container->set('entity.manager', $this->entityManager); \Drupal::setContainer($container); - $definition = $this->getMock('Drupal\Core\Entity\EntityTypeInterface'); - $definition->expects($this->any()) + $this->entityType->expects($this->any()) ->method('getKey') ->will($this->returnValueMap(array( array('id', 'id'), array('revision', 'revision'), ))); - $definition->expects($this->once()) + $this->entityType->expects($this->once()) ->method('hasKey') ->with('revision') ->will($this->returnValue(TRUE)); @@ -66,19 +336,18 @@ public function testFieldSqlSchemaForEntityWithStringIdentifier() { ->method('getDefaultInstanceSettings') ->will($this->returnValue(array())); - $fields['id'] = FieldDefinition::create('string') + $this->fieldDefinitions['id'] = FieldDefinition::create('string') ->setName('id'); - $fields['revision'] = FieldDefinition::create('string') + $this->fieldDefinitions['revision'] = FieldDefinition::create('string') ->setName('revision'); - $entity_manager->expects($this->any()) + $this->entityManager->expects($this->any()) ->method('getDefinition') ->with('test_entity') - ->will($this->returnValue($definition)); - $entity_manager->expects($this->any()) + ->will($this->returnValue($this->entityType)); + $this->entityManager->expects($this->once()) ->method('getBaseFieldDefinitions') - ->with('test_entity') - ->will($this->returnValue($fields)); + ->will($this->returnValue($this->fieldDefinitions)); // Define a field definition for a test_field field. $field = $this->getMock('\Drupal\field\FieldConfigInterface'); @@ -118,21 +387,10 @@ public function testFieldSqlSchemaForEntityWithStringIdentifier() { public function testCreate() { $language_manager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface'); $module_handler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface'); - $entity_manager = $this->getMock('Drupal\Core\Entity\EntityManagerInterface'); - // @todo Add field definitions to test default values of fields. - $definitions = array(); - $entity_manager->expects($this->once()) - ->method('getBaseFieldDefinitions') - ->will($this->returnValue($definitions)); - // ContentEntityStorageBase iterates over the entity which calls this method - // internally in ContentEntityBase::getProperties(). - $entity_manager->expects($this->once()) - ->method('getFieldDefinitions') - ->will($this->returnValue($definitions)); $container = new ContainerBuilder(); $container->set('language_manager', $language_manager); - $container->set('entity.manager', $entity_manager); + $container->set('entity.manager', $this->entityManager); $container->set('module_handler', $module_handler); \Drupal::setContainer($container); @@ -140,35 +398,33 @@ public function testCreate() { ->disableOriginalConstructor() ->setMethods(array('id')) ->getMockForAbstractClass(); - $entity_type = $this->getMock('Drupal\Core\Entity\EntityTypeInterface'); - $entity_type->expects($this->atLeastOnce()) - ->method('id') - ->will($this->returnValue('test_entity_type')); - $entity_type->expects($this->atLeastOnce()) + + $this->entityType->expects($this->atLeastOnce()) ->method('getClass') ->will($this->returnValue(get_class($entity))); - $entity_type->expects($this->atLeastOnce()) + $this->entityType->expects($this->atLeastOnce()) ->method('getKeys') ->will($this->returnValue(array('id' => 'id'))); - $entity_type->expects($this->atLeastOnce()) + $this->entityType->expects($this->atLeastOnce()) ->method('hasKey') ->will($this->returnCallback(function ($key) { return $key == 'id'; })); - $entity_manager->expects($this->atLeastOnce()) + + // ContentEntityStorageBase iterates over the entity which calls this method + // internally in ContentEntityBase::getProperties(). + $this->entityManager->expects($this->once()) + ->method('getFieldDefinitions') + ->will($this->returnValue(array())); + + $this->entityManager->expects($this->atLeastOnce()) ->method('getDefinition') - ->with('test_entity_type') - ->will($this->returnValue($entity_type)); + ->with($this->entityType->id()) + ->will($this->returnValue($this->entityType)); - $connection = $this->getMockBuilder('Drupal\Core\Database\Connection') - ->disableOriginalConstructor() - ->getMock(); - $field_info = $this->getMockBuilder('Drupal\field\FieldInfo') - ->disableOriginalConstructor() - ->getMock(); - $entity_storage = new ContentEntityDatabaseStorage($entity_type, $connection, $entity_manager, $field_info); + $this->setUpEntityStorage(); - $entity = $entity_storage->create(); + $entity = $this->entityStorage->create(); $entity->expects($this->atLeastOnce()) ->method('id') ->will($this->returnValue('foo')); @@ -178,4 +434,23 @@ public function testCreate() { $this->assertTrue($entity->isNew()); } + /** + * Sets up the content entity database storage. + */ + protected function setUpEntityStorage() { + $connection = $this->getMockBuilder('Drupal\Core\Database\Connection') + ->disableOriginalConstructor() + ->getMock(); + + $this->entityManager->expects($this->once()) + ->method('getBaseFieldDefinitions') + ->will($this->returnValue($this->fieldDefinitions)); + + $field_info = $this->getMockBuilder('Drupal\field\FieldInfo') + ->disableOriginalConstructor() + ->getMock(); + + $this->entityStorage = new ContentEntityDatabaseStorage($this->entityType, $connection, $this->entityManager, $field_info); + } + } diff --git a/core/tests/Drupal/Tests/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php b/core/tests/Drupal/Tests/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php index 3a63e22..f6e28bd 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Schema/ContentEntitySchemaHandlerTest.php @@ -230,8 +230,8 @@ public function testGetSchemaBase($uuid_key) { $this->setUpSchemaHandler(); $table_mapping = new DefaultTableMapping($this->storageDefinitions); - $table_mapping->addFieldColumns('entity_test', array_keys($this->storageDefinitions)); - $table_mapping->addExtraColumns('entity_test', array('default_langcode')); + $table_mapping->setFieldNames('entity_test', array_keys($this->storageDefinitions)); + $table_mapping->setExtraColumns('entity_test', array('default_langcode')); $this->storage->expects($this->once()) ->method('getTableMapping') @@ -399,8 +399,8 @@ public function testGetSchemaRevisionable() { $this->setUpSchemaHandler(); $table_mapping = new DefaultTableMapping($this->storageDefinitions); - $table_mapping->addFieldColumns('entity_test', array_keys($this->storageDefinitions)); - $table_mapping->addFieldColumns('entity_test_revision', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test_revision', array_keys($this->storageDefinitions)); $this->storage->expects($this->once()) ->method('getTableMapping') @@ -498,8 +498,8 @@ public function testGetSchemaTranslatable() { $this->setUpSchemaHandler(); $table_mapping = new DefaultTableMapping($this->storageDefinitions); - $table_mapping->addFieldColumns('entity_test', array_keys($this->storageDefinitions)); - $table_mapping->addFieldColumns('entity_test_field_data', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test_field_data', array_keys($this->storageDefinitions)); $this->storage->expects($this->once()) ->method('getTableMapping') @@ -602,10 +602,10 @@ public function testGetSchemaRevisionableTranslatable() { $this->setUpSchemaHandler(); $table_mapping = new DefaultTableMapping($this->storageDefinitions); - $table_mapping->addFieldColumns('entity_test', array_keys($this->storageDefinitions)); - $table_mapping->addFieldColumns('entity_test_revision', array_keys($this->storageDefinitions)); - $table_mapping->addFieldColumns('entity_test_field_data', array_keys($this->storageDefinitions)); - $table_mapping->addFieldColumns('entity_test_revision_field_data', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test_revision', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test_field_data', array_keys($this->storageDefinitions)); + $table_mapping->setFieldNames('entity_test_revision_field_data', array_keys($this->storageDefinitions)); $this->storage->expects($this->once()) ->method('getTableMapping') diff --git a/core/tests/Drupal/Tests/Core/Entity/Sql/DefaultTableMappingTest.php b/core/tests/Drupal/Tests/Core/Entity/Sql/DefaultTableMappingTest.php index 8eb1ac0..f6ac667 100644 --- a/core/tests/Drupal/Tests/Core/Entity/Sql/DefaultTableMappingTest.php +++ b/core/tests/Drupal/Tests/Core/Entity/Sql/DefaultTableMappingTest.php @@ -40,17 +40,17 @@ public function testGetTableNames() { $table_mapping = new DefaultTableMapping([]); $this->assertSame([], $table_mapping->getTableNames()); - $table_mapping->addFieldColumns('foo', []); + $table_mapping->setFieldNames('foo', []); $this->assertSame(['foo'], $table_mapping->getTableNames()); - $table_mapping->addFieldColumns('bar', []); + $table_mapping->setFieldNames('bar', []); $this->assertSame(['foo', 'bar'], $table_mapping->getTableNames()); - $table_mapping->addExtraColumns('baz', []); + $table_mapping->setExtraColumns('baz', []); $this->assertSame(['foo', 'bar', 'baz'], $table_mapping->getTableNames()); // Test that table names are not duplicated. - $table_mapping->addExtraColumns('foo', []); + $table_mapping->setExtraColumns('foo', []); $this->assertSame(['foo', 'bar', 'baz'], $table_mapping->getTableNames()); } @@ -60,10 +60,10 @@ public function testGetTableNames() { * @covers ::__construct() * @covers ::getAllColumns() * @covers ::getFieldNames() - * @covers ::getColumnMapping() - * @covers ::addFieldColumns() + * @covers ::getColumnNames() + * @covers ::setFieldNames() * @covers ::getExtraColumns() - * @covers ::addExtraColumns() + * @covers ::setExtraColumns() */ public function testGetAllColumns() { // Set up single-column and multi-column definitions. @@ -81,19 +81,19 @@ public function testGetAllColumns() { $this->assertSame($expected, $table_mapping->getAllColumns('test')); // Test adding field columns. - $table_mapping->addFieldColumns('test', ['id']); + $table_mapping->setFieldNames('test', ['id']); $expected = ['id']; $this->assertSame($expected, $table_mapping->getAllColumns('test')); - $table_mapping->addFieldColumns('test', ['id', 'name']); + $table_mapping->setFieldNames('test', ['id', 'name']); $expected = ['id', 'name']; $this->assertSame($expected, $table_mapping->getAllColumns('test')); - $table_mapping->addFieldColumns('test', ['id', 'name', 'type']); + $table_mapping->setFieldNames('test', ['id', 'name', 'type']); $expected = ['id', 'name', 'type']; $this->assertSame($expected, $table_mapping->getAllColumns('test')); - $table_mapping->addFieldColumns('test', [ + $table_mapping->setFieldNames('test', [ 'id', 'name', 'type', @@ -108,7 +108,7 @@ public function testGetAllColumns() { ]; $this->assertSame($expected, $table_mapping->getAllColumns('test')); - $table_mapping->addFieldColumns('test', [ + $table_mapping->setFieldNames('test', [ 'id', 'name', 'type', @@ -127,12 +127,12 @@ public function testGetAllColumns() { $this->assertSame($expected, $table_mapping->getAllColumns('test')); // Test adding extra columns. - $table_mapping->addFieldColumns('test', []); - $table_mapping->addExtraColumns('test', ['default_langcode']); + $table_mapping->setFieldNames('test', []); + $table_mapping->setExtraColumns('test', ['default_langcode']); $expected = ['default_langcode']; $this->assertSame($expected, $table_mapping->getAllColumns('test')); - $table_mapping->addExtraColumns('test', [ + $table_mapping->setExtraColumns('test', [ 'default_langcode', 'default_revision', ]); @@ -140,14 +140,14 @@ public function testGetAllColumns() { $this->assertSame($expected, $table_mapping->getAllColumns('test')); // Test adding both field and extra columns. - $table_mapping->addFieldColumns('test', [ + $table_mapping->setFieldNames('test', [ 'id', 'name', 'type', 'description', 'owner', ]); - $table_mapping->addExtraColumns('test', [ + $table_mapping->setExtraColumns('test', [ 'default_langcode', 'default_revision', ]); @@ -169,7 +169,7 @@ public function testGetAllColumns() { * Tests DefaultTableMapping::getFieldNames(). * * @covers ::getFieldNames() - * @covers ::addFieldColumns() + * @covers ::setFieldNames() */ public function testGetFieldNames() { // The storage definitions are only used in getColumnMapping() so we do not @@ -180,13 +180,13 @@ public function testGetFieldNames() { // fields have been added does not fail. $this->assertSame([], $table_mapping->getFieldNames('foo')); - $return = $table_mapping->addFieldColumns('foo', ['id', 'name', 'type']); + $return = $table_mapping->setFieldNames('foo', ['id', 'name', 'type']); $this->assertSame($table_mapping, $return); $expected = ['id', 'name', 'type']; $this->assertSame($expected, $table_mapping->getFieldNames('foo')); $this->assertSame([], $table_mapping->getFieldNames('bar')); - $return = $table_mapping->addFieldColumns('bar', ['description', 'owner']); + $return = $table_mapping->setFieldNames('bar', ['description', 'owner']); $this->assertSame($table_mapping, $return); $expected = ['description', 'owner']; $this->assertSame($expected, $table_mapping->getFieldNames('bar')); @@ -199,30 +199,30 @@ public function testGetFieldNames() { * Tests DefaultTableMapping::getColumnMapping(). * * @covers ::__construct() - * @covers ::getColumnMapping + * @covers ::getColumnNames */ - public function testGetColumnMapping() { + public function testGetColumnNames() { $definitions['test'] = $this->setUpDefinition([]); $table_mapping = new DefaultTableMapping($definitions); $expected = []; - $this->assertSame($expected, $table_mapping->getColumnMapping('test')); + $this->assertSame($expected, $table_mapping->getColumnNames('test')); $definitions['test'] = $this->setUpDefinition(['value']); $table_mapping = new DefaultTableMapping($definitions); $expected = ['value' => 'test']; - $this->assertSame($expected, $table_mapping->getColumnMapping('test')); + $this->assertSame($expected, $table_mapping->getColumnNames('test')); $definitions['test'] = $this->setUpDefinition(['value', 'format']); $table_mapping = new DefaultTableMapping($definitions); $expected = ['value' => 'test__value', 'format' => 'test__format']; - $this->assertSame($expected, $table_mapping->getColumnMapping('test')); + $this->assertSame($expected, $table_mapping->getColumnNames('test')); } /** * Tests DefaultTableMapping::getExtraColumns(). * * @covers ::getExtraColumns() - * @covers ::addExtraColumns() + * @covers ::setExtraColumns() */ public function testGetExtraColumns() { // The storage definitions are only used in getColumnMapping() so we do not @@ -233,13 +233,13 @@ public function testGetExtraColumns() { // fields have been added does not fail. $this->assertSame([], $table_mapping->getExtraColumns('foo')); - $return = $table_mapping->addExtraColumns('foo', ['id', 'name', 'type']); + $return = $table_mapping->setExtraColumns('foo', ['id', 'name', 'type']); $this->assertSame($table_mapping, $return); $expected = ['id', 'name', 'type']; $this->assertSame($expected, $table_mapping->getExtraColumns('foo')); $this->assertSame([], $table_mapping->getExtraColumns('bar')); - $return = $table_mapping->addExtraColumns('bar', ['description', 'owner']); + $return = $table_mapping->setExtraColumns('bar', ['description', 'owner']); $this->assertSame($table_mapping, $return); $expected = ['description', 'owner']; $this->assertSame($expected, $table_mapping->getExtraColumns('bar'));