EntityTypedDataDefinitionTest.php 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <?php
  2. namespace Drupal\KernelTests\Core\Entity;
  3. use Drupal\Core\Config\Entity\ConfigEntityInterface;
  4. use Drupal\Core\Entity\EntityTypeManagerInterface;
  5. use Drupal\Core\Entity\EntityTypeInterface;
  6. use Drupal\Core\Entity\TypedData\EntityDataDefinition;
  7. use Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface;
  8. use Drupal\Core\Field\BaseFieldDefinition;
  9. use Drupal\Core\Field\FieldDefinitionInterface;
  10. use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
  11. use Drupal\Core\TypedData\DataReferenceDefinition;
  12. use Drupal\Core\TypedData\DataReferenceDefinitionInterface;
  13. use Drupal\Core\TypedData\ListDataDefinitionInterface;
  14. use Drupal\KernelTests\KernelTestBase;
  15. use Drupal\node\Entity\NodeType;
  16. /**
  17. * Tests deriving metadata of entity and field data types.
  18. *
  19. * @group Entity
  20. */
  21. class EntityTypedDataDefinitionTest extends KernelTestBase {
  22. /**
  23. * The typed data manager to use.
  24. *
  25. * @var \Drupal\Core\TypedData\TypedDataManager
  26. */
  27. protected $typedDataManager;
  28. /**
  29. * Modules to enable.
  30. *
  31. * @var array
  32. */
  33. public static $modules = ['system', 'filter', 'text', 'node', 'user'];
  34. protected function setUp() {
  35. parent::setup();
  36. $this->typedDataManager = $this->container->get('typed_data_manager');
  37. }
  38. /**
  39. * Tests deriving metadata about fields.
  40. */
  41. public function testFields() {
  42. $field_definition = BaseFieldDefinition::create('integer');
  43. // Fields are lists of complex data.
  44. $this->assertInstanceOf(ListDataDefinitionInterface::class, $field_definition);
  45. $this->assertNotInstanceOf(ComplexDataDefinitionInterface::class, $field_definition);
  46. $field_item_definition = $field_definition->getItemDefinition();
  47. $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $field_item_definition);
  48. $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $field_item_definition);
  49. // Derive metadata about field item properties.
  50. $this->assertEqual(array_keys($field_item_definition->getPropertyDefinitions()), ['value']);
  51. $this->assertEqual($field_item_definition->getPropertyDefinition('value')->getDataType(), 'integer');
  52. $this->assertEqual($field_item_definition->getMainPropertyName(), 'value');
  53. $this->assertNull($field_item_definition->getPropertyDefinition('invalid'));
  54. // Test accessing field item property metadata via the field definition.
  55. $this->assertInstanceOf(FieldDefinitionInterface::class, $field_definition);
  56. $this->assertEqual(array_keys($field_definition->getPropertyDefinitions()), ['value']);
  57. $this->assertEqual($field_definition->getPropertyDefinition('value')->getDataType(), 'integer');
  58. $this->assertEqual($field_definition->getMainPropertyName(), 'value');
  59. $this->assertNull($field_definition->getPropertyDefinition('invalid'));
  60. // Test using the definition factory for field item lists and field items.
  61. $field_item = $this->typedDataManager->createDataDefinition('field_item:integer');
  62. $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $field_item);
  63. $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $field_item);
  64. // Comparison should ignore the internal static cache, so compare the
  65. // serialized objects instead.
  66. $this->assertEqual(serialize($field_item_definition), serialize($field_item));
  67. $field_definition2 = $this->typedDataManager->createListDataDefinition('field_item:integer');
  68. $this->assertInstanceOf(ListDataDefinitionInterface::class, $field_definition2);
  69. $this->assertNotInstanceOf(ComplexDataDefinitionInterface::class, $field_definition2);
  70. $this->assertEqual(serialize($field_definition), serialize($field_definition2));
  71. }
  72. /**
  73. * Tests deriving metadata about entities.
  74. */
  75. public function testEntities() {
  76. NodeType::create([
  77. 'type' => 'article',
  78. 'name' => 'Article',
  79. ])->save();
  80. $entity_definition = EntityDataDefinition::create('node');
  81. $bundle_definition = EntityDataDefinition::create('node', 'article');
  82. // Entities are complex data.
  83. $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $entity_definition);
  84. $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $entity_definition);
  85. // Entity definitions should inherit their labels from the entity type.
  86. $this->assertEquals('Content', $entity_definition->getLabel());
  87. $this->assertEquals('Article', $bundle_definition->getLabel());
  88. $field_definitions = $entity_definition->getPropertyDefinitions();
  89. // Comparison should ignore the internal static cache, so compare the
  90. // serialized objects instead.
  91. $this->assertEqual(serialize($field_definitions), serialize(\Drupal::service('entity_field.manager')->getBaseFieldDefinitions('node')));
  92. $this->assertEqual($entity_definition->getPropertyDefinition('title')->getItemDefinition()->getDataType(), 'field_item:string');
  93. $this->assertNull($entity_definition->getMainPropertyName());
  94. $this->assertNull($entity_definition->getPropertyDefinition('invalid'));
  95. $entity_definition2 = $this->typedDataManager->createDataDefinition('entity:node');
  96. $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $entity_definition2);
  97. $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $entity_definition2);
  98. $this->assertEqual(serialize($entity_definition), serialize($entity_definition2));
  99. // Test that the definition factory creates the right definitions for all
  100. // entity data types variants.
  101. $this->assertEqual(serialize($this->typedDataManager->createDataDefinition('entity')), serialize(EntityDataDefinition::create()));
  102. $this->assertEqual(serialize($this->typedDataManager->createDataDefinition('entity:node')), serialize(EntityDataDefinition::create('node')));
  103. // Config entities don't support typed data.
  104. $entity_definition = EntityDataDefinition::create('node_type');
  105. $this->assertEqual([], $entity_definition->getPropertyDefinitions());
  106. }
  107. /**
  108. * Tests deriving metadata from entity references.
  109. */
  110. public function testEntityReferences() {
  111. $reference_definition = DataReferenceDefinition::create('entity');
  112. $this->assertInstanceOf(DataReferenceDefinitionInterface::class, $reference_definition);
  113. // Test retrieving metadata about the referenced data.
  114. $this->assertEqual($reference_definition->getTargetDefinition()->getDataType(), 'entity');
  115. $this->assertInstanceOf(EntityDataDefinitionInterface::class, $reference_definition->getTargetDefinition());
  116. // Test that the definition factory creates the right definition object.
  117. $reference_definition2 = $this->typedDataManager->createDataDefinition('entity_reference');
  118. $this->assertInstanceOf(DataReferenceDefinitionInterface::class, $reference_definition2);
  119. $this->assertEqual(serialize($reference_definition2), serialize($reference_definition));
  120. }
  121. /**
  122. * Tests that an entity annotation can mark the data definition as internal.
  123. *
  124. * @dataProvider entityDefinitionIsInternalProvider
  125. */
  126. public function testEntityDefinitionIsInternal($internal, $expected) {
  127. $entity_type_id = $this->randomMachineName();
  128. $entity_type = $this->prophesize(EntityTypeInterface::class);
  129. $entity_type->entityClassImplements(ConfigEntityInterface::class)->willReturn(FALSE);
  130. $entity_type->getKey('bundle')->willReturn(FALSE);
  131. $entity_type->getLabel()->willReturn($this->randomString());
  132. $entity_type->getConstraints()->willReturn([]);
  133. $entity_type->isInternal()->willReturn($internal);
  134. $entity_type->getBundleEntityType()->willReturn(NULL);
  135. $entity_type_manager = $this->prophesize(EntityTypeManagerInterface::class);
  136. $entity_type_manager->getDefinitions()->willReturn([$entity_type_id => $entity_type->reveal()]);
  137. $this->container->set('entity_type.manager', $entity_type_manager->reveal());
  138. $entity_data_definition = EntityDataDefinition::create($entity_type_id);
  139. $this->assertSame($expected, $entity_data_definition->isInternal());
  140. }
  141. /**
  142. * Provides test cases for testEntityDefinitionIsInternal.
  143. */
  144. public function entityDefinitionIsInternalProvider() {
  145. return [
  146. 'internal' => [TRUE, TRUE],
  147. 'external' => [FALSE, FALSE],
  148. 'undefined' => [NULL, FALSE],
  149. ];
  150. }
  151. }