View source
<?php
namespace Drupal\Tests\entity_usage\Kernel;
use Drupal\Core\Entity\RevisionableInterface;
use Drupal\entity_test\Entity\EntityTest;
use Drupal\entity_usage\Events\EntityUsageEvent;
use Drupal\entity_usage\Events\Events;
use Drupal\KernelTests\Core\Entity\EntityKernelTestBase;
class EntityUsageTest extends EntityKernelTestBase {
public static $modules = [
'entity_test',
'entity_usage',
];
protected $entityType = 'entity_test';
protected $bundle = 'entity_test';
protected $testEntities;
protected $injectedDatabase;
protected $tableName;
protected $state;
protected function setUp() {
parent::setUp();
$this->injectedDatabase = $this->container
->get('database');
$this
->installSchema('entity_usage', [
'entity_usage',
]);
$this->tableName = 'entity_usage';
$this->testEntities = $this
->getTestEntities();
$this->state = $this->container
->get('state');
$event_dispatcher = $this->container
->get('event_dispatcher');
$event_dispatcher
->addListener(Events::USAGE_REGISTER, [
$this,
'usageRegisterEventRecorder',
]);
$event_dispatcher
->addListener(Events::USAGE_DELETE, [
$this,
'usageDeleteEventRecorder',
]);
$event_dispatcher
->addListener(Events::DELETE_BY_SOURCE_ENTITY, [
$this,
'usageDeleteBySourceEntityEventRecorder',
]);
$event_dispatcher
->addListener(Events::DELETE_BY_TARGET_ENTITY, [
$this,
'usageDeleteByTargetEntityEventRecorder',
]);
$event_dispatcher
->addListener(Events::BULK_DELETE_DESTINATIONS, [
$this,
'usageBulkTargetDeleteEventRecorder',
]);
$event_dispatcher
->addListener(Events::BULK_DELETE_SOURCES, [
$this,
'usageBulkSourceDeleteEventRecorder',
]);
}
public function testlistSources() {
$target_entity = $this->testEntities[0];
$source_entity = $this->testEntities[1];
$source_vid = $source_entity instanceof RevisionableInterface && $source_entity
->getRevisionId() ? $source_entity
->getRevisionId() : 0;
$this->injectedDatabase
->insert($this->tableName)
->fields([
'target_id' => $target_entity
->id(),
'target_type' => $target_entity
->getEntityTypeId(),
'source_id' => $source_entity
->id(),
'source_type' => $source_entity
->getEntityTypeId(),
'source_langcode' => $source_entity
->language()
->getId(),
'source_vid' => $source_vid,
])
->execute();
$entity_usage = $this->container
->get('entity_usage.usage');
$real_source_list = $entity_usage
->listSources($target_entity);
$expected_source_list = [
$source_entity
->getEntityTypeId() => [
(string) $source_entity
->id() => [
0 => [
'source_langcode' => $source_entity
->language()
->getId(),
'source_vid' => $source_entity
->getRevisionId() ?: 0,
],
],
],
];
$this
->assertEquals($expected_source_list, $real_source_list);
$real_target_list = $entity_usage
->listTargets($source_entity);
$expected_target_list = [
$target_entity
->getEntityTypeId() => [
(string) $target_entity
->id(),
],
];
$this
->assertEquals($expected_target_list, $real_target_list);
$this->injectedDatabase
->truncate($this->tableName);
}
public function testRegisterUsage() {
$entity = $this->testEntities[0];
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 1);
$event = \Drupal::state()
->get('entity_usage_events_test.usage_register', []);
$this
->assertSame($event['event_name'], Events::USAGE_REGISTER);
$this
->assertSame($event['target_id'], $entity
->id());
$this
->assertSame($event['target_type'], $entity
->getEntityTypeId());
$this
->assertSame($event['source_id'], 1);
$this
->assertSame($event['source_type'], 'foo');
$this
->assertSame($event['source_langcode'], 'en');
$this
->assertSame($event['source_vid'], 1);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [])
->condition('e.target_id', $entity
->id())
->condition('e.target_type', $entity
->getEntityTypeId())
->execute()
->fetchAll();
$this
->assertEquals(1, count($real_usage));
$entity_usage
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 1);
$entity_usage
->deleteUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 1);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [])
->condition('e.target_id', $entity
->id())
->condition('e.target_type', $entity
->getEntityTypeId())
->execute()
->fetchAll();
$this
->assertSame(0, count($real_usage));
$this->container
->get('config.factory')
->getEditable('entity_usage.settings')
->set('track_enabled_target_entity_types', [])
->save();
drupal_flush_all_caches();
$this->container
->get('entity_usage.usage')
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 1);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [])
->condition('e.target_id', $entity
->id())
->condition('e.target_type', $entity
->getEntityTypeId())
->execute()
->fetchAll();
$this
->assertSame(0, count($real_usage));
$this->injectedDatabase
->truncate($this->tableName);
}
public function testEntityUsageBlockTrackingHook() {
\Drupal::state()
->set('entity_usage_kernel_test_block_usage_tracking', TRUE);
$this->container
->get('module_installer')
->install([
'path',
'views',
'entity_usage_test',
]);
$entity = $this->testEntities[0];
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 0);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [])
->condition('e.target_id', $entity
->id())
->execute()
->fetchAll();
$this
->assertEquals(0, count($real_usage));
$this->injectedDatabase
->truncate($this->tableName);
\Drupal::state()
->set('entity_usage_kernel_test_block_usage_tracking', FALSE);
}
public function testBulkDeleteTargets() {
$entity_type = $this->testEntities[0]
->getEntityTypeId();
foreach ($this->testEntities as $entity) {
$this->injectedDatabase
->insert($this->tableName)
->fields([
'target_id' => $entity
->id(),
'target_type' => $entity_type,
'source_id' => 1,
'source_type' => 'foo',
'source_langcode' => 'en',
'source_vid' => 1,
])
->execute();
}
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->bulkDeleteTargets($entity_type);
$event = \Drupal::state()
->get('entity_usage_events_test.usage_bulk_delete_targets', []);
$this
->assertSame($event['event_name'], Events::BULK_DELETE_DESTINATIONS);
$this
->assertSame($event['target_id'], NULL);
$this
->assertSame($event['target_type'], $entity_type);
$this
->assertSame($event['source_id'], NULL);
$this
->assertSame($event['source_type'], NULL);
$this
->assertSame($event['source_langcode'], NULL);
$this
->assertSame($event['source_vid'], NULL);
$usages = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [])
->condition('e.target_type', $entity_type)
->execute()
->fetchAll();
$this
->assertSame(0, count($usages));
$this->injectedDatabase
->truncate($this->tableName);
}
public function testBulkDeleteSources() {
$entity_type = $this->testEntities[0]
->getEntityTypeId();
foreach ($this->testEntities as $entity) {
$source_vid = $entity instanceof RevisionableInterface && $entity
->getRevisionId() ? $entity
->getRevisionId() : 0;
$this->injectedDatabase
->insert($this->tableName)
->fields([
'target_id' => 1,
'target_type' => 'foo',
'source_id' => $entity
->id(),
'source_type' => $entity_type,
'source_langcode' => $entity
->language()
->getId(),
'source_vid' => $source_vid,
])
->execute();
}
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->bulkDeleteSources($entity_type);
$event = \Drupal::state()
->get('entity_usage_events_test.usage_bulk_delete_sources', []);
$this
->assertSame($event['event_name'], Events::BULK_DELETE_SOURCES);
$this
->assertSame($event['target_id'], NULL);
$this
->assertSame($event['target_type'], NULL);
$this
->assertSame($event['source_id'], NULL);
$this
->assertSame($event['source_type'], $entity_type);
$this
->assertSame($event['source_langcode'], NULL);
$this
->assertSame($event['source_vid'], NULL);
$usages = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [])
->condition('e.source_type', $entity_type)
->execute()
->fetchAll();
$this
->assertSame(0, count($usages));
$this->injectedDatabase
->truncate($this->tableName);
}
public function testDeleteBySourceEntity() {
$i = 0;
foreach ($this->testEntities as $entity) {
$i++;
$source_vid = $entity instanceof RevisionableInterface && $entity
->getRevisionId() ? $entity
->getRevisionId() : 0;
$this->injectedDatabase
->insert($this->tableName)
->fields([
'target_id' => $i,
'target_type' => 'fake_type_' . $i,
'source_id' => $entity
->id(),
'source_type' => $entity
->getEntityTypeId(),
'source_langcode' => $entity
->language()
->getId(),
'source_vid' => $source_vid,
])
->execute();
}
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->deleteBySourceEntity($this->testEntities[0]
->id(), $this->testEntities[0]
->getEntityTypeId());
$event = \Drupal::state()
->get('entity_usage_events_test.usage_delete_by_source_entity', []);
$this
->assertSame($event['event_name'], Events::DELETE_BY_SOURCE_ENTITY);
$this
->assertSame($event['target_id'], NULL);
$this
->assertSame($event['target_type'], NULL);
$this
->assertSame($event['source_id'], $this->testEntities[0]
->id());
$this
->assertSame($event['source_type'], $this->testEntities[0]
->getEntityTypeId());
$this
->assertSame($event['source_langcode'], NULL);
$this
->assertSame($event['source_vid'], NULL);
$real_target_list = $entity_usage
->listTargets($this->testEntities[1]);
$expected_target_list = [
'fake_type_2' => [
'2',
],
];
$this
->assertEquals($expected_target_list, $real_target_list);
$real_target_list = $entity_usage
->listSources($this->testEntities[0]);
$this
->assertEquals([], $real_target_list);
$this->injectedDatabase
->truncate($this->tableName);
}
public function testDeleteByTargetEntity() {
$i = 0;
foreach ($this->testEntities as $entity) {
$i++;
$this->injectedDatabase
->insert($this->tableName)
->fields([
'target_id' => $entity
->id(),
'target_type' => $entity
->getEntityTypeId(),
'source_id' => $i,
'source_type' => 'fake_type_' . $i,
'source_langcode' => 'en',
'source_vid' => $i,
])
->execute();
}
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->deleteByTargetEntity($this->testEntities[0]
->id(), $this->testEntities[0]
->getEntityTypeId());
$event = \Drupal::state()
->get('entity_usage_events_test.usage_delete_by_target_entity', []);
$this
->assertSame($event['event_name'], Events::DELETE_BY_TARGET_ENTITY);
$this
->assertSame($event['target_id'], $this->testEntities[0]
->id());
$this
->assertSame($event['target_type'], $this->testEntities[0]
->getEntityTypeId());
$this
->assertSame($event['source_id'], NULL);
$this
->assertSame($event['source_type'], NULL);
$this
->assertSame($event['source_langcode'], NULL);
$real_source_list = $entity_usage
->listSources($this->testEntities[1]);
$expected_source_list = [
'fake_type_2' => [
'2' => [
0 => [
'source_langcode' => 'en',
'source_vid' => '2',
],
],
],
];
$this
->assertEquals($expected_source_list, $real_source_list);
$real_source_list = $entity_usage
->listSources($this->testEntities[0]);
$this
->assertEquals([], $real_source_list);
$this->injectedDatabase
->truncate($this->tableName);
}
protected function getTestEntities() {
$content_entity_1 = EntityTest::create([
'name' => $this
->randomMachineName(),
]);
$content_entity_1
->save();
$content_entity_2 = EntityTest::create([
'name' => $this
->randomMachineName(),
]);
$content_entity_2
->save();
return [
$content_entity_1,
$content_entity_2,
];
}
public function usageRegisterEventRecorder(EntityUsageEvent $event, $name) {
$this->state
->set('entity_usage_events_test.usage_register', [
'event_name' => $name,
'target_id' => $event
->getTargetEntityId(),
'target_type' => $event
->getTargetEntityType(),
'source_id' => $event
->getSourceEntityId(),
'source_type' => $event
->getSourceEntityType(),
'source_langcode' => $event
->getSourceEntityLangcode(),
'source_vid' => $event
->getSourceEntityRevisionId(),
]);
}
public function usageDeleteEventRecorder(EntityUsageEvent $event, $name) {
$this->state
->set('entity_usage_events_test.usage_delete_by_field', [
'event_name' => $name,
'target_id' => $event
->getTargetEntityId(),
'target_type' => $event
->getTargetEntityType(),
'source_id' => $event
->getSourceEntityId(),
'source_type' => $event
->getSourceEntityType(),
'source_langcode' => $event
->getSourceEntityLangcode(),
'source_vid' => $event
->getSourceEntityRevisionId(),
]);
}
public function usageDeleteBySourceEntityEventRecorder(EntityUsageEvent $event, $name) {
$this->state
->set('entity_usage_events_test.usage_delete_by_source_entity', [
'event_name' => $name,
'target_id' => $event
->getTargetEntityId(),
'target_type' => $event
->getTargetEntityType(),
'source_id' => $event
->getSourceEntityId(),
'source_type' => $event
->getSourceEntityType(),
'source_langcode' => $event
->getSourceEntityLangcode(),
'source_vid' => $event
->getSourceEntityRevisionId(),
]);
}
public function usageDeleteByTargetEntityEventRecorder(EntityUsageEvent $event, $name) {
$this->state
->set('entity_usage_events_test.usage_delete_by_target_entity', [
'event_name' => $name,
'target_id' => $event
->getTargetEntityId(),
'target_type' => $event
->getTargetEntityType(),
'source_id' => $event
->getSourceEntityId(),
'source_type' => $event
->getSourceEntityType(),
'source_langcode' => $event
->getSourceEntityLangcode(),
'source_vid' => $event
->getSourceEntityRevisionId(),
]);
}
public function usageBulkTargetDeleteEventRecorder(EntityUsageEvent $event, $name) {
$this->state
->set('entity_usage_events_test.usage_bulk_delete_targets', [
'event_name' => $name,
'target_id' => $event
->getTargetEntityId(),
'target_type' => $event
->getTargetEntityType(),
'source_id' => $event
->getSourceEntityId(),
'source_type' => $event
->getSourceEntityType(),
'source_langcode' => $event
->getSourceEntityLangcode(),
'source_vid' => $event
->getSourceEntityRevisionId(),
]);
}
public function usageBulkSourceDeleteEventRecorder(EntityUsageEvent $event, $name) {
$this->state
->set('entity_usage_events_test.usage_bulk_delete_sources', [
'event_name' => $name,
'target_id' => $event
->getTargetEntityId(),
'target_type' => $event
->getTargetEntityType(),
'source_id' => $event
->getSourceEntityId(),
'source_type' => $event
->getSourceEntityType(),
'source_langcode' => $event
->getSourceEntityLangcode(),
'source_vid' => $event
->getSourceEntityRevisionId(),
]);
}
}