View source
<?php
namespace Drupal\Tests\Core\Entity\KeyValueStore {
use Drupal\Core\Config\Entity\ConfigEntityInterface;
use Drupal\Core\DependencyInjection\ContainerBuilder;
use Drupal\Core\Entity\EntityInterface;
use Drupal\Core\Language\Language;
use Drupal\Tests\UnitTestCase;
use Drupal\Core\Entity\KeyValueStore\KeyValueEntityStorage;
class KeyValueEntityStorageTest extends UnitTestCase {
protected $entityType;
protected $keyValueStore;
protected $moduleHandler;
protected $uuidService;
protected $languageManager;
protected $entityStorage;
protected $entityManager;
protected $cacheTagsInvalidator;
protected function setUp() {
parent::setUp();
$this->entityType = $this
->getMock('Drupal\\Core\\Entity\\EntityTypeInterface');
}
protected function setUpKeyValueEntityStorage($uuid_key = 'uuid') {
$this->entityType
->expects($this
->atLeastOnce())
->method('getKey')
->will($this
->returnValueMap(array(
array(
'id',
'id',
),
array(
'uuid',
$uuid_key,
),
array(
'langcode',
'langcode',
),
)));
$this->entityType
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue('test_entity_type'));
$this->entityType
->expects($this
->any())
->method('getListCacheTags')
->willReturn(array(
'test_entity_type_list',
));
$this->entityManager = $this
->getMock('Drupal\\Core\\Entity\\EntityManagerInterface');
$this->entityManager
->expects($this
->any())
->method('getDefinition')
->with('test_entity_type')
->will($this
->returnValue($this->entityType));
$this->cacheTagsInvalidator = $this
->getMock('Drupal\\Core\\Cache\\CacheTagsInvalidatorInterface');
$this->keyValueStore = $this
->getMock('Drupal\\Core\\KeyValueStore\\KeyValueStoreInterface');
$this->moduleHandler = $this
->getMock('Drupal\\Core\\Extension\\ModuleHandlerInterface');
$this->uuidService = $this
->getMock('Drupal\\Component\\Uuid\\UuidInterface');
$this->languageManager = $this
->getMock('Drupal\\Core\\Language\\LanguageManagerInterface');
$language = new Language(array(
'langcode' => 'en',
));
$this->languageManager
->expects($this
->any())
->method('getDefaultLanguage')
->will($this
->returnValue($language));
$this->languageManager
->expects($this
->any())
->method('getCurrentLanguage')
->will($this
->returnValue($language));
$this->entityStorage = new KeyValueEntityStorage($this->entityType, $this->keyValueStore, $this->uuidService, $this->languageManager);
$this->entityStorage
->setModuleHandler($this->moduleHandler);
$container = new ContainerBuilder();
$container
->set('entity.manager', $this->entityManager);
$container
->set('language_manager', $this->languageManager);
$container
->set('cache_tags.invalidator', $this->cacheTagsInvalidator);
\Drupal::setContainer($container);
}
public function testCreateWithPredefinedUuid() {
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($this
->getMockEntity())));
$this
->setUpKeyValueEntityStorage();
$this->moduleHandler
->expects($this
->at(0))
->method('invokeAll')
->with('test_entity_type_create');
$this->moduleHandler
->expects($this
->at(1))
->method('invokeAll')
->with('entity_create');
$this->uuidService
->expects($this
->never())
->method('generate');
$entity = $this->entityStorage
->create(array(
'id' => 'foo',
'uuid' => 'baz',
));
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame('foo', $entity
->id());
$this
->assertSame('baz', $entity
->uuid());
}
public function testCreateWithoutUuidKey() {
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($this
->getMockEntity())));
$this
->setUpKeyValueEntityStorage(NULL);
$this->moduleHandler
->expects($this
->at(0))
->method('invokeAll')
->with('test_entity_type_create');
$this->moduleHandler
->expects($this
->at(1))
->method('invokeAll')
->with('entity_create');
$this->uuidService
->expects($this
->never())
->method('generate');
$entity = $this->entityStorage
->create(array(
'id' => 'foo',
'uuid' => 'baz',
));
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame('foo', $entity
->id());
$this
->assertSame('baz', $entity
->uuid());
}
public function testCreate() {
$entity = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(), array(
'toArray',
));
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this
->setUpKeyValueEntityStorage();
$this->moduleHandler
->expects($this
->at(0))
->method('invokeAll')
->with('test_entity_type_create');
$this->moduleHandler
->expects($this
->at(1))
->method('invokeAll')
->with('entity_create');
$this->uuidService
->expects($this
->once())
->method('generate')
->will($this
->returnValue('bar'));
$entity = $this->entityStorage
->create(array(
'id' => 'foo',
));
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame('foo', $entity
->id());
$this
->assertSame('bar', $entity
->uuid());
return $entity;
}
public function testSaveInsert(EntityInterface $entity) {
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this
->setUpKeyValueEntityStorage();
$expected = array(
'id' => 'foo',
);
$this->keyValueStore
->expects($this
->exactly(2))
->method('has')
->with('foo')
->will($this
->returnValue(FALSE));
$this->keyValueStore
->expects($this
->never())
->method('getMultiple');
$this->keyValueStore
->expects($this
->never())
->method('delete');
$entity
->expects($this
->atLeastOnce())
->method('toArray')
->will($this
->returnValue($expected));
$this->moduleHandler
->expects($this
->at(0))
->method('invokeAll')
->with('test_entity_type_presave');
$this->moduleHandler
->expects($this
->at(1))
->method('invokeAll')
->with('entity_presave');
$this->moduleHandler
->expects($this
->at(2))
->method('invokeAll')
->with('test_entity_type_insert');
$this->moduleHandler
->expects($this
->at(3))
->method('invokeAll')
->with('entity_insert');
$this->keyValueStore
->expects($this
->once())
->method('set')
->with('foo', $expected);
$return = $this->entityStorage
->save($entity);
$this
->assertSame(SAVED_NEW, $return);
return $entity;
}
public function testSaveUpdate(EntityInterface $entity) {
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this
->setUpKeyValueEntityStorage();
$expected = array(
'id' => 'foo',
);
$this->keyValueStore
->expects($this
->exactly(2))
->method('has')
->with('foo')
->will($this
->returnValue(TRUE));
$this->keyValueStore
->expects($this
->once())
->method('getMultiple')
->with(array(
'foo',
))
->will($this
->returnValue(array(
array(
'id' => 'foo',
),
)));
$this->keyValueStore
->expects($this
->never())
->method('delete');
$this->moduleHandler
->expects($this
->at(0))
->method('getImplementations')
->with('entity_load')
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->at(1))
->method('getImplementations')
->with('test_entity_type_load')
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->at(2))
->method('invokeAll')
->with('test_entity_type_presave');
$this->moduleHandler
->expects($this
->at(3))
->method('invokeAll')
->with('entity_presave');
$this->moduleHandler
->expects($this
->at(4))
->method('invokeAll')
->with('test_entity_type_update');
$this->moduleHandler
->expects($this
->at(5))
->method('invokeAll')
->with('entity_update');
$this->keyValueStore
->expects($this
->once())
->method('set')
->with('foo', $expected);
$return = $this->entityStorage
->save($entity);
$this
->assertSame(SAVED_UPDATED, $return);
return $entity;
}
public function testSaveConfigEntity() {
$this
->setUpKeyValueEntityStorage();
$entity = $this
->getMockEntity('Drupal\\Core\\Config\\Entity\\ConfigEntityBase', array(
array(
'id' => 'foo',
),
), array(
'toArray',
'preSave',
));
$entity
->enforceIsNew();
$this
->assertSame('foo', $entity
->getOriginalId());
$expected = array(
'id' => 'foo',
);
$entity
->expects($this
->once())
->method('toArray')
->will($this
->returnValue($expected));
$this->keyValueStore
->expects($this
->exactly(2))
->method('has')
->with('foo')
->will($this
->returnValue(FALSE));
$this->keyValueStore
->expects($this
->once())
->method('set')
->with('foo', $expected);
$this->keyValueStore
->expects($this
->never())
->method('delete');
$return = $this->entityStorage
->save($entity);
$this
->assertSame(SAVED_NEW, $return);
return $entity;
}
public function testSaveRenameConfigEntity(ConfigEntityInterface $entity) {
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this
->setUpKeyValueEntityStorage();
$this->moduleHandler
->expects($this
->at(0))
->method('getImplementations')
->with('entity_load')
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->at(1))
->method('getImplementations')
->with('test_entity_type_load')
->will($this
->returnValue(array()));
$expected = array(
'id' => 'foo',
);
$entity
->expects($this
->once())
->method('toArray')
->will($this
->returnValue($expected));
$this->keyValueStore
->expects($this
->exactly(2))
->method('has')
->with('foo')
->will($this
->returnValue(TRUE));
$this->keyValueStore
->expects($this
->once())
->method('getMultiple')
->with(array(
'foo',
))
->will($this
->returnValue(array(
array(
'id' => 'foo',
),
)));
$this->keyValueStore
->expects($this
->once())
->method('delete')
->with('foo');
$this->keyValueStore
->expects($this
->once())
->method('set')
->with('bar', $expected);
$this
->assertSame('foo', $entity
->getOriginalId());
$entity
->set('id', 'bar');
$this
->assertSame('foo', $entity
->getOriginalId());
$return = $this->entityStorage
->save($entity);
$this
->assertSame(SAVED_UPDATED, $return);
$this
->assertSame('bar', $entity
->getOriginalId());
}
public function testSaveContentEntity() {
$this->entityType
->expects($this
->any())
->method('getKeys')
->will($this
->returnValue(array(
'id' => 'id',
)));
$this
->setUpKeyValueEntityStorage();
$expected = array(
'id' => 'foo',
);
$this->keyValueStore
->expects($this
->exactly(2))
->method('has')
->with('foo')
->will($this
->returnValue(FALSE));
$this->keyValueStore
->expects($this
->once())
->method('set')
->with('foo', $expected);
$this->keyValueStore
->expects($this
->never())
->method('delete');
$entity = $this
->getMockEntity('Drupal\\Core\\Entity\\ContentEntityBase', array(), array(
'toArray',
'id',
));
$entity
->expects($this
->atLeastOnce())
->method('id')
->will($this
->returnValue('foo'));
$entity
->expects($this
->once())
->method('toArray')
->will($this
->returnValue($expected));
$this->entityStorage
->save($entity);
}
public function testSaveInvalid() {
$this
->setUpKeyValueEntityStorage();
$entity = $this
->getMockEntity('Drupal\\Core\\Config\\Entity\\ConfigEntityBase');
$this->entityStorage
->save($entity);
$this->keyValueStore
->expects($this
->never())
->method('has');
$this->keyValueStore
->expects($this
->never())
->method('set');
$this->keyValueStore
->expects($this
->never())
->method('delete');
}
public function testSaveDuplicate() {
$this
->setUpKeyValueEntityStorage();
$entity = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(
array(
'id' => 'foo',
),
));
$entity
->enforceIsNew();
$this->keyValueStore
->expects($this
->once())
->method('has')
->will($this
->returnValue(TRUE));
$this->keyValueStore
->expects($this
->never())
->method('set');
$this->keyValueStore
->expects($this
->never())
->method('delete');
$this->entityStorage
->save($entity);
}
public function testLoad() {
$entity = $this
->getMockEntity();
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this
->setUpKeyValueEntityStorage();
$this->keyValueStore
->expects($this
->once())
->method('getMultiple')
->with(array(
'foo',
))
->will($this
->returnValue(array(
array(
'id' => 'foo',
),
)));
$this->moduleHandler
->expects($this
->at(0))
->method('getImplementations')
->with('entity_load')
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->at(1))
->method('getImplementations')
->with('test_entity_type_load')
->will($this
->returnValue(array()));
$entity = $this->entityStorage
->load('foo');
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame('foo', $entity
->id());
}
public function testLoadMissingEntity() {
$this->entityType
->expects($this
->once())
->method('getClass');
$this
->setUpKeyValueEntityStorage();
$this->keyValueStore
->expects($this
->once())
->method('getMultiple')
->with(array(
'foo',
))
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->never())
->method('getImplementations');
$entity = $this->entityStorage
->load('foo');
$this
->assertNull($entity);
}
public function testLoadMultipleAll() {
$expected['foo'] = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(
array(
'id' => 'foo',
),
));
$expected['bar'] = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(
array(
'id' => 'bar',
),
));
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class(reset($expected))));
$this
->setUpKeyValueEntityStorage();
$this->keyValueStore
->expects($this
->once())
->method('getAll')
->will($this
->returnValue(array(
array(
'id' => 'foo',
),
array(
'id' => 'bar',
),
)));
$this->moduleHandler
->expects($this
->at(0))
->method('getImplementations')
->with('entity_load')
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->at(1))
->method('getImplementations')
->with('test_entity_type_load')
->will($this
->returnValue(array()));
$entities = $this->entityStorage
->loadMultiple();
foreach ($entities as $id => $entity) {
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame($id, $entity
->id());
$this
->assertSame($id, $expected[$id]
->id());
}
}
public function testLoadMultipleIds() {
$entity = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(
array(
'id' => 'foo',
),
));
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class($entity)));
$this
->setUpKeyValueEntityStorage();
$expected[] = $entity;
$this->keyValueStore
->expects($this
->once())
->method('getMultiple')
->with(array(
'foo',
))
->will($this
->returnValue(array(
array(
'id' => 'foo',
),
)));
$this->moduleHandler
->expects($this
->at(0))
->method('getImplementations')
->with('entity_load')
->will($this
->returnValue(array()));
$this->moduleHandler
->expects($this
->at(1))
->method('getImplementations')
->with('test_entity_type_load')
->will($this
->returnValue(array()));
$entities = $this->entityStorage
->loadMultiple(array(
'foo',
));
foreach ($entities as $id => $entity) {
$this
->assertInstanceOf('Drupal\\Core\\Entity\\EntityInterface', $entity);
$this
->assertSame($id, $entity
->id());
}
}
public function testLoadRevision() {
$this
->setUpKeyValueEntityStorage();
$this
->assertSame(NULL, $this->entityStorage
->loadRevision(1));
}
public function testDeleteRevision() {
$this
->setUpKeyValueEntityStorage();
$this
->assertSame(NULL, $this->entityStorage
->deleteRevision(1));
}
public function testDelete() {
$entities['foo'] = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(
array(
'id' => 'foo',
),
));
$entities['bar'] = $this
->getMockEntity('Drupal\\Core\\Entity\\Entity', array(
array(
'id' => 'bar',
),
));
$this->entityType
->expects($this
->once())
->method('getClass')
->will($this
->returnValue(get_class(reset($entities))));
$this
->setUpKeyValueEntityStorage();
$this->moduleHandler
->expects($this
->at(0))
->method('invokeAll')
->with('test_entity_type_predelete');
$this->moduleHandler
->expects($this
->at(1))
->method('invokeAll')
->with('entity_predelete');
$this->moduleHandler
->expects($this
->at(2))
->method('invokeAll')
->with('test_entity_type_predelete');
$this->moduleHandler
->expects($this
->at(3))
->method('invokeAll')
->with('entity_predelete');
$this->moduleHandler
->expects($this
->at(4))
->method('invokeAll')
->with('test_entity_type_delete');
$this->moduleHandler
->expects($this
->at(5))
->method('invokeAll')
->with('entity_delete');
$this->moduleHandler
->expects($this
->at(6))
->method('invokeAll')
->with('test_entity_type_delete');
$this->moduleHandler
->expects($this
->at(7))
->method('invokeAll')
->with('entity_delete');
$this->keyValueStore
->expects($this
->once())
->method('deleteMultiple')
->with(array(
'foo',
'bar',
));
$this->entityStorage
->delete($entities);
}
public function testDeleteNothing() {
$this
->setUpKeyValueEntityStorage();
$this->moduleHandler
->expects($this
->never())
->method($this
->anything());
$this->keyValueStore
->expects($this
->never())
->method('delete');
$this->keyValueStore
->expects($this
->never())
->method('deleteMultiple');
$this->entityStorage
->delete(array());
}
public function getMockEntity($class = 'Drupal\\Core\\Entity\\Entity', array $arguments = array(), $methods = array()) {
if (!isset($arguments[0])) {
$arguments[0] = array();
}
if (!isset($arguments[1])) {
$arguments[1] = 'test_entity_type';
}
return $this
->getMockForAbstractClass($class, $arguments, '', TRUE, TRUE, TRUE, $methods);
}
}
}
namespace {
if (!defined('SAVED_NEW')) {
define('SAVED_NEW', 1);
}
if (!defined('SAVED_UPDATED')) {
define('SAVED_UPDATED', 2);
}
}