Issue #2134857 by Xano, Wim Leers, Berdir, damiankloip: PHPUnit test the entity base classes.
parent
108789c919
commit
1370edf99f
|
@ -7,9 +7,10 @@
|
|||
|
||||
namespace Drupal\Core\Config\Entity;
|
||||
|
||||
use Drupal\Component\Utility\String;
|
||||
use Drupal\Core\Entity\Entity;
|
||||
use Drupal\Core\Entity\EntityStorageControllerInterface;
|
||||
use Drupal\Core\Config\ConfigDuplicateUUIDException;
|
||||
use Drupal\Core\Entity\EntityStorageControllerInterface;
|
||||
|
||||
/**
|
||||
* Defines a base configuration entity class.
|
||||
|
@ -139,6 +140,8 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface
|
|||
}
|
||||
|
||||
$this->{$property_name} = $value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -175,6 +178,8 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface
|
|||
*/
|
||||
public function setSyncing($syncing) {
|
||||
$this->isSyncing = $syncing;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -212,7 +217,7 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface
|
|||
/**
|
||||
* Helper callback for uasort() to sort configuration entities by weight and label.
|
||||
*/
|
||||
public static function sort($a, $b) {
|
||||
public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
|
||||
$a_weight = isset($a->weight) ? $a->weight : 0;
|
||||
$b_weight = isset($b->weight) ? $b->weight : 0;
|
||||
if ($a_weight == $b_weight) {
|
||||
|
@ -262,14 +267,14 @@ abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface
|
|||
->execute();
|
||||
$matched_entity = reset($matching_entities);
|
||||
if (!empty($matched_entity) && ($matched_entity != $this->id()) && $matched_entity != $this->getOriginalId()) {
|
||||
throw new ConfigDuplicateUUIDException(format_string('Attempt to save a configuration entity %id with UUID %uuid when this UUID is already used for %matched', array('%id' => $this->id(), '%uuid' => $this->uuid(), '%matched' => $matched_entity)));
|
||||
throw new ConfigDuplicateUUIDException(String::format('Attempt to save a configuration entity %id with UUID %uuid when this UUID is already used for %matched', array('%id' => $this->id(), '%uuid' => $this->uuid(), '%matched' => $matched_entity)));
|
||||
}
|
||||
|
||||
if (!$this->isNew()) {
|
||||
$original = $storage_controller->loadUnchanged($this->id());
|
||||
// Ensure that the UUID cannot be changed for an existing entity.
|
||||
if ($original && ($original->uuid() != $this->uuid())) {
|
||||
throw new ConfigDuplicateUUIDException(format_string('Attempt to save a configuration entity %id with UUID %uuid when this entity already exists with UUID %original_uuid', array('%id' => $this->id(), '%uuid' => $this->uuid(), '%original_uuid' => $original->uuid())));
|
||||
throw new ConfigDuplicateUUIDException(String::format('Attempt to save a configuration entity %id with UUID %uuid when this entity already exists with UUID %original_uuid', array('%id' => $this->id(), '%uuid' => $this->uuid(), '%original_uuid' => $original->uuid())));
|
||||
}
|
||||
}
|
||||
if (!$this->isSyncing()) {
|
||||
|
|
|
@ -17,16 +17,14 @@ interface ConfigEntityInterface extends EntityInterface {
|
|||
/**
|
||||
* Enables the configuration entity.
|
||||
*
|
||||
* @return \Drupal\Core\Config\Entity\ConfigEntityInterface
|
||||
* The configuration entity.
|
||||
* @return $this
|
||||
*/
|
||||
public function enable();
|
||||
|
||||
/**
|
||||
* Disables the configuration entity.
|
||||
*
|
||||
* @return \Drupal\Core\Config\Entity\ConfigEntityInterface
|
||||
* The configuration entity.
|
||||
* @return $this
|
||||
*/
|
||||
public function disable();
|
||||
|
||||
|
@ -36,8 +34,7 @@ interface ConfigEntityInterface extends EntityInterface {
|
|||
* @param bool $status
|
||||
* The status of the configuration entity.
|
||||
*
|
||||
* @return \Drupal\Core\Config\Entity\ConfigEntityInterface
|
||||
* The class instance that this method is called on.
|
||||
* @return $this
|
||||
*/
|
||||
public function setStatus($status);
|
||||
|
||||
|
@ -46,6 +43,8 @@ interface ConfigEntityInterface extends EntityInterface {
|
|||
*
|
||||
* @param bool $status
|
||||
* The status of the sync flag.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function setSyncing($status);
|
||||
|
||||
|
@ -110,6 +109,8 @@ interface ConfigEntityInterface extends EntityInterface {
|
|||
* The name of the property that should be set.
|
||||
* @param mixed $value
|
||||
* The value the property should be set to.
|
||||
*
|
||||
* @return $this
|
||||
*/
|
||||
public function set($property_name, $value);
|
||||
|
||||
|
|
|
@ -134,7 +134,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
public function __construct(array $values, $entity_type, $bundle = FALSE, $translations = array()) {
|
||||
$this->entityTypeId = $entity_type;
|
||||
$this->bundle = $bundle ? $bundle : $this->entityTypeId;
|
||||
$this->languages = language_list(Language::STATE_ALL);
|
||||
$this->languages = $this->languageManager()->getLanguages(Language::STATE_ALL);
|
||||
|
||||
foreach ($values as $key => $value) {
|
||||
// If the key matches an existing property set the value to the property
|
||||
|
@ -161,6 +161,15 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
$this->init();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the typed data manager.
|
||||
*
|
||||
* @return \Drupal\Core\TypedData\TypedDataManager
|
||||
*/
|
||||
protected function typedDataManager() {
|
||||
return \Drupal::typedDataManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -197,8 +206,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function isTranslatable() {
|
||||
// @todo Inject the entity manager and retrieve bundle info from it.
|
||||
$bundles = entity_get_bundles($this->entityTypeId);
|
||||
$bundles = $this->entityManager()->getBundleInfo($this->entityTypeId);
|
||||
return !empty($bundles[$this->bundle()]['translatable']);
|
||||
}
|
||||
|
||||
|
@ -239,15 +247,14 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function getString() {
|
||||
return $this->label();
|
||||
return (string) $this->label();
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function validate() {
|
||||
// @todo: Add the typed data manager as proper dependency.
|
||||
return \Drupal::typedDataManager()->getValidator()->validate($this);
|
||||
return $this->typedDataManager()->getValidator()->validate($this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -333,10 +340,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
$this->fieldDefinitions = NULL;
|
||||
$this->clearTranslationCache();
|
||||
|
||||
// Don't serialize the url generator.
|
||||
$this->urlGenerator = NULL;
|
||||
|
||||
return array_keys(get_object_vars($this));
|
||||
return parent::__sleep();
|
||||
}
|
||||
|
||||
|
||||
|
@ -344,6 +348,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
* Magic __wakeup() implementation.
|
||||
*/
|
||||
public function __wakeup() {
|
||||
parent::__wakeup();
|
||||
$this->init();
|
||||
}
|
||||
|
||||
|
@ -393,7 +398,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
protected function getTranslatedField($name, $langcode) {
|
||||
if ($this->translations[$this->activeLangcode]['status'] == static::TRANSLATION_REMOVED) {
|
||||
$message = 'The entity object refers to a removed translation (@langcode) and cannot be manipulated.';
|
||||
throw new \InvalidArgumentException(format_string($message, array('@langcode' => $this->activeLangcode)));
|
||||
throw new \InvalidArgumentException(String::format($message, array('@langcode' => $this->activeLangcode)));
|
||||
}
|
||||
// Populate $this->fields to speed-up further look-ups and to keep track of
|
||||
// fields objects, possibly holding changes to field values.
|
||||
|
@ -526,13 +531,13 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function access($operation = 'view', AccountInterface $account = NULL) {
|
||||
public function access($operation, AccountInterface $account = NULL) {
|
||||
if ($operation == 'create') {
|
||||
return \Drupal::entityManager()
|
||||
return $this->entityManager()
|
||||
->getAccessController($this->entityTypeId)
|
||||
->createAccess($this->bundle(), $account);
|
||||
}
|
||||
return \Drupal::entityManager()
|
||||
return $this->entityManager()
|
||||
->getAccessController($this->entityTypeId)
|
||||
->access($this, $operation, $this->activeLangcode, $account);
|
||||
}
|
||||
|
@ -544,7 +549,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
$language = NULL;
|
||||
if ($this->activeLangcode != Language::LANGCODE_DEFAULT) {
|
||||
if (!isset($this->languages[$this->activeLangcode])) {
|
||||
$this->languages += language_list(Language::STATE_ALL);
|
||||
$this->languages += $this->languageManager()->getLanguages(Language::STATE_ALL);
|
||||
}
|
||||
$language = $this->languages[$this->activeLangcode];
|
||||
}
|
||||
|
@ -594,7 +599,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
if ($name == 'langcode') {
|
||||
$this->setDefaultLangcode();
|
||||
if (isset($this->translations[$this->defaultLangcode])) {
|
||||
$message = format_string('A translation already exists for the specified language (@langcode).', array('@langcode' => $this->defaultLangcode));
|
||||
$message = String::format('A translation already exists for the specified language (@langcode).', array('@langcode' => $this->defaultLangcode));
|
||||
throw new \InvalidArgumentException($message);
|
||||
}
|
||||
$this->updateFieldLangcodes($this->defaultLangcode);
|
||||
|
@ -643,7 +648,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
|
||||
if (empty($translation)) {
|
||||
$message = 'Invalid translation language (@langcode) specified.';
|
||||
throw new \InvalidArgumentException(format_string($message, array('@langcode' => $langcode)));
|
||||
throw new \InvalidArgumentException(String::format($message, array('@langcode' => $langcode)));
|
||||
}
|
||||
|
||||
return $translation;
|
||||
|
@ -708,14 +713,14 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
public function addTranslation($langcode, array $values = array()) {
|
||||
if (!isset($this->languages[$langcode]) || $this->hasTranslation($langcode)) {
|
||||
$message = 'Invalid translation language (@langcode) specified.';
|
||||
throw new \InvalidArgumentException(format_string($message, array('@langcode' => $langcode)));
|
||||
throw new \InvalidArgumentException(String::format($message, array('@langcode' => $langcode)));
|
||||
}
|
||||
|
||||
// Instantiate a new empty entity so default values will be populated in the
|
||||
// specified language.
|
||||
$entity_type = $this->getEntityType();
|
||||
$default_values = array($entity_type->getKey('bundle') => $this->bundle, 'langcode' => $langcode);
|
||||
$entity = \Drupal::entityManager()
|
||||
$entity = $this->entityManager()
|
||||
->getStorageController($this->getEntityTypeId())
|
||||
->create($default_values);
|
||||
|
||||
|
@ -753,7 +758,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
}
|
||||
else {
|
||||
$message = 'The specified translation (@langcode) cannot be removed.';
|
||||
throw new \InvalidArgumentException(format_string($message, array('@langcode' => $langcode)));
|
||||
throw new \InvalidArgumentException(String::format($message, array('@langcode' => $langcode)));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -895,7 +900,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
public function createDuplicate() {
|
||||
if ($this->translations[$this->activeLangcode]['status'] == static::TRANSLATION_REMOVED) {
|
||||
$message = 'The entity object refers to a removed translation (@langcode) and cannot be manipulated.';
|
||||
throw new \InvalidArgumentException(format_string($message, array('@langcode' => $this->activeLangcode)));
|
||||
throw new \InvalidArgumentException(String::format($message, array('@langcode' => $this->activeLangcode)));
|
||||
}
|
||||
|
||||
$duplicate = clone $this;
|
||||
|
@ -904,8 +909,7 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
|
||||
// Check if the entity type supports UUIDs and generate a new one if so.
|
||||
if ($entity_type->hasKey('uuid')) {
|
||||
// @todo Inject the UUID service into the Entity class once possible.
|
||||
$duplicate->{$entity_type->getKey('uuid')}->value = \Drupal::service('uuid')->generate();
|
||||
$duplicate->{$entity_type->getKey('uuid')}->value = $this->uuidGenerator()->generate();
|
||||
}
|
||||
|
||||
// Check whether the entity type supports revisions and initialize it if so.
|
||||
|
@ -953,9 +957,8 @@ abstract class ContentEntityBase extends Entity implements \IteratorAggregate, C
|
|||
public function label() {
|
||||
$label = NULL;
|
||||
$entity_type = $this->getEntityType();
|
||||
// @todo Convert to is_callable() and call_user_func().
|
||||
if (($label_callback = $entity_type->getLabelCallback()) && function_exists($label_callback)) {
|
||||
$label = $label_callback($this);
|
||||
if (($label_callback = $entity_type->getLabelCallback()) && is_callable($label_callback)) {
|
||||
$label = call_user_func($label_callback, $this);
|
||||
}
|
||||
elseif (($label_key = $entity_type->getKey('label')) && isset($this->{$label_key})) {
|
||||
$label = $this->{$label_key}->value;
|
||||
|
|
|
@ -7,13 +7,14 @@
|
|||
|
||||
namespace Drupal\Core\Entity;
|
||||
|
||||
use Drupal\Core\DependencyInjection\DependencySerialization;
|
||||
use Drupal\Core\Language\Language;
|
||||
use Drupal\Core\Session\AccountInterface;
|
||||
|
||||
/**
|
||||
* Defines a base entity class.
|
||||
*/
|
||||
abstract class Entity implements EntityInterface {
|
||||
abstract class Entity extends DependencySerialization implements EntityInterface {
|
||||
|
||||
/**
|
||||
* The language code of the entity's default language.
|
||||
|
@ -60,6 +61,33 @@ abstract class Entity implements EntityInterface {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the entity manager.
|
||||
*
|
||||
* @return \Drupal\Core\Entity\EntityManagerInterface
|
||||
*/
|
||||
protected function entityManager() {
|
||||
return \Drupal::entityManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the language manager.
|
||||
*
|
||||
* @return \Drupal\Core\Language\LanguageManagerInterface
|
||||
*/
|
||||
protected function languageManager() {
|
||||
return \Drupal::languageManager();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the UUID generator.
|
||||
*
|
||||
* @return \Drupal\Component\Uuid\UuidInterface
|
||||
*/
|
||||
protected function uuidGenerator() {
|
||||
return \Drupal::service('uuid');
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -86,6 +114,8 @@ abstract class Entity implements EntityInterface {
|
|||
*/
|
||||
public function enforceIsNew($value = TRUE) {
|
||||
$this->enforceIsNew = $value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -108,9 +138,8 @@ abstract class Entity implements EntityInterface {
|
|||
public function label() {
|
||||
$label = NULL;
|
||||
$entity_type = $this->getEntityType();
|
||||
// @todo Convert to is_callable() and call_user_func().
|
||||
if (($label_callback = $entity_type->getLabelCallback()) && function_exists($label_callback)) {
|
||||
$label = $label_callback($this);
|
||||
if (($label_callback = $entity_type->getLabelCallback()) && is_callable($label_callback)) {
|
||||
$label = call_user_func($label_callback, $this);
|
||||
}
|
||||
elseif (($label_key = $entity_type->getKey('label')) && isset($this->{$label_key})) {
|
||||
$label = $this->{$label_key};
|
||||
|
@ -138,7 +167,7 @@ abstract class Entity implements EntityInterface {
|
|||
$bundle = $this->bundle();
|
||||
// A bundle-specific callback takes precedence over the generic one for
|
||||
// the entity type.
|
||||
$bundles = \Drupal::entityManager()->getBundleInfo($this->getEntityTypeId());
|
||||
$bundles = $this->entityManager()->getBundleInfo($this->getEntityTypeId());
|
||||
if (isset($bundles[$bundle]['uri_callback'])) {
|
||||
$uri_callback = $bundles[$bundle]['uri_callback'];
|
||||
}
|
||||
|
@ -148,9 +177,8 @@ abstract class Entity implements EntityInterface {
|
|||
|
||||
// Invoke the callback to get the URI. If there is no callback, use the
|
||||
// default URI format.
|
||||
// @todo Convert to is_callable() and call_user_func().
|
||||
if (isset($uri_callback) && function_exists($uri_callback)) {
|
||||
$uri = $uri_callback($this);
|
||||
if (isset($uri_callback) && is_callable($uri_callback)) {
|
||||
$uri = call_user_func($uri_callback, $this);
|
||||
}
|
||||
else {
|
||||
return array();
|
||||
|
@ -247,13 +275,13 @@ abstract class Entity implements EntityInterface {
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function access($operation = 'view', AccountInterface $account = NULL) {
|
||||
public function access($operation, AccountInterface $account = NULL) {
|
||||
if ($operation == 'create') {
|
||||
return \Drupal::entityManager()
|
||||
return $this->entityManager()
|
||||
->getAccessController($this->entityTypeId)
|
||||
->createAccess($this->bundle(), $account);
|
||||
}
|
||||
return \Drupal::entityManager()
|
||||
return $this->entityManager()
|
||||
->getAccessController($this->entityTypeId)
|
||||
->access($this, $operation, Language::LANGCODE_DEFAULT, $account);
|
||||
}
|
||||
|
@ -262,7 +290,7 @@ abstract class Entity implements EntityInterface {
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function language() {
|
||||
$language = language_load($this->langcode);
|
||||
$language = $this->languageManager()->getLanguage($this->langcode);
|
||||
if (!$language) {
|
||||
// Make sure we return a proper language object.
|
||||
$language = new Language(array('id' => Language::LANGCODE_NOT_SPECIFIED));
|
||||
|
@ -274,7 +302,7 @@ abstract class Entity implements EntityInterface {
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function save() {
|
||||
return \Drupal::entityManager()->getStorageController($this->entityTypeId)->save($this);
|
||||
return $this->entityManager()->getStorageController($this->entityTypeId)->save($this);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -282,7 +310,7 @@ abstract class Entity implements EntityInterface {
|
|||
*/
|
||||
public function delete() {
|
||||
if (!$this->isNew()) {
|
||||
\Drupal::entityManager()->getStorageController($this->entityTypeId)->delete(array($this->id() => $this));
|
||||
$this->entityManager()->getStorageController($this->entityTypeId)->delete(array($this->id() => $this));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -296,8 +324,7 @@ abstract class Entity implements EntityInterface {
|
|||
|
||||
// Check if the entity type supports UUIDs and generate a new one if so.
|
||||
if ($entity_type->hasKey('uuid')) {
|
||||
// @todo Inject the UUID service into the Entity class once possible.
|
||||
$duplicate->{$entity_type->getKey('uuid')} = \Drupal::service('uuid')->generate();
|
||||
$duplicate->{$entity_type->getKey('uuid')} = $this->uuidGenerator()->generate();
|
||||
}
|
||||
return $duplicate;
|
||||
}
|
||||
|
@ -306,7 +333,7 @@ abstract class Entity implements EntityInterface {
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function getEntityType() {
|
||||
return \Drupal::entityManager()->getDefinition($this->getEntityTypeId());
|
||||
return $this->entityManager()->getDefinition($this->getEntityTypeId());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -378,8 +405,8 @@ abstract class Entity implements EntityInterface {
|
|||
}
|
||||
|
||||
foreach ($referenced_entities as $entity_type => $entities) {
|
||||
if (\Drupal::entityManager()->hasController($entity_type, 'view_builder')) {
|
||||
\Drupal::entityManager()->getViewBuilder($entity_type)->resetCache($entities);
|
||||
if ($this->entityManager()->hasController($entity_type, 'view_builder')) {
|
||||
$this->entityManager()->getViewBuilder($entity_type)->resetCache($entities);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -412,16 +439,6 @@ abstract class Entity implements EntityInterface {
|
|||
return $this->urlGenerator;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function __sleep() {
|
||||
// Don't serialize the url generator.
|
||||
$this->urlGenerator = NULL;
|
||||
|
||||
return array_keys(get_object_vars($this));
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
|
|
@ -65,6 +65,8 @@ interface EntityInterface extends AccessibleInterface {
|
|||
* (optional) Whether the entity should be forced to be new. Defaults to
|
||||
* TRUE.
|
||||
*
|
||||
* @return self
|
||||
*
|
||||
* @see \Drupal\Core\Entity\EntityInterface::isNew()
|
||||
*/
|
||||
public function enforceIsNew($value = TRUE);
|
||||
|
|
|
@ -63,7 +63,7 @@ interface ComplexDataInterface extends \Traversable, TypedDataInterface {
|
|||
* @param bool $include_computed
|
||||
* If set to TRUE, computed properties are included. Defaults to FALSE.
|
||||
*
|
||||
* @return array
|
||||
* @return \Drupal\Core\TypedData\TypedDataInterface[]
|
||||
* An array of property objects implementing the TypedDataInterface, keyed
|
||||
* by property name.
|
||||
*/
|
||||
|
|
|
@ -170,7 +170,7 @@ function block_get_blocks_by_region($region) {
|
|||
$build = array();
|
||||
if ($list = block_list($region)) {
|
||||
foreach ($list as $key => $block) {
|
||||
if ($block->access()) {
|
||||
if ($block->access('view')) {
|
||||
$build[$key] = entity_view($block, 'block');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ use Drupal\Core\Cache\Cache;
|
|||
use Drupal\Core\Config\Entity\ConfigEntityBase;
|
||||
use Drupal\block\BlockPluginBag;
|
||||
use Drupal\block\BlockInterface;
|
||||
use Drupal\Core\Config\Entity\ConfigEntityInterface;
|
||||
use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
|
||||
use Drupal\Core\Entity\EntityStorageControllerInterface;
|
||||
|
||||
|
@ -176,7 +177,7 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
|
|||
/**
|
||||
* Sorts active blocks by weight; sorts inactive blocks by name.
|
||||
*/
|
||||
public static function sort($a, $b) {
|
||||
public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
|
||||
// Separate enabled from disabled.
|
||||
$status = $b->get('status') - $a->get('status');
|
||||
if ($status) {
|
||||
|
|
|
@ -97,14 +97,4 @@ class ConfigEntityUnitTest extends DrupalUnitTestBase {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests getOriginalId() and setOriginalId().
|
||||
*/
|
||||
protected function testGetOriginalId() {
|
||||
$entity = $this->storage->create(array());
|
||||
$id = $this->randomName();
|
||||
$this->assertIdentical(spl_object_hash($entity->setOriginalId($id)), spl_object_hash($entity));
|
||||
$this->assertIdentical($entity->getOriginalId(), $id);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -9,6 +9,7 @@ namespace Drupal\config_test\Entity;
|
|||
|
||||
use Drupal\Core\Config\Entity\ConfigEntityBase;
|
||||
use Drupal\config_test\ConfigTestInterface;
|
||||
use Drupal\Core\Config\Entity\ConfigEntityInterface;
|
||||
|
||||
/**
|
||||
* Defines the ConfigTest configuration entity.
|
||||
|
@ -100,7 +101,7 @@ class ConfigTest extends ConfigEntityBase implements ConfigTestInterface {
|
|||
/**
|
||||
* Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
|
||||
*/
|
||||
public static function sort($a, $b) {
|
||||
public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
|
||||
\Drupal::state()->set('config_entity_sort', TRUE);
|
||||
return parent::sort($a, $b);
|
||||
}
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
namespace Drupal\entity;
|
||||
|
||||
use Drupal\Core\Config\Entity\ConfigEntityBase;
|
||||
use Drupal\Core\Config\Entity\ConfigEntityInterface;
|
||||
|
||||
/**
|
||||
* Base class for config entity types that hold settings for form and view modes.
|
||||
|
@ -60,7 +61,9 @@ abstract class EntityDisplayModeBase extends ConfigEntityBase implements EntityD
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function sort($a, $b) {
|
||||
public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
|
||||
/** @var \Drupal\entity\EntityDisplayModeInterface $a */
|
||||
/** @var \Drupal\entity\EntityDisplayModeInterface $b */
|
||||
// Sort by the type of entity the view mode is used for.
|
||||
$a_type = $a->getTargetType();
|
||||
$b_type = $b->getTargetType();
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
namespace Drupal\search\Entity;
|
||||
|
||||
use Drupal\Core\Config\Entity\ConfigEntityBase;
|
||||
use Drupal\Core\Config\Entity\ConfigEntityInterface;
|
||||
use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
|
||||
use Drupal\Core\Entity\EntityStorageControllerInterface;
|
||||
use Drupal\Component\Plugin\ConfigurablePluginInterface;
|
||||
|
@ -213,7 +214,7 @@ class SearchPage extends ConfigEntityBase implements SearchPageInterface, Entity
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function sort($a, $b) {
|
||||
public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
|
||||
/** @var $a \Drupal\search\SearchPageInterface */
|
||||
/** @var $b \Drupal\search\SearchPageInterface */
|
||||
$a_status = (int) $a->status();
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
namespace Drupal\system\Entity;
|
||||
|
||||
use Drupal\Core\Config\Entity\ConfigEntityBase;
|
||||
use Drupal\Core\Config\Entity\ConfigEntityInterface;
|
||||
use Drupal\Core\Config\Entity\EntityWithPluginBagInterface;
|
||||
use Drupal\system\ActionConfigEntityInterface;
|
||||
use Drupal\Core\Action\ActionBag;
|
||||
|
@ -131,7 +132,9 @@ class Action extends ConfigEntityBase implements ActionConfigEntityInterface, En
|
|||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function sort($a, $b) {
|
||||
public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
|
||||
/** @var \Drupal\system\ActionConfigEntityInterface $a */
|
||||
/** @var \Drupal\system\ActionConfigEntityInterface $b */
|
||||
$a_type = $a->getType();
|
||||
$b_type = $b->getType();
|
||||
if ($a_type != $b_type) {
|
||||
|
|
|
@ -1,55 +0,0 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\system\Tests\Entity\EntityLabelTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\system\Tests\Entity;
|
||||
|
||||
/**
|
||||
* Tests entity properties.
|
||||
*/
|
||||
class EntityLabelTest extends EntityUnitTestBase {
|
||||
|
||||
public static function getInfo() {
|
||||
return array(
|
||||
'name' => 'Entity label',
|
||||
'description' => 'Tests entity labels.',
|
||||
'group' => 'Entity API',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests label key and label callback of an entity.
|
||||
*/
|
||||
function testEntityLabel() {
|
||||
$entity_types = array(
|
||||
'entity_test_no_label',
|
||||
'entity_test_label',
|
||||
'entity_test_label_callback',
|
||||
);
|
||||
|
||||
$values = array(
|
||||
'name' => $this->randomName(),
|
||||
);
|
||||
foreach ($entity_types as $entity_type) {
|
||||
$entity = entity_create($entity_type, $values);
|
||||
$label = $entity->label();
|
||||
|
||||
switch ($entity_type) {
|
||||
case 'entity_test_no_label':
|
||||
$this->assertFalse($label, 'Entity with no label property or callback returned FALSE.');
|
||||
break;
|
||||
|
||||
case 'entity_test_label':
|
||||
$this->assertEqual($label, $entity->name->value, 'Entity with label key returned correct label.');
|
||||
break;
|
||||
|
||||
case 'entity_test_label_callback':
|
||||
$this->assertEqual($label, 'label callback ' . $entity->name->value, 'Entity with label callback returned correct label.');
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
|
@ -317,19 +317,6 @@ function entity_test_entity_test_insert($entity) {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Entity label callback.
|
||||
*
|
||||
* @param $entity
|
||||
* The entity object.
|
||||
*
|
||||
* @return
|
||||
* The label of the entity prefixed with "label callback".
|
||||
*/
|
||||
function entity_test_label_callback($entity) {
|
||||
return 'label callback ' . $entity->name->value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Implements hook_entity_field_access().
|
||||
*
|
||||
|
|
|
@ -10,6 +10,7 @@ namespace Drupal\Tests\Core\Config\Entity;
|
|||
use Drupal\Component\Plugin\ConfigurablePluginInterface;
|
||||
use Drupal\Core\DependencyInjection\ContainerBuilder;
|
||||
use Drupal\Component\Plugin\PluginBase;
|
||||
use Drupal\Core\Language\Language;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
|
@ -62,6 +63,20 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
|
|||
*/
|
||||
protected $provider;
|
||||
|
||||
/**
|
||||
* The language manager.
|
||||
*
|
||||
* @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $languageManager;
|
||||
|
||||
/**
|
||||
* The entity ID.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -77,7 +92,12 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
|
|||
* {@inheritdoc}
|
||||
*/
|
||||
public function setUp() {
|
||||
$values = array();
|
||||
$this->id = $this->randomName();
|
||||
$values = array(
|
||||
'id' => $this->id,
|
||||
'langcode' => 'en',
|
||||
'uuid' => '3bb9ee60-bea5-4622-b89b-a63319d10b3a',
|
||||
);
|
||||
$this->entityTypeId = $this->randomName();
|
||||
$this->provider = $this->randomName();
|
||||
$this->entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
|
||||
|
@ -93,9 +113,16 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
|
|||
|
||||
$this->uuid = $this->getMock('\Drupal\Component\Uuid\UuidInterface');
|
||||
|
||||
$this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface');
|
||||
$this->languageManager->expects($this->any())
|
||||
->method('getLanguage')
|
||||
->with('en')
|
||||
->will($this->returnValue(new Language(array('id' => 'en'))));
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->set('entity.manager', $this->entityManager);
|
||||
$container->set('uuid', $this->uuid);
|
||||
$container->set('language_manager', $this->languageManager);
|
||||
\Drupal::setContainer($container);
|
||||
|
||||
$this->entity = $this->getMockForAbstractClass('\Drupal\Core\Config\Entity\ConfigEntityBase', array($values, $this->entityTypeId));
|
||||
|
@ -236,6 +263,158 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
|
|||
$this->assertEmpty($this->entity->calculateDependencies());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::setOriginalId
|
||||
* @covers ::getOriginalId
|
||||
*/
|
||||
public function testGetOriginalId() {
|
||||
$new_id = $this->randomName();
|
||||
$this->entity->set('id', $new_id);
|
||||
$this->assertSame($this->id, $this->entity->getOriginalId());
|
||||
$this->assertSame($this->entity, $this->entity->setOriginalId($new_id));
|
||||
$this->assertSame($new_id, $this->entity->getOriginalId());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::isNew
|
||||
*/
|
||||
public function testIsNew() {
|
||||
$this->assertFalse($this->entity->isNew());
|
||||
$this->assertSame($this->entity, $this->entity->enforceIsNew());
|
||||
$this->assertTrue($this->entity->isNew());
|
||||
$this->entity->enforceIsNew(FALSE);
|
||||
$this->assertFalse($this->entity->isNew());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::set
|
||||
* @covers ::get
|
||||
*/
|
||||
public function testGet() {
|
||||
$name = 'id';
|
||||
$value = $this->randomName();
|
||||
$this->assertSame($this->id, $this->entity->get($name));
|
||||
$this->assertSame($this->entity, $this->entity->set($name, $value));
|
||||
$this->assertSame($value, $this->entity->get($name));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::setStatus
|
||||
* @covers ::status
|
||||
*/
|
||||
public function testSetStatus() {
|
||||
$this->assertTrue($this->entity->status());
|
||||
$this->assertSame($this->entity, $this->entity->setStatus(FALSE));
|
||||
$this->assertFalse($this->entity->status());
|
||||
$this->entity->setStatus(TRUE);
|
||||
$this->assertTrue($this->entity->status());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::enable
|
||||
* @depends testSetStatus
|
||||
*/
|
||||
public function testEnable() {
|
||||
$this->entity->setStatus(FALSE);
|
||||
$this->assertSame($this->entity, $this->entity->enable());
|
||||
$this->assertTrue($this->entity->status());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::disable
|
||||
* @depends testSetStatus
|
||||
*/
|
||||
public function testDisable() {
|
||||
$this->entity->setStatus(TRUE);
|
||||
$this->assertSame($this->entity, $this->entity->disable());
|
||||
$this->assertFalse($this->entity->status());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::setSyncing
|
||||
* @covers ::isSyncing
|
||||
*/
|
||||
public function testIsSyncing() {
|
||||
$this->assertFalse($this->entity->isSyncing());
|
||||
$this->assertSame($this->entity, $this->entity->setSyncing(TRUE));
|
||||
$this->assertTrue($this->entity->isSyncing());
|
||||
$this->entity->setSyncing(FALSE);
|
||||
$this->assertFalse($this->entity->isSyncing());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::createDuplicate
|
||||
*/
|
||||
public function testCreateDuplicate() {
|
||||
$this->entityType->expects($this->at(0))
|
||||
->method('getKey')
|
||||
->with('id')
|
||||
->will($this->returnValue('id'));
|
||||
|
||||
$this->entityType->expects($this->at(1))
|
||||
->method('hasKey')
|
||||
->with('uuid')
|
||||
->will($this->returnValue(TRUE));
|
||||
|
||||
$this->entityType->expects($this->at(2))
|
||||
->method('getKey')
|
||||
->with('uuid')
|
||||
->will($this->returnValue('uuid'));
|
||||
|
||||
$new_uuid = '8607ef21-42bc-4913-978f-8c06207b0395';
|
||||
$this->uuid->expects($this->once())
|
||||
->method('generate')
|
||||
->will($this->returnValue($new_uuid));
|
||||
|
||||
$duplicate = $this->entity->createDuplicate();
|
||||
$this->assertInstanceOf('\Drupal\Core\Entity\Entity', $duplicate);
|
||||
$this->assertNotSame($this->entity, $duplicate);
|
||||
$this->assertNull($duplicate->id());
|
||||
$this->assertNull($duplicate->getOriginalId());
|
||||
$this->assertNotEquals($this->entity->uuid(), $duplicate->uuid());
|
||||
$this->assertSame($new_uuid, $duplicate->uuid());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::sort
|
||||
*/
|
||||
public function testSort() {
|
||||
$this->entityManager->expects($this->any())
|
||||
->method('getDefinition')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue(array(
|
||||
'entity_keys' => array(
|
||||
'label' => 'label',
|
||||
),
|
||||
)));
|
||||
$entity_a = $this->entity;
|
||||
$entity_a->label = 'foo';
|
||||
$entity_b = clone $this->entity;
|
||||
$entity_b->label = 'bar';
|
||||
$list = array($entity_a, $entity_b);
|
||||
// Suppress errors because of https://bugs.php.net/bug.php?id=50688.
|
||||
@usort($list, '\Drupal\Core\Config\Entity\ConfigEntityBase::sort');
|
||||
$this->assertSame($entity_b, $list[0]);
|
||||
$entity_a->weight = 0;
|
||||
$entity_b->weight = 1;
|
||||
// Suppress errors because of https://bugs.php.net/bug.php?id=50688.
|
||||
@usort($list, array($entity_a, 'sort'));
|
||||
$this->assertSame($entity_a, $list[0]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::toArray
|
||||
*/
|
||||
public function testToArray() {
|
||||
$properties = $this->entity->toArray();
|
||||
$this->assertInternalType('array', $properties);
|
||||
$class_info = new \ReflectionClass($this->entity);
|
||||
foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
|
||||
$name = $property->getName();
|
||||
$this->assertArrayHasKey($name, $properties);
|
||||
$this->assertSame($this->entity->get($name), $properties[$name]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
class TestConfigurablePlugin extends PluginBase implements ConfigurablePluginInterface {
|
||||
|
@ -260,5 +439,4 @@ class TestConfigurablePlugin extends PluginBase implements ConfigurablePluginInt
|
|||
public function defaultConfiguration() {
|
||||
return array();
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,351 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\Core\Entity\ContentEntityBaseUnitTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\Core\Entity;
|
||||
|
||||
use Drupal\Core\DependencyInjection\ContainerBuilder;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
use Drupal\Core\Language\Language;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\Core\Entity\ContentEntityBase
|
||||
*
|
||||
* @group Drupal
|
||||
*/
|
||||
class ContentEntityBaseUnitTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The bundle of the entity under test.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $bundle;
|
||||
|
||||
/**
|
||||
* The entity under test.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\ContentEntityBase|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* The entity type used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityType;
|
||||
|
||||
/**
|
||||
* The entity manager used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* The type ID of the entity under test.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $entityTypeId;
|
||||
|
||||
/**
|
||||
* The typed data manager used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\TypedData\TypedDataManager|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $typedDataManager;
|
||||
|
||||
/**
|
||||
* The language manager.
|
||||
*
|
||||
* @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $languageManager;
|
||||
|
||||
/**
|
||||
* The UUID generator used for testing.
|
||||
*
|
||||
* @var \Drupal\Component\Uuid\UuidInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $uuid;
|
||||
|
||||
/**
|
||||
* The entity ID.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $id;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getInfo() {
|
||||
return array(
|
||||
'description' => '',
|
||||
'name' => '\Drupal\Core\Entity\ContentEntityBase unit test',
|
||||
'group' => 'Entity',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setUp() {
|
||||
$this->id = 1;
|
||||
$values = array(
|
||||
'id' => $this->id,
|
||||
'langcode' => 'en',
|
||||
'uuid' => '3bb9ee60-bea5-4622-b89b-a63319d10b3a',
|
||||
);
|
||||
$this->entityTypeId = $this->randomName();
|
||||
$this->bundle = $this->randomName();
|
||||
|
||||
$this->entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
|
||||
|
||||
$this->entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
|
||||
$this->entityManager->expects($this->any())
|
||||
->method('getDefinition')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue($this->entityType));
|
||||
$this->entityManager->expects($this->any())
|
||||
->method('getFieldDefinitions')
|
||||
->with($this->entityTypeId, $this->bundle)
|
||||
->will($this->returnValue(array(
|
||||
'id' => array(
|
||||
'type' => 'integer_field',
|
||||
),
|
||||
)));
|
||||
|
||||
$this->uuid = $this->getMock('\Drupal\Component\Uuid\UuidInterface');
|
||||
|
||||
$this->typedDataManager = $this->getMockBuilder('\Drupal\Core\TypedData\TypedDataManager')
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
|
||||
$language = new Language(array('id' => 'en'));
|
||||
$this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface');
|
||||
$this->languageManager->expects($this->any())
|
||||
->method('getLanguages')
|
||||
->will($this->returnValue(array('en' => $language)));
|
||||
$this->languageManager->expects($this->any())
|
||||
->method('getLanguage')
|
||||
->with('en')
|
||||
->will($this->returnValue($language));
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->set('entity.manager', $this->entityManager);
|
||||
$container->set('uuid', $this->uuid);
|
||||
$container->set('typed_data_manager', $this->typedDataManager);
|
||||
$container->set('language_manager', $this->languageManager);
|
||||
\Drupal::setContainer($container);
|
||||
|
||||
$this->entity = $this->getMockForAbstractClass('\Drupal\Core\Entity\ContentEntityBase', array($values, $this->entityTypeId, $this->bundle));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::isNewRevision
|
||||
* @covers ::setNewRevision
|
||||
*/
|
||||
public function testIsNewRevision() {
|
||||
// Set up the entity type so that on the first call there is no revision key
|
||||
// and on the second call there is one.
|
||||
$this->entityType->expects($this->at(0))
|
||||
->method('hasKey')
|
||||
->with('revision')
|
||||
->will($this->returnValue(FALSE));
|
||||
$this->entityType->expects($this->at(1))
|
||||
->method('hasKey')
|
||||
->with('revision')
|
||||
->will($this->returnValue(TRUE));
|
||||
|
||||
$this->assertFalse($this->entity->isNewRevision());
|
||||
$this->assertTrue($this->entity->isNewRevision());
|
||||
$this->entity->setNewRevision(TRUE);
|
||||
$this->assertTRUE($this->entity->isNewRevision());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::isDefaultRevision
|
||||
*/
|
||||
public function testIsDefaultRevision() {
|
||||
// The default value is TRUE.
|
||||
$this->assertTrue($this->entity->isDefaultRevision());
|
||||
// Change the default revision, verify that the old value is returned.
|
||||
$this->assertTrue($this->entity->isDefaultRevision(FALSE));
|
||||
// The last call changed the return value for this call.
|
||||
$this->assertFalse($this->entity->isDefaultRevision());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getRevisionId
|
||||
*/
|
||||
public function testGetRevisionId() {
|
||||
// The default getRevisionId() implementation returns NULL.
|
||||
$this->assertNull($this->entity->getRevisionId());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::isTranslatable
|
||||
*/
|
||||
public function testIsTranslatable() {
|
||||
$this->entityManager->expects($this->at(0))
|
||||
->method('getBundleInfo')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue(array(
|
||||
$this->bundle => array(
|
||||
'translatable' => TRUE,
|
||||
),
|
||||
)));
|
||||
$this->assertTrue($this->entity->isTranslatable());
|
||||
$this->assertFalse($this->entity->isTranslatable());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::preSaveRevision
|
||||
*/
|
||||
public function testPreSaveRevision() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$record = new \stdClass();
|
||||
$this->entity->preSaveRevision($storage, $record);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getString
|
||||
*/
|
||||
public function testGetString() {
|
||||
$label = $this->randomName();
|
||||
/** @var \Drupal\Core\Entity\ContentEntityBase|\PHPUnit_Framework_MockObject_MockObject $entity */
|
||||
$entity = $this->getMockBuilder('\Drupal\Core\Entity\ContentEntityBase')
|
||||
->setMethods(array('label'))
|
||||
->disableOriginalConstructor()
|
||||
->getMockForAbstractClass();
|
||||
$entity->expects($this->once())
|
||||
->method('label')
|
||||
->will($this->returnValue($label));
|
||||
|
||||
$this->assertSame($label, $entity->getString());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::validate
|
||||
*/
|
||||
public function testValidate() {
|
||||
$validator = $this->getMock('\Symfony\Component\Validator\ValidatorInterface');
|
||||
/** @var \Symfony\Component\Validator\ConstraintViolationList|\PHPUnit_Framework_MockObject_MockObject $empty_violation_list */
|
||||
$empty_violation_list = $this->getMockBuilder('\Symfony\Component\Validator\ConstraintViolationList')
|
||||
->setMethods(NULL)
|
||||
->getMock();
|
||||
$non_empty_violation_list = clone $empty_violation_list;
|
||||
$violation = $this->getMock('\Symfony\Component\Validator\ConstraintViolationInterface');
|
||||
$non_empty_violation_list->add($violation);
|
||||
$validator->expects($this->at(0))
|
||||
->method('validate')
|
||||
->with($this->entity)
|
||||
->will($this->returnValue($empty_violation_list));
|
||||
$validator->expects($this->at(1))
|
||||
->method('validate')
|
||||
->with($this->entity)
|
||||
->will($this->returnValue($non_empty_violation_list));
|
||||
$this->typedDataManager->expects($this->exactly(2))
|
||||
->method('getValidator')
|
||||
->will($this->returnValue($validator));
|
||||
$this->assertSame(0, count($this->entity->validate()));
|
||||
$this->assertSame(1, count($this->entity->validate()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getConstraints
|
||||
*/
|
||||
public function testGetConstraints() {
|
||||
$this->assertInternalType('array', $this->entity->getConstraints());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getName
|
||||
*/
|
||||
public function testGetName() {
|
||||
$this->assertNull($this->entity->getName());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getRoot
|
||||
*/
|
||||
public function testGetRoot() {
|
||||
$this->assertSame(spl_object_hash($this->entity), spl_object_hash($this->entity->getRoot()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getPropertyPath
|
||||
*/
|
||||
public function testGetPropertyPath() {
|
||||
$this->assertSame('', $this->entity->getPropertyPath());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getParent
|
||||
*/
|
||||
public function testGetParent() {
|
||||
$this->assertNull($this->entity->getParent());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::setContext
|
||||
*/
|
||||
public function testSetContext() {
|
||||
$name = $this->randomName();
|
||||
$parent = $this->getMock('\Drupal\Core\TypedData\TypedDataInterface');
|
||||
$this->entity->setContext($name, $parent);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::bundle
|
||||
*/
|
||||
public function testBundle() {
|
||||
$this->assertSame($this->bundle, $this->entity->bundle());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::access
|
||||
*/
|
||||
public function testAccess() {
|
||||
$access = $this->getMock('\Drupal\Core\Entity\EntityAccessControllerInterface');
|
||||
$operation = $this->randomName();
|
||||
$access->expects($this->at(0))
|
||||
->method('access')
|
||||
->with($this->entity, $operation)
|
||||
->will($this->returnValue(TRUE));
|
||||
$access->expects($this->at(1))
|
||||
->method('createAccess')
|
||||
->will($this->returnValue(TRUE));
|
||||
$this->entityManager->expects($this->exactly(2))
|
||||
->method('getAccessController')
|
||||
->will($this->returnValue($access));
|
||||
$this->assertTrue($this->entity->access($operation));
|
||||
$this->assertTrue($this->entity->access('create'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::label
|
||||
*/
|
||||
public function testLabel() {
|
||||
// Make a mock with one method that we use as the entity's label callback.
|
||||
// We check that it is called, and that the entity's label is the callback's
|
||||
// return value.
|
||||
$callback_label = $this->randomName();
|
||||
$callback_container = $this->getMock(get_class());
|
||||
$callback_container->expects($this->once())
|
||||
->method(__FUNCTION__)
|
||||
->will($this->returnValue($callback_label));
|
||||
$this->entityType->expects($this->once())
|
||||
->method('getLabelCallback')
|
||||
->will($this->returnValue(array($callback_container, __FUNCTION__)));
|
||||
|
||||
$this->assertSame($callback_label, $this->entity->label());
|
||||
}
|
||||
}
|
|
@ -0,0 +1,348 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* @file
|
||||
* Contains \Drupal\Tests\Core\Entity\EntityUnitTest.
|
||||
*/
|
||||
|
||||
namespace Drupal\Tests\Core\Entity;
|
||||
|
||||
use Drupal\Core\DependencyInjection\ContainerBuilder;
|
||||
use Drupal\Core\Language\Language;
|
||||
use Drupal\Tests\UnitTestCase;
|
||||
|
||||
/**
|
||||
* @coversDefaultClass \Drupal\Core\Entity\Entity
|
||||
*
|
||||
* @group Drupal
|
||||
*/
|
||||
class EntityUnitTest extends UnitTestCase {
|
||||
|
||||
/**
|
||||
* The entity under test.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\Entity|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entity;
|
||||
|
||||
/**
|
||||
* The entity type used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityTypeInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityType;
|
||||
|
||||
/**
|
||||
* The entity manager used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\Entity\EntityManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $entityManager;
|
||||
|
||||
/**
|
||||
* The ID of the type of the entity under test.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $entityTypeId;
|
||||
|
||||
/**
|
||||
* The route provider used for testing.
|
||||
*
|
||||
* @var \Drupal\Core\Routing\RouteProvider|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $routeProvider;
|
||||
|
||||
/**
|
||||
* The UUID generator used for testing.
|
||||
*
|
||||
* @var \Drupal\Component\Uuid\UuidInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $uuid;
|
||||
|
||||
/**
|
||||
* The language manager.
|
||||
*
|
||||
* @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit_Framework_MockObject_MockObject
|
||||
*/
|
||||
protected $languageManager;
|
||||
|
||||
/**
|
||||
* The entity values.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $values;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public static function getInfo() {
|
||||
return array(
|
||||
'description' => '',
|
||||
'name' => '\Drupal\Core\Entity\Entity unit test',
|
||||
'group' => 'Entity',
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
public function setUp() {
|
||||
$this->values = array(
|
||||
'id' => 1,
|
||||
'langcode' => 'en',
|
||||
'uuid' => '3bb9ee60-bea5-4622-b89b-a63319d10b3a',
|
||||
);
|
||||
$this->entityTypeId = $this->randomName();
|
||||
|
||||
$this->entityType = $this->getMock('\Drupal\Core\Entity\EntityTypeInterface');
|
||||
|
||||
$this->entityManager = $this->getMock('\Drupal\Core\Entity\EntityManagerInterface');
|
||||
$this->entityManager->expects($this->any())
|
||||
->method('getDefinition')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue($this->entityType));
|
||||
|
||||
$this->uuid = $this->getMock('\Drupal\Component\Uuid\UuidInterface');
|
||||
|
||||
$this->languageManager = $this->getMock('\Drupal\Core\Language\LanguageManagerInterface');
|
||||
$this->languageManager->expects($this->any())
|
||||
->method('getLanguage')
|
||||
->with('en')
|
||||
->will($this->returnValue(new Language(array('id' => 'en'))));
|
||||
|
||||
$container = new ContainerBuilder();
|
||||
$container->set('entity.manager', $this->entityManager);
|
||||
$container->set('uuid', $this->uuid);
|
||||
$container->set('language_manager', $this->languageManager);
|
||||
|
||||
\Drupal::setContainer($container);
|
||||
|
||||
$this->entity = $this->getMockForAbstractClass('\Drupal\Core\Entity\Entity', array($this->values, $this->entityTypeId));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::id
|
||||
*/
|
||||
public function testId() {
|
||||
$this->assertSame($this->values['id'], $this->entity->id());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::uuid
|
||||
*/
|
||||
public function testUuid() {
|
||||
$this->assertSame($this->values['uuid'], $this->entity->uuid());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::isNew
|
||||
* @covers ::enforceIsNew
|
||||
*/
|
||||
public function testIsNew() {
|
||||
// We provided an ID, so the entity is not new.
|
||||
$this->assertFalse($this->entity->isNew());
|
||||
// Force it to be new.
|
||||
$this->assertSame($this->entity, $this->entity->enforceIsNew());
|
||||
$this->assertTrue($this->entity->isNew());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getEntityType
|
||||
*/
|
||||
public function testGetEntityType() {
|
||||
$this->assertSame($this->entityType, $this->entity->getEntityType());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::bundle
|
||||
*/
|
||||
public function testBundle() {
|
||||
$this->assertSame($this->entityTypeId, $this->entity->bundle());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::label
|
||||
*/
|
||||
public function testLabel() {
|
||||
// Make a mock with one method that we use as the entity's uri_callback. We
|
||||
// check that it is called, and that the entity's label is the callback's
|
||||
// return value.
|
||||
$callback_label = $this->randomName();
|
||||
$property_label = $this->randomName();
|
||||
$callback_container = $this->getMock(get_class());
|
||||
$callback_container->expects($this->once())
|
||||
->method(__FUNCTION__)
|
||||
->will($this->returnValue($callback_label));
|
||||
$this->entityType->expects($this->at(0))
|
||||
->method('getLabelCallback')
|
||||
->will($this->returnValue(array($callback_container, __FUNCTION__)));
|
||||
$this->entityType->expects($this->at(1))
|
||||
->method('getLabelCallback')
|
||||
->will($this->returnValue(NULL));
|
||||
$this->entityType->expects($this->at(2))
|
||||
->method('getKey')
|
||||
->with('label')
|
||||
->will($this->returnValue('label'));
|
||||
|
||||
// Set a dummy property on the entity under test to test that the label can
|
||||
// be returned form a property if there is no callback.
|
||||
$this->entityManager->expects($this->at(1))
|
||||
->method('getDefinition')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue(array(
|
||||
'entity_keys' => array(
|
||||
'label' => 'label',
|
||||
),
|
||||
)));
|
||||
$this->entity->label = $property_label;
|
||||
|
||||
$this->assertSame($callback_label, $this->entity->label());
|
||||
$this->assertSame($property_label, $this->entity->label());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::access
|
||||
*/
|
||||
public function testAccess() {
|
||||
$access = $this->getMock('\Drupal\Core\Entity\EntityAccessControllerInterface');
|
||||
$operation = $this->randomName();
|
||||
$access->expects($this->at(0))
|
||||
->method('access')
|
||||
->with($this->entity, $operation)
|
||||
->will($this->returnValue(TRUE));
|
||||
$access->expects($this->at(1))
|
||||
->method('createAccess')
|
||||
->will($this->returnValue(TRUE));
|
||||
$this->entityManager->expects($this->exactly(2))
|
||||
->method('getAccessController')
|
||||
->will($this->returnValue($access));
|
||||
$this->assertTrue($this->entity->access($operation));
|
||||
$this->assertTrue($this->entity->access('create'));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::language
|
||||
*/
|
||||
public function testLanguage() {
|
||||
$this->assertSame('en', $this->entity->language()->id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::save
|
||||
*/
|
||||
public function testSave() {
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$storage->expects($this->once())
|
||||
->method('save')
|
||||
->with($this->entity);
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('getStorageController')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue($storage));
|
||||
$this->entity->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::delete
|
||||
*/
|
||||
public function testDelete() {
|
||||
$this->entity->id = $this->randomName();
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
// Testing the argument of the delete() method consumes too much memory.
|
||||
$storage->expects($this->once())
|
||||
->method('delete');
|
||||
$this->entityManager->expects($this->once())
|
||||
->method('getStorageController')
|
||||
->with($this->entityTypeId)
|
||||
->will($this->returnValue($storage));
|
||||
$this->entity->delete();
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::getEntityTypeId
|
||||
*/
|
||||
public function testGetEntityTypeId() {
|
||||
$this->assertSame($this->entityTypeId, $this->entity->getEntityTypeId());
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::preSave
|
||||
*/
|
||||
public function testPreSave() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$this->entity->preSave($storage);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::postSave
|
||||
*/
|
||||
public function testPostSave() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$this->entity->postSave($storage);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::preCreate
|
||||
*/
|
||||
public function testPreCreate() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$values = array();
|
||||
$this->entity->preCreate($storage, $values);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::postCreate
|
||||
*/
|
||||
public function testPostCreate() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$this->entity->postCreate($storage);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::preDelete
|
||||
*/
|
||||
public function testPreDelete() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$this->entity->preDelete($storage, array($this->entity));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::postDelete
|
||||
*/
|
||||
public function testPostDelete() {
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
|
||||
$entity = $this->getMockBuilder('\Drupal\Core\Entity\Entity')
|
||||
->setMethods(array('onSaveOrDelete'))
|
||||
->disableOriginalConstructor()
|
||||
->getMock();
|
||||
$entity->expects($this->once())
|
||||
->method('onSaveOrDelete');
|
||||
|
||||
$this->entity->postDelete($storage, array($entity));
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::postLoad
|
||||
*/
|
||||
public function testPostLoad() {
|
||||
// This method is internal, so check for errors on calling it only.
|
||||
$storage = $this->getMock('\Drupal\Core\Entity\EntityStorageControllerInterface');
|
||||
$entities = array($this->entity);
|
||||
$this->entity->postLoad($storage, $entities);
|
||||
}
|
||||
|
||||
/**
|
||||
* @covers ::referencedEntities
|
||||
*/
|
||||
public function testReferencedEntities() {
|
||||
$this->assertSame(array(), $this->entity->referencedEntities());
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue