View source
<?php
namespace Drupal\Tests\Core\Entity\Sql;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Entity\EntityStorageInterface;
use Drupal\Core\Entity\Sql\SqlContentEntityStorage;
use Drupal\Core\Language\Language;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\DependencyInjection\ContainerBuilder;
class SqlContentEntityStorageTest extends UnitTestCase {
protected $entityStorage;
protected $entityType;
protected $fieldDefinitions = array();
protected $entityManager;
protected $entityTypeId = 'entity_test';
protected $container;
protected $moduleHandler;
protected $cache;
protected $languageManager;
protected $connection;
protected function setUp() {
$this->entityType = $this
->getMock('Drupal\\Core\\Entity\\ContentEntityTypeInterface');
$this->entityType
->expects($this
->any())
->method('id')
->will($this
->returnValue($this->entityTypeId));
$this->container = new ContainerBuilder();
\Drupal::setContainer($this->container);
$this->entityManager = $this
->getMock('Drupal\\Core\\Entity\\EntityManagerInterface');
$this->moduleHandler = $this
->getMock('Drupal\\Core\\Extension\\ModuleHandlerInterface');
$this->cache = $this
->getMock('Drupal\\Core\\Cache\\CacheBackendInterface');
$this->languageManager = $this
->getMock('Drupal\\Core\\Language\\LanguageManagerInterface');
$this->languageManager
->expects($this
->any())
->method('getDefaultLanguage')
->will($this
->returnValue(new Language(array(
'langcode' => 'en',
))));
$this->connection = $this
->getMockBuilder('Drupal\\Core\\Database\\Connection')
->disableOriginalConstructor()
->getMock();
}
public function testGetBaseTable($base_table, $expected) {
$this->entityType
->expects($this
->once())
->method('getBaseTable')
->willReturn($base_table);
$this
->setUpEntityStorage();
$this
->assertSame($expected, $this->entityStorage
->getBaseTable());
}
public function providerTestGetBaseTable() {
return array(
array(
'entity_test',
'entity_test',
),
array(
NULL,
'entity_test',
),
);
}
public function testGetRevisionTable($revision_table, $expected) {
$this->entityType
->expects($this
->once())
->method('isRevisionable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->once())
->method('getRevisionTable')
->will($this
->returnValue($revision_table));
$this
->setUpEntityStorage();
$this
->assertSame($expected, $this->entityStorage
->getRevisionTable());
}
public function providerTestGetRevisionTable() {
return array(
array(
'entity_test_revision',
'entity_test_revision',
),
array(
NULL,
'entity_test_revision',
),
);
}
public function testGetDataTable() {
$this->entityType
->expects($this
->once())
->method('isTranslatable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->exactly(1))
->method('getDataTable')
->will($this
->returnValue('entity_test_field_data'));
$this
->setUpEntityStorage();
$this
->assertSame('entity_test_field_data', $this->entityStorage
->getDataTable());
}
public function testGetRevisionDataTable($revision_data_table, $expected) {
$this->entityType
->expects($this
->once())
->method('isRevisionable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->once())
->method('isTranslatable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->exactly(1))
->method('getDataTable')
->will($this
->returnValue('entity_test_field_data'));
$this->entityType
->expects($this
->once())
->method('getRevisionDataTable')
->will($this
->returnValue($revision_data_table));
$this
->setUpEntityStorage();
$actual = $this->entityStorage
->getRevisionDataTable();
$this
->assertSame($expected, $actual);
}
public function providerTestGetRevisionDataTable() {
return array(
array(
'entity_test_field_revision',
'entity_test_field_revision',
),
array(
NULL,
'entity_test_field_revision',
),
);
}
public function testOnEntityTypeCreate() {
$columns = array(
'value' => array(
'type' => 'int',
),
);
$this->fieldDefinitions = $this
->mockFieldDefinitions(array(
'id',
));
$this->fieldDefinitions['id']
->expects($this
->any())
->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(
array(
'id',
'id',
),
array(
'uuid',
NULL,
),
array(
'bundle',
NULL,
),
array(
'id' => 'id',
),
array(
'id' => 'id',
),
)));
$this
->setUpEntityStorage();
$expected = array(
'description' => 'The base table for entity_test entities.',
'fields' => array(
'id' => array(
'type' => 'serial',
'not null' => TRUE,
),
),
'primary key' => array(
'id',
),
'unique keys' => array(),
'indexes' => array(),
'foreign keys' => array(),
);
$schema_handler = $this
->getMockBuilder('Drupal\\Core\\Database\\Schema')
->disableOriginalConstructor()
->getMock();
$schema_handler
->expects($this
->any())
->method('createTable')
->with($this
->equalTo('entity_test'), $this
->equalTo($expected));
$this->connection
->expects($this
->once())
->method('schema')
->will($this
->returnValue($schema_handler));
$storage = $this
->getMockBuilder('Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage')
->setConstructorArgs(array(
$this->entityType,
$this->connection,
$this->entityManager,
$this->cache,
$this->languageManager,
))
->setMethods(array(
'getStorageSchema',
))
->getMock();
$key_value = $this
->getMock('Drupal\\Core\\KeyValueStore\\KeyValueStoreInterface');
$schema_handler = $this
->getMockBuilder('Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorageSchema')
->setConstructorArgs(array(
$this->entityManager,
$this->entityType,
$storage,
$this->connection,
))
->setMethods(array(
'installedStorageSchema',
'createSharedTableSchema',
))
->getMock();
$schema_handler
->expects($this
->any())
->method('installedStorageSchema')
->will($this
->returnValue($key_value));
$storage
->expects($this
->any())
->method('getStorageSchema')
->will($this
->returnValue($schema_handler));
$storage
->onEntityTypeCreate($this->entityType);
}
public function testGetTableMappingEmpty() {
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$this
->assertSame(array(
'entity_test',
), $mapping
->getTableNames());
$this
->assertSame(array(), $mapping
->getFieldNames('entity_test'));
$this
->assertSame(array(), $mapping
->getExtraColumns('entity_test'));
}
public function testGetTableMappingSimple(array $entity_keys) {
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$this
->assertEquals(array(
'entity_test',
), $mapping
->getTableNames());
$expected = array_values(array_filter($entity_keys));
$this
->assertEquals($expected, $mapping
->getFieldNames('entity_test'));
$this
->assertEquals(array(), $mapping
->getExtraColumns('entity_test'));
}
public function testGetTableMappingSimpleWithFields(array $entity_keys) {
$base_field_names = array(
'title',
'description',
'owner',
);
$field_names = array_merge(array_values(array_filter($entity_keys)), $base_field_names);
$this->fieldDefinitions = $this
->mockFieldDefinitions($field_names);
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$this
->assertEquals(array(
'entity_test',
), $mapping
->getTableNames());
$this
->assertEquals($field_names, $mapping
->getFieldNames('entity_test'));
$this
->assertEquals(array(), $mapping
->getExtraColumns('entity_test'));
}
public function providerTestGetTableMappingSimple() {
return array(
array(
array(
'id' => 'test_id',
'bundle' => NULL,
'uuid' => NULL,
),
),
array(
array(
'id' => 'test_id',
'bundle' => 'test_bundle',
'uuid' => NULL,
),
),
array(
array(
'id' => 'test_id',
'bundle' => NULL,
'uuid' => 'test_uuid',
),
),
array(
array(
'id' => 'test_id',
'bundle' => 'test_bundle',
'uuid' => 'test_uuid',
),
),
);
}
public function testGetTableMappingRevisionable(array $entity_keys) {
$entity_keys = array(
'id' => $entity_keys['id'],
'revision' => 'test_revision',
'bundle' => $entity_keys['bundle'],
'uuid' => $entity_keys['uuid'],
);
$this->entityType
->expects($this
->exactly(2))
->method('isRevisionable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
array(
'revision',
$entity_keys['revision'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$expected = array(
'entity_test',
'entity_test_revision',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$expected = array_values(array_filter($entity_keys));
$this
->assertEquals($expected, $mapping
->getFieldNames('entity_test'));
$expected = array(
$entity_keys['id'],
$entity_keys['revision'],
);
$this
->assertEquals($expected, $mapping
->getFieldNames('entity_test_revision'));
$this
->assertEquals(array(), $mapping
->getExtraColumns('entity_test'));
$this
->assertEquals(array(), $mapping
->getExtraColumns('entity_test_revision'));
}
public function testGetTableMappingRevisionableWithFields(array $entity_keys) {
$entity_keys = array(
'id' => $entity_keys['id'],
'revision' => 'test_revision',
'bundle' => $entity_keys['bundle'],
'uuid' => $entity_keys['uuid'],
);
$test_cases = array(
array(),
array(
'revision_timestamp',
),
array(
'revision_uid',
),
array(
'revision_log',
),
array(
'revision_timestamp',
'revision_uid',
),
array(
'revision_timestamp',
'revision_log',
),
array(
'revision_uid',
'revision_log',
),
array(
'revision_timestamp',
'revision_uid',
'revision_log',
),
);
foreach ($test_cases as $revision_metadata_field_names) {
$this
->setUp();
$base_field_names = array(
'title',
);
$field_names = array_merge(array_values(array_filter($entity_keys)), $base_field_names);
$this->fieldDefinitions = $this
->mockFieldDefinitions($field_names);
$revisionable_field_names = array(
'description',
'owner',
);
$field_names = array_merge($field_names, $revisionable_field_names);
$this->fieldDefinitions += $this
->mockFieldDefinitions(array_merge($revisionable_field_names, $revision_metadata_field_names), array(
'isRevisionable' => TRUE,
));
$this->entityType
->expects($this
->exactly(2))
->method('isRevisionable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
array(
'revision',
$entity_keys['revision'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$expected = array(
'entity_test',
'entity_test_revision',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$this
->assertEquals($field_names, $mapping
->getFieldNames('entity_test'));
$expected = array_merge(array(
$entity_keys['id'],
$entity_keys['revision'],
), $revisionable_field_names, $revision_metadata_field_names);
$this
->assertEquals($expected, $mapping
->getFieldNames('entity_test_revision'));
$this
->assertEquals(array(), $mapping
->getExtraColumns('entity_test'));
$this
->assertEquals(array(), $mapping
->getExtraColumns('entity_test_revision'));
}
}
public function testGetTableMappingTranslatable(array $entity_keys) {
$entity_keys['langcode'] = 'langcode';
$this->entityType
->expects($this
->atLeastOnce())
->method('isTranslatable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('getDataTable')
->will($this
->returnValue('entity_test_field_data'));
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
array(
'langcode',
$entity_keys['langcode'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$expected = array(
'entity_test',
'entity_test_field_data',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$expected = array_values(array_filter($entity_keys));
$actual = $mapping
->getFieldNames('entity_test');
$this
->assertEquals($expected, $actual);
$expected = array_values(array_filter(array(
$entity_keys['id'],
$entity_keys['bundle'],
$entity_keys['langcode'],
)));
$actual = $mapping
->getFieldNames('entity_test_field_data');
$this
->assertEquals($expected, $actual);
$expected = array();
$actual = $mapping
->getExtraColumns('entity_test');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_field_data');
$this
->assertEquals($expected, $actual);
}
public function testGetTableMappingTranslatableWithFields(array $entity_keys) {
$entity_keys['langcode'] = 'langcode';
$base_field_names = array(
'title',
'description',
'owner',
);
$field_names = array_merge(array_values(array_filter($entity_keys)), $base_field_names);
$this->fieldDefinitions = $this
->mockFieldDefinitions($field_names);
$this->entityType
->expects($this
->atLeastOnce())
->method('isTranslatable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('getDataTable')
->will($this
->returnValue('entity_test_field_data'));
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
array(
'langcode',
$entity_keys['langcode'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$expected = array(
'entity_test',
'entity_test_field_data',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$expected = array_values(array_filter($entity_keys));
$actual = $mapping
->getFieldNames('entity_test');
$this
->assertEquals($expected, $actual);
$expected = array_merge(array_filter(array(
$entity_keys['id'],
$entity_keys['bundle'],
$entity_keys['langcode'],
)), $base_field_names);
$actual = $mapping
->getFieldNames('entity_test_field_data');
$this
->assertEquals($expected, $actual);
$expected = array();
$actual = $mapping
->getExtraColumns('entity_test');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_field_data');
$this
->assertEquals($expected, $actual);
}
public function testGetTableMappingRevisionableTranslatable(array $entity_keys) {
$entity_keys = array(
'id' => $entity_keys['id'],
'revision' => 'test_revision',
'bundle' => $entity_keys['bundle'],
'uuid' => $entity_keys['uuid'],
'langcode' => 'langcode',
);
$this->entityType
->expects($this
->atLeastOnce())
->method('isRevisionable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('isTranslatable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('getDataTable')
->will($this
->returnValue('entity_test_field_data'));
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
array(
'revision',
$entity_keys['revision'],
),
array(
'langcode',
$entity_keys['langcode'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$expected = array(
'entity_test',
'entity_test_field_data',
'entity_test_revision',
'entity_test_field_revision',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$expected = array_values(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['bundle'],
$entity_keys['uuid'],
$entity_keys['langcode'],
)));
$actual = $mapping
->getFieldNames('entity_test');
$this
->assertEquals($expected, $actual);
$expected = array_values(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['langcode'],
)));
$actual = $mapping
->getFieldNames('entity_test_revision');
$this
->assertEquals($expected, $actual);
$expected = array_values(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['bundle'],
$entity_keys['langcode'],
)));
$actual = $mapping
->getFieldNames('entity_test_field_data');
$this
->assertEquals($expected, $actual);
$expected = array_values(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['langcode'],
)));
$actual = $mapping
->getFieldNames('entity_test_field_revision');
$this
->assertEquals($expected, $actual);
$expected = array();
$actual = $mapping
->getExtraColumns('entity_test');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_revision');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_field_data');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_field_revision');
$this
->assertEquals($expected, $actual);
}
public function testGetTableMappingRevisionableTranslatableWithFields(array $entity_keys) {
$entity_keys = array(
'id' => $entity_keys['id'],
'revision' => 'test_revision',
'bundle' => $entity_keys['bundle'],
'uuid' => $entity_keys['uuid'],
'langcode' => 'langcode',
);
$test_cases = array(
array(),
array(
'revision_timestamp',
),
array(
'revision_uid',
),
array(
'revision_log',
),
array(
'revision_timestamp',
'revision_uid',
),
array(
'revision_timestamp',
'revision_log',
),
array(
'revision_uid',
'revision_log',
),
array(
'revision_timestamp',
'revision_uid',
'revision_log',
),
);
foreach ($test_cases as $revision_metadata_field_names) {
$this
->setUp();
$base_field_names = array(
'title',
);
$field_names = array_merge(array_values(array_filter($entity_keys)), $base_field_names);
$this->fieldDefinitions = $this
->mockFieldDefinitions($field_names);
$revisionable_field_names = array(
'description',
'owner',
);
$this->fieldDefinitions += $this
->mockFieldDefinitions(array_merge($revisionable_field_names, $revision_metadata_field_names), array(
'isRevisionable' => TRUE,
));
$this->entityType
->expects($this
->atLeastOnce())
->method('isRevisionable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('isTranslatable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('getDataTable')
->will($this
->returnValue('entity_test_field_data'));
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
$entity_keys['id'],
),
array(
'uuid',
$entity_keys['uuid'],
),
array(
'bundle',
$entity_keys['bundle'],
),
array(
'revision',
$entity_keys['revision'],
),
array(
'langcode',
$entity_keys['langcode'],
),
)));
$this
->setUpEntityStorage();
$mapping = $this->entityStorage
->getTableMapping();
$expected = array(
'entity_test',
'entity_test_field_data',
'entity_test_revision',
'entity_test_field_revision',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$expected = array(
'entity_test',
'entity_test_field_data',
'entity_test_revision',
'entity_test_field_revision',
);
$this
->assertEquals($expected, $mapping
->getTableNames());
$expected = array_values(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['bundle'],
$entity_keys['uuid'],
$entity_keys['langcode'],
)));
$actual = $mapping
->getFieldNames('entity_test');
$this
->assertEquals($expected, $actual);
$expected = array_merge(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['langcode'],
)), $revision_metadata_field_names);
$actual = $mapping
->getFieldNames('entity_test_revision');
$this
->assertEquals($expected, $actual);
$expected = array_merge(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['bundle'],
$entity_keys['langcode'],
)), $base_field_names, $revisionable_field_names);
$actual = $mapping
->getFieldNames('entity_test_field_data');
$this
->assertEquals($expected, $actual);
$expected = array_merge(array_filter(array(
$entity_keys['id'],
$entity_keys['revision'],
$entity_keys['langcode'],
)), $revisionable_field_names);
$actual = $mapping
->getFieldNames('entity_test_field_revision');
$this
->assertEquals($expected, $actual);
$expected = array();
$actual = $mapping
->getExtraColumns('entity_test');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_revision');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_field_data');
$this
->assertEquals($expected, $actual);
$actual = $mapping
->getExtraColumns('entity_test_field_revision');
$this
->assertEquals($expected, $actual);
}
}
public function testCreate() {
$language_manager = $this
->getMock('Drupal\\Core\\Language\\LanguageManagerInterface');
$language = new Language(array(
'id' => 'en',
));
$language_manager
->expects($this
->any())
->method('getCurrentLanguage')
->will($this
->returnValue($language));
$this->container
->set('language_manager', $language_manager);
$this->container
->set('entity.manager', $this->entityManager);
$this->container
->set('module_handler', $this->moduleHandler);
$entity = $this
->getMockBuilder('Drupal\\Core\\Entity\\ContentEntityBase')
->disableOriginalConstructor()
->setMethods(array(
'id',
))
->getMockForAbstractClass();
$this->entityType
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue($this->entityTypeId));
$this->entityType
->expects($this
->atLeastOnce())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this->entityType
->expects($this
->atLeastOnce())
->method('getKeys')
->will($this
->returnValue(array(
'id' => 'id',
)));
$this->entityManager
->expects($this
->once())
->method('getFieldDefinitions')
->will($this
->returnValue(array()));
$this->entityType
->expects($this
->atLeastOnce())
->method('isRevisionable')
->will($this
->returnValue(FALSE));
$this->entityManager
->expects($this
->atLeastOnce())
->method('getDefinition')
->with($this->entityType
->id())
->will($this
->returnValue($this->entityType));
$this
->setUpEntityStorage();
$entity = $this->entityStorage
->create();
$entity
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue('foo'));
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame('foo', $entity
->id());
$this
->assertTrue($entity
->isNew());
}
protected function mockFieldDefinitions(array $field_names, $methods = array()) {
$field_definitions = array();
$definition = $this
->getMock('Drupal\\Tests\\Core\\Field\\TestBaseFieldDefinitionInterface');
$methods += array(
'isBaseField' => TRUE,
);
foreach ($methods as $method => $result) {
$definition
->expects($this
->any())
->method($method)
->will($this
->returnValue($result));
}
foreach ($field_names as $field_name) {
$field_definitions[$field_name] = clone $definition;
$field_definitions[$field_name]
->expects($this
->any())
->method('getName')
->will($this
->returnValue($field_name));
}
return $field_definitions;
}
protected function setUpEntityStorage() {
$this->connection = $this
->getMockBuilder('Drupal\\Core\\Database\\Connection')
->disableOriginalConstructor()
->getMock();
$this->entityManager
->expects($this
->any())
->method('getDefinition')
->will($this
->returnValue($this->entityType));
$this->entityManager
->expects($this
->any())
->method('getFieldStorageDefinitions')
->will($this
->returnValue($this->fieldDefinitions));
$this->entityManager
->expects($this
->any())
->method('getBaseFieldDefinitions')
->will($this
->returnValue($this->fieldDefinitions));
$this->entityStorage = new SqlContentEntityStorage($this->entityType, $this->connection, $this->entityManager, $this->cache, $this->languageManager);
}
public function testLoadMultiplePersistentCached() {
$this
->setUpModuleHandlerNoImplementations();
$key = 'values:' . $this->entityTypeId . ':1';
$id = 1;
$entity = $this
->getMockBuilder('\\Drupal\\Tests\\Core\\Entity\\Sql\\SqlContentEntityStorageTestEntityInterface')
->getMockForAbstractClass();
$entity
->expects($this
->any())
->method('id')
->will($this
->returnValue($id));
$this->entityType
->expects($this
->atLeastOnce())
->method('isPersistentlyCacheable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue($this->entityTypeId));
$this->entityType
->expects($this
->atLeastOnce())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this->cache
->expects($this
->once())
->method('getMultiple')
->with(array(
$key,
))
->will($this
->returnValue(array(
$key => (object) array(
'data' => $entity,
),
)));
$this->cache
->expects($this
->never())
->method('set');
$this
->setUpEntityStorage();
$entities = $this->entityStorage
->loadMultiple(array(
$id,
));
$this
->assertEquals($entity, $entities[$id]);
}
public function testLoadMultipleNoPersistentCache() {
$this
->setUpModuleHandlerNoImplementations();
$id = 1;
$entity = $this
->getMockBuilder('\\Drupal\\Tests\\Core\\Entity\\Sql\\SqlContentEntityStorageTestEntityInterface')
->getMockForAbstractClass();
$entity
->expects($this
->any())
->method('id')
->will($this
->returnValue($id));
$this->entityType
->expects($this
->any())
->method('isPersistentlyCacheable')
->will($this
->returnValue(FALSE));
$this->entityType
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue($this->entityTypeId));
$this->entityType
->expects($this
->atLeastOnce())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this->cache
->expects($this
->never())
->method('getMultiple');
$this->cache
->expects($this
->never())
->method('set');
$entity_storage = $this
->getMockBuilder('Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage')
->setConstructorArgs(array(
$this->entityType,
$this->connection,
$this->entityManager,
$this->cache,
$this->languageManager,
))
->setMethods(array(
'getFromStorage',
'invokeStorageLoadHook',
))
->getMock();
$entity_storage
->method('invokeStorageLoadHook')
->willReturn(NULL);
$entity_storage
->expects($this
->once())
->method('getFromStorage')
->with(array(
$id,
))
->will($this
->returnValue(array(
$id => $entity,
)));
$entities = $entity_storage
->loadMultiple(array(
$id,
));
$this
->assertEquals($entity, $entities[$id]);
}
public function testLoadMultiplePersistentCacheMiss() {
$this
->setUpModuleHandlerNoImplementations();
$id = 1;
$entity = $this
->getMockBuilder('\\Drupal\\Tests\\Core\\Entity\\Sql\\SqlContentEntityStorageTestEntityInterface')
->getMockForAbstractClass();
$entity
->expects($this
->any())
->method('id')
->will($this
->returnValue($id));
$this->entityType
->expects($this
->any())
->method('isPersistentlyCacheable')
->will($this
->returnValue(TRUE));
$this->entityType
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue($this->entityTypeId));
$this->entityType
->expects($this
->atLeastOnce())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$key = 'values:' . $this->entityTypeId . ':1';
$this->cache
->expects($this
->once())
->method('getMultiple')
->with(array(
$key,
))
->will($this
->returnValue(array()));
$this->cache
->expects($this
->once())
->method('set')
->with($key, $entity, CacheBackendInterface::CACHE_PERMANENT, array(
$this->entityTypeId . '_values',
'entity_field_info',
));
$entity_storage = $this
->getMockBuilder('Drupal\\Core\\Entity\\Sql\\SqlContentEntityStorage')
->setConstructorArgs(array(
$this->entityType,
$this->connection,
$this->entityManager,
$this->cache,
$this->languageManager,
))
->setMethods(array(
'getFromStorage',
'invokeStorageLoadHook',
))
->getMock();
$entity_storage
->method('invokeStorageLoadHook')
->willReturn(NULL);
$entity_storage
->expects($this
->once())
->method('getFromStorage')
->with(array(
$id,
))
->will($this
->returnValue(array(
$id => $entity,
)));
$entities = $entity_storage
->loadMultiple(array(
$id,
));
$this
->assertEquals($entity, $entities[$id]);
}
public function testHasData() {
$query = $this
->getMock('Drupal\\Core\\Entity\\Query\\QueryInterface');
$query
->expects($this
->once())
->method('accessCheck')
->with(FALSE)
->willReturn($query);
$query
->expects($this
->once())
->method('range')
->with(0, 1)
->willReturn($query);
$query
->expects($this
->once())
->method('execute')
->willReturn(array(
5,
));
$factory = $this
->getMockBuilder('Drupal\\Core\\Entity\\Query\\QueryFactory')
->disableOriginalConstructor()
->getMock();
$factory
->expects($this
->once())
->method('get')
->with($this->entityType, 'AND')
->willReturn($query);
$this->container
->set('entity.query.sql', $factory);
$database = $this
->getMockBuilder('Drupal\\Core\\Database\\Connection')
->disableOriginalConstructor()
->getMock();
$this->entityManager
->expects($this
->any())
->method('getDefinition')
->will($this
->returnValue($this->entityType));
$this->entityManager
->expects($this
->any())
->method('getFieldStorageDefinitions')
->will($this
->returnValue($this->fieldDefinitions));
$this->entityManager
->expects($this
->any())
->method('getBaseFieldDefinitions')
->will($this
->returnValue($this->fieldDefinitions));
$this->entityStorage = new SqlContentEntityStorage($this->entityType, $database, $this->entityManager, $this->cache, $this->languageManager);
$result = $this->entityStorage
->hasData();
$this
->assertTrue($result, 'hasData returned TRUE');
}
public function testCleanIds() {
$valid_ids = array(
-1,
0,
1,
'-1',
'0',
'1',
0123,
-0x1a,
0x1afc,
-0b111,
0b101,
'0123',
'00123',
'000123',
'-0123',
'-00123',
'-000123',
-10.0,
-1.0,
0.0,
1.0,
10.0,
-10.0,
-1.0,
0.0,
1.0,
10.0,
);
$this->fieldDefinitions = $this
->mockFieldDefinitions(array(
'id',
));
$this->fieldDefinitions['id']
->expects($this
->any())
->method('getType')
->will($this
->returnValue('integer'));
$this
->setUpEntityStorage();
$this->entityType
->expects($this
->any())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
'id',
),
)));
$method = new \ReflectionMethod($this->entityStorage, 'cleanIds');
$method
->setAccessible(TRUE);
$this
->assertEquals($valid_ids, $method
->invoke($this->entityStorage, $valid_ids));
$invalid_ids = array(
'--1',
'-0x1A',
'0x1AFC',
'-0b111',
'0b101',
'a',
FALSE,
TRUE,
NULL,
'32acb',
123.123,
123.678,
);
$this
->assertEquals(array(), $method
->invoke($this->entityStorage, $invalid_ids));
}
protected function setUpModuleHandlerNoImplementations() {
$this->moduleHandler
->expects($this
->any())
->method('getImplementations')
->will($this
->returnValueMap(array(
array(
'entity_load',
array(),
),
array(
$this->entityTypeId . '_load',
array(),
),
)));
$this->container
->set('module_handler', $this->moduleHandler);
}
}
abstract class SqlContentEntityStorageTestEntityInterface implements EntityInterface {
public static function postLoad(EntityStorageInterface $storage, array &$entities) {
}
}