View source
<?php
namespace Drupal\KernelTests\Core\Entity;
use Drupal\Core\Entity\Exception\AmbiguousBundleClassException;
use Drupal\Core\Entity\Exception\BundleClassInheritanceException;
use Drupal\Core\Entity\Exception\MissingBundleClassException;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\entity_test_bundle_class\Entity\EntityTestAmbiguousBundleClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestBundleClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestUserClass;
use Drupal\entity_test_bundle_class\Entity\EntityTestVariant;
use Drupal\user\Entity\User;
class BundleClassTest extends EntityKernelTestBase {
protected static $modules = [
'entity_test_bundle_class',
];
protected $storage;
protected function setUp() : void {
parent::setUp();
$this->storage = $this->entityTypeManager
->getStorage('entity_test');
}
public function testEntitySubclass() {
entity_test_create_bundle('bundle_class');
$this
->assertEquals(0, EntityTestBundleClass::$preCreateCount);
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(0, EntityTestBundleClass::$postLoadEntitiesCount);
$entity = EntityTestBundleClass::create();
$this
->assertInstanceOf(EntityTestBundleClass::class, $entity);
$this
->assertEquals(1, EntityTestBundleClass::$preCreateCount);
$this
->assertEquals(1, $entity->postCreateCount);
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(0, EntityTestBundleClass::$postLoadEntitiesCount);
$entity = EntityTestBundleClass::create([
'type' => 'custom',
]);
$this
->assertInstanceOf(EntityTestBundleClass::class, $entity);
$this
->assertEquals('bundle_class', $entity
->bundle());
$this
->assertEquals(2, EntityTestBundleClass::$preCreateCount);
$this
->assertEquals(1, $entity->postCreateCount);
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(0, EntityTestBundleClass::$postLoadEntitiesCount);
$entity = $this->storage
->create([
'type' => 'bundle_class',
]);
$this
->assertInstanceOf(EntityTestBundleClass::class, $entity);
$this
->assertEquals(3, EntityTestBundleClass::$preCreateCount);
$this
->assertEquals(1, $entity->postCreateCount);
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(0, EntityTestBundleClass::$postLoadEntitiesCount);
$entity
->save();
$id = $entity
->id();
$this->storage
->resetCache();
$entity = $this->storage
->load($id);
$this
->assertInstanceOf(EntityTestBundleClass::class, $entity);
$this
->assertEquals(3, EntityTestBundleClass::$preCreateCount);
$this
->assertEquals(0, $entity->postCreateCount);
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$this
->assertEquals(1, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(1, EntityTestBundleClass::$postLoadEntitiesCount);
$this
->assertEquals(1, EntityTestBundleClass::$postLoadEntitiesCount[0]);
$entity_2 = $this->storage
->create([
'type' => 'bundle_class',
]);
$entity_2
->save();
$this
->assertEquals(4, EntityTestBundleClass::$preCreateCount);
$entity_3 = $this->storage
->create([
'type' => 'bundle_class',
]);
$entity_3
->save();
$this
->assertEquals(5, EntityTestBundleClass::$preCreateCount);
entity_test_create_bundle('entity_test');
$entity_test_1 = $this->storage
->create([
'type' => 'entity_test',
]);
$entity_test_1
->save();
$this
->assertEquals(5, EntityTestBundleClass::$preCreateCount);
$entity_test_2 = $this->storage
->create([
'type' => 'entity_test',
]);
$entity_test_2
->save();
$this
->assertEquals(5, EntityTestBundleClass::$preCreateCount);
$entity_ids = [
$entity
->id(),
$entity_2
->id(),
$entity_3
->id(),
$entity_test_1
->id(),
$entity_test_2
->id(),
];
$entities = $this->storage
->loadMultiple($entity_ids);
$this
->assertEquals(2, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(2, EntityTestBundleClass::$postLoadEntitiesCount);
$this
->assertEquals(2, EntityTestBundleClass::$postLoadEntitiesCount[1]);
$this->storage
->resetCache();
$entities = $this->storage
->loadMultiple($entity_ids);
$this
->assertEquals(3, EntityTestBundleClass::$postLoadCount);
$this
->assertCount(3, EntityTestBundleClass::$postLoadEntitiesCount);
$this
->assertEquals(3, EntityTestBundleClass::$postLoadEntitiesCount[2]);
$entity_test_1
->delete();
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$entity_test_2
->delete();
$this
->assertEquals(0, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(0, EntityTestBundleClass::$postDeleteCount);
$entity
->delete();
$this
->assertEquals(1, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(1, EntityTestBundleClass::$postDeleteCount);
$entity_2
->delete();
$this
->assertEquals(2, EntityTestBundleClass::$preDeleteCount);
$this
->assertEquals(2, EntityTestBundleClass::$postDeleteCount);
$entity_class = $this->storage
->getEntityClass(NULL);
$this
->assertEquals(EntityTest::class, $entity_class);
$entity_class = $this->storage
->getEntityClass('bundle_class');
$this
->assertEquals(EntityTestBundleClass::class, $entity_class);
$entity_class = $this->storage
->getEntityClass('custom');
$this
->assertEquals(EntityTest::class, $entity_class);
}
public function testEntityNoBundleSubclass() {
$this->container
->get('state')
->set('entity_test_bundle_class_enable_user_class', TRUE);
$this->container
->get('kernel')
->rebuildContainer();
$this->entityTypeManager
->clearCachedDefinitions();
$this
->drupalSetUpCurrentUser();
$entity = User::load(1);
$this
->assertInstanceOf(EntityTestUserClass::class, $entity);
}
public function testAmbiguousBundleClassExceptionCreate() {
$this->container
->get('state')
->set('entity_test_bundle_class_enable_ambiguous_entity_types', TRUE);
$this->entityTypeManager
->clearCachedDefinitions();
entity_test_create_bundle('bundle_class');
entity_test_create_bundle('bundle_class_2');
$this
->expectException(AmbiguousBundleClassException::class);
EntityTestBundleClass::create();
}
public function testAmbiguousBundleClassExceptionEntityTypeRepository() {
$this->container
->get('state')
->set('entity_test_bundle_class_enable_ambiguous_entity_types', TRUE);
entity_test_create_bundle('entity_test_no_label');
entity_test_create_bundle('entity_test_no_label', NULL, 'entity_test_no_label');
$this
->expectException(AmbiguousBundleClassException::class);
$entity_type = $this->container
->get('entity_type.repository')
->getEntityTypeFromClass(EntityTestAmbiguousBundleClass::class);
}
public function testBundleClassShouldExtendEntityClass() {
$this->container
->get('state')
->set('entity_test_bundle_class_non_inheriting', TRUE);
$this->entityTypeManager
->clearCachedDefinitions();
$this
->expectException(BundleClassInheritanceException::class);
entity_test_create_bundle('bundle_class');
$this->storage
->create([
'type' => 'bundle_class',
]);
}
public function testBundleClassShouldExist() {
$this->container
->get('state')
->set('entity_test_bundle_class_does_not_exist', TRUE);
$this->entityTypeManager
->clearCachedDefinitions();
$this
->expectException(MissingBundleClassException::class);
entity_test_create_bundle('bundle_class');
$this->storage
->create([
'type' => 'bundle_class',
]);
}
public function testEntityClassNotTakenFromActiveDefinitions() : void {
$this->container
->get('state')
->set('entity_test_bundle_class_override_base_class', TRUE);
$this->entityTypeManager
->clearCachedDefinitions();
$this
->assertEquals(EntityTestVariant::class, $this->entityTypeManager
->getStorage('entity_test')
->getEntityClass());
}
}