EntityTypedDataDefinitionTest.php 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. <?php
  2. namespace Drupal\KernelTests\Core\Entity;
  3. use Drupal\Core\Entity\TypedData\EntityDataDefinition;
  4. use Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface;
  5. use Drupal\Core\Field\BaseFieldDefinition;
  6. use Drupal\Core\Field\FieldDefinitionInterface;
  7. use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
  8. use Drupal\Core\TypedData\DataReferenceDefinition;
  9. use Drupal\Core\TypedData\DataReferenceDefinitionInterface;
  10. use Drupal\Core\TypedData\ListDataDefinitionInterface;
  11. use Drupal\KernelTests\KernelTestBase;
  12. /**
  13. * Tests deriving metadata of entity and field data types.
  14. *
  15. * @group Entity
  16. */
  17. class EntityTypedDataDefinitionTest extends KernelTestBase {
  18. /**
  19. * The typed data manager to use.
  20. *
  21. * @var \Drupal\Core\TypedData\TypedDataManager
  22. */
  23. protected $typedDataManager;
  24. /**
  25. * Modules to enable.
  26. *
  27. * @var array
  28. */
  29. public static $modules = ['filter', 'text', 'node', 'user'];
  30. protected function setUp() {
  31. parent::setup();
  32. $this->typedDataManager = $this->container->get('typed_data_manager');
  33. }
  34. /**
  35. * Tests deriving metadata about fields.
  36. */
  37. public function testFields() {
  38. $field_definition = BaseFieldDefinition::create('integer');
  39. // Fields are lists of complex data.
  40. $this->assertTrue($field_definition instanceof ListDataDefinitionInterface);
  41. $this->assertFalse($field_definition instanceof ComplexDataDefinitionInterface);
  42. $field_item_definition = $field_definition->getItemDefinition();
  43. $this->assertFalse($field_item_definition instanceof ListDataDefinitionInterface);
  44. $this->assertTrue($field_item_definition instanceof ComplexDataDefinitionInterface);
  45. // Derive metadata about field item properties.
  46. $this->assertEqual(array_keys($field_item_definition->getPropertyDefinitions()), ['value']);
  47. $this->assertEqual($field_item_definition->getPropertyDefinition('value')->getDataType(), 'integer');
  48. $this->assertEqual($field_item_definition->getMainPropertyName(), 'value');
  49. $this->assertNull($field_item_definition->getPropertyDefinition('invalid'));
  50. // Test accessing field item property metadata via the field definition.
  51. $this->assertTrue($field_definition instanceof FieldDefinitionInterface);
  52. $this->assertEqual(array_keys($field_definition->getPropertyDefinitions()), ['value']);
  53. $this->assertEqual($field_definition->getPropertyDefinition('value')->getDataType(), 'integer');
  54. $this->assertEqual($field_definition->getMainPropertyName(), 'value');
  55. $this->assertNull($field_definition->getPropertyDefinition('invalid'));
  56. // Test using the definition factory for field item lists and field items.
  57. $field_item = $this->typedDataManager->createDataDefinition('field_item:integer');
  58. $this->assertFalse($field_item instanceof ListDataDefinitionInterface);
  59. $this->assertTrue($field_item instanceof ComplexDataDefinitionInterface);
  60. // Comparison should ignore the internal static cache, so compare the
  61. // serialized objects instead.
  62. $this->assertEqual(serialize($field_item_definition), serialize($field_item));
  63. $field_definition2 = $this->typedDataManager->createListDataDefinition('field_item:integer');
  64. $this->assertTrue($field_definition2 instanceof ListDataDefinitionInterface);
  65. $this->assertFalse($field_definition2 instanceof ComplexDataDefinitionInterface);
  66. $this->assertEqual(serialize($field_definition), serialize($field_definition2));
  67. }
  68. /**
  69. * Tests deriving metadata about entities.
  70. */
  71. public function testEntities() {
  72. $entity_definition = EntityDataDefinition::create('node');
  73. // Entities are complex data.
  74. $this->assertFalse($entity_definition instanceof ListDataDefinitionInterface);
  75. $this->assertTrue($entity_definition instanceof ComplexDataDefinitionInterface);
  76. $field_definitions = $entity_definition->getPropertyDefinitions();
  77. // Comparison should ignore the internal static cache, so compare the
  78. // serialized objects instead.
  79. $this->assertEqual(serialize($field_definitions), serialize(\Drupal::entityManager()->getBaseFieldDefinitions('node')));
  80. $this->assertEqual($entity_definition->getPropertyDefinition('title')->getItemDefinition()->getDataType(), 'field_item:string');
  81. $this->assertNull($entity_definition->getMainPropertyName());
  82. $this->assertNull($entity_definition->getPropertyDefinition('invalid'));
  83. $entity_definition2 = $this->typedDataManager->createDataDefinition('entity:node');
  84. $this->assertFalse($entity_definition2 instanceof ListDataDefinitionInterface);
  85. $this->assertTrue($entity_definition2 instanceof ComplexDataDefinitionInterface);
  86. $this->assertEqual(serialize($entity_definition), serialize($entity_definition2));
  87. // Test that the definition factory creates the right definitions for all
  88. // entity data types variants.
  89. $this->assertEqual(serialize($this->typedDataManager->createDataDefinition('entity')), serialize(EntityDataDefinition::create()));
  90. $this->assertEqual(serialize($this->typedDataManager->createDataDefinition('entity:node')), serialize(EntityDataDefinition::create('node')));
  91. // Config entities don't support typed data.
  92. $entity_definition = EntityDataDefinition::create('node_type');
  93. $this->assertEqual([], $entity_definition->getPropertyDefinitions());
  94. }
  95. /**
  96. * Tests deriving metadata from entity references.
  97. */
  98. public function testEntityReferences() {
  99. $reference_definition = DataReferenceDefinition::create('entity');
  100. $this->assertTrue($reference_definition instanceof DataReferenceDefinitionInterface);
  101. // Test retrieving metadata about the referenced data.
  102. $this->assertEqual($reference_definition->getTargetDefinition()->getDataType(), 'entity');
  103. $this->assertTrue($reference_definition->getTargetDefinition() instanceof EntityDataDefinitionInterface);
  104. // Test that the definition factory creates the right definition object.
  105. $reference_definition2 = $this->typedDataManager->createDataDefinition('entity_reference');
  106. $this->assertTrue($reference_definition2 instanceof DataReferenceDefinitionInterface);
  107. $this->assertEqual(serialize($reference_definition2), serialize($reference_definition));
  108. }
  109. }