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::DELETE_BY_FIELD, [
$this,
'usageDeleteByFieldEventRecorder',
]);
$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;
$field_name = 'body';
$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,
'method' => 'entity_reference',
'field_name' => $field_name,
'count' => 1,
])
->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,
'method' => 'entity_reference',
'field_name' => $field_name,
'count' => 1,
],
],
],
];
$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() => [
0 => [
'method' => 'entity_reference',
'field_name' => $field_name,
'count' => 1,
],
],
],
];
$this
->assertEquals($expected_target_list, $real_target_list);
$this->injectedDatabase
->truncate($this->tableName);
}
public function testRegisterUsage() {
$entity = $this->testEntities[0];
$field_name = 'body';
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 1, 'entity_reference', $field_name, 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);
$this
->assertSame($event['method'], 'entity_reference');
$this
->assertSame($event['field_name'], $field_name);
$this
->assertSame($event['count'], 1);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [
'count',
])
->condition('e.target_id', $entity
->id())
->condition('e.target_type', $entity
->getEntityTypeId())
->execute()
->fetchField();
$this
->assertEquals(1, $real_usage);
$entity_usage
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 1, 'entity_reference', $field_name, 0);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [
'count',
])
->condition('e.target_id', $entity
->id())
->condition('e.target_type', $entity
->getEntityTypeId())
->execute()
->fetchField();
$this
->assertSame(FALSE, $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, 'entity_reference', $field_name, 1);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [
'count',
])
->condition('e.target_id', $entity
->id())
->condition('e.target_type', $entity
->getEntityTypeId())
->execute()
->fetchField();
$this
->assertSame(FALSE, $real_usage);
$this->injectedDatabase
->truncate($this->tableName);
}
public function testEntityUsageBlockTrackingHook() {
$this->container
->get('module_installer')
->install([
'image',
'media',
'path',
'views',
'entity_usage_test',
]);
$entity = $this->testEntities[0];
$field_name = 'body';
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->registerUsage($entity
->id(), $entity
->getEntityTypeId(), 1, 'foo', 'en', 0, 'entity_reference', $field_name, 31);
$real_usage = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [
'count',
])
->condition('e.target_id', $entity
->id())
->execute()
->fetchField();
$this
->assertEquals(0, $real_usage);
$this->injectedDatabase
->truncate($this->tableName);
}
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,
'method' => 'entity_reference',
'field_name' => 'body',
'count' => 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);
$this
->assertSame($event['method'], NULL);
$this
->assertSame($event['field_name'], NULL);
$this
->assertSame($event['count'], NULL);
$count = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [
'count',
])
->condition('e.target_type', $entity_type)
->execute()
->fetchField();
$this
->assertSame(FALSE, $count);
$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,
'method' => 'entity_reference',
'field_name' => 'body',
'count' => 1,
])
->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);
$this
->assertSame($event['method'], NULL);
$this
->assertSame($event['field_name'], NULL);
$this
->assertSame($event['count'], NULL);
$count = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e', [
'count',
])
->condition('e.source_type', $entity_type)
->execute()
->fetchField();
$this
->assertSame(FALSE, $count);
$this->injectedDatabase
->truncate($this->tableName);
}
public function testDeleteByField() {
$entity_type = $this->testEntities[0]
->getEntityTypeId();
$i = 0;
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,
'method' => 'entity_reference',
'field_name' => 'body' . $i++,
'count' => 1,
])
->execute();
}
$entity_usage = $this->container
->get('entity_usage.usage');
$entity_usage
->deleteByField($entity_type, 'body1');
$event = \Drupal::state()
->get('entity_usage_events_test.usage_delete_by_field', []);
$this
->assertSame($event['event_name'], Events::DELETE_BY_FIELD);
$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);
$this
->assertSame($event['method'], NULL);
$this
->assertSame($event['field_name'], 'body1');
$this
->assertSame($event['count'], NULL);
$result = $this->injectedDatabase
->select($this->tableName, 'e')
->fields('e')
->condition('e.source_type', $entity_type)
->execute()
->fetchAll();
$source_vid = $this->testEntities[0] instanceof RevisionableInterface && $this->testEntities[0]
->getRevisionId() ? $this->testEntities[0]
->getRevisionId() : 0;
$expected_result = [
'target_id' => '1',
'target_id_string' => NULL,
'target_type' => 'foo',
'source_id' => (string) $this->testEntities[0]
->id(),
'source_id_string' => NULL,
'source_type' => $entity_type,
'source_langcode' => $this->testEntities[0]
->language()
->getId(),
'source_vid' => $source_vid,
'method' => 'entity_reference',
'field_name' => 'body0',
'count' => 1,
];
$this
->assertEquals([
(object) $expected_result,
], $result);
$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,
'method' => 'entity_reference',
'field_name' => 'body',
'count' => 1,
])
->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);
$this
->assertSame($event['method'], NULL);
$this
->assertSame($event['field_name'], NULL);
$this
->assertSame($event['count'], NULL);
$real_target_list = $entity_usage
->listTargets($this->testEntities[1]);
$expected_target_list = [
'fake_type_2' => [
'2' => [
0 => [
'method' => 'entity_reference',
'field_name' => 'body',
'count' => '1',
],
],
],
];
$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,
'method' => 'entity_reference',
'field_name' => 'body' . $i,
'count' => 1,
])
->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);
$this
->assertSame($event['method'], NULL);
$this
->assertSame($event['field_name'], NULL);
$this
->assertSame($event['count'], NULL);
$real_source_list = $entity_usage
->listSources($this->testEntities[1]);
$expected_source_list = [
'fake_type_2' => [
'2' => [
0 => [
'source_langcode' => 'en',
'source_vid' => '2',
'method' => 'entity_reference',
'field_name' => 'body2',
'count' => 1,
],
],
],
];
$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);
}
public function testEntityUsageLegacyMethods() {
$target_entity = $this->testEntities[0];
$source_entity = $this->testEntities[1];
$source_vid = $source_entity instanceof RevisionableInterface && $source_entity
->getRevisionId() ? $source_entity
->getRevisionId() : 0;
$field_name = 'body';
$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,
'method' => 'entity_reference',
'field_name' => $field_name,
'count' => 2,
])
->execute();
$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 + 1,
'method' => 'entity_reference',
'field_name' => $field_name,
'count' => 3,
])
->execute();
$entity_usage = $this->container
->get('entity_usage.usage');
$real_usage_list = $entity_usage
->listUsage($target_entity);
$expected_usage_list = [
$source_entity
->getEntityTypeId() => [
(string) $source_entity
->id() => 5,
],
];
$this
->assertEquals($expected_usage_list, $real_usage_list);
$real_target_list = $entity_usage
->listReferencedEntities($source_entity);
$expected_target_list = [
$target_entity
->getEntityTypeId() => [
(string) $target_entity
->id() => 5,
],
];
$this
->assertEquals($expected_target_list, $real_target_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(),
'method' => $event
->getMethod(),
'field_name' => $event
->getFieldName(),
'count' => $event
->getCount(),
]);
}
public function usageDeleteByFieldEventRecorder(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(),
'method' => $event
->getMethod(),
'field_name' => $event
->getFieldName(),
'count' => $event
->getCount(),
]);
}
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(),
'method' => $event
->getMethod(),
'field_name' => $event
->getFieldName(),
'count' => $event
->getCount(),
]);
}
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(),
'method' => $event
->getMethod(),
'field_name' => $event
->getFieldName(),
'count' => $event
->getCount(),
]);
}
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(),
'method' => $event
->getMethod(),
'field_name' => $event
->getFieldName(),
'count' => $event
->getCount(),
]);
}
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(),
'method' => $event
->getMethod(),
'field_name' => $event
->getFieldName(),
'count' => $event
->getCount(),
]);
}
}