EntityTypedDataDefinitionTest.php

Same filename in other branches
  1. 9 core/tests/Drupal/KernelTests/Core/Entity/EntityTypedDataDefinitionTest.php
  2. 8.9.x core/tests/Drupal/KernelTests/Core/Entity/EntityTypedDataDefinitionTest.php
  3. 11.x core/tests/Drupal/KernelTests/Core/Entity/EntityTypedDataDefinitionTest.php

Namespace

Drupal\KernelTests\Core\Entity

File

core/tests/Drupal/KernelTests/Core/Entity/EntityTypedDataDefinitionTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\KernelTests\Core\Entity;

use Drupal\Core\Config\Entity\ConfigEntityInterface;
use Drupal\Core\Entity\EntityTypeManagerInterface;
use Drupal\Core\Entity\EntityTypeInterface;
use Drupal\Core\Entity\TypedData\EntityDataDefinition;
use Drupal\Core\Entity\TypedData\EntityDataDefinitionInterface;
use Drupal\Core\Field\BaseFieldDefinition;
use Drupal\Core\Field\FieldDefinitionInterface;
use Drupal\Core\TypedData\ComplexDataDefinitionInterface;
use Drupal\Core\TypedData\DataReferenceDefinition;
use Drupal\Core\TypedData\DataReferenceDefinitionInterface;
use Drupal\Core\TypedData\ListDataDefinitionInterface;
use Drupal\entity_test\Entity\EntityTestBundle;
use Drupal\KernelTests\KernelTestBase;

/**
 * Tests deriving metadata of entity and field data types.
 *
 * @group Entity
 */
class EntityTypedDataDefinitionTest extends KernelTestBase {
    
    /**
     * The typed data manager to use.
     *
     * @var \Drupal\Core\TypedData\TypedDataManager
     */
    protected $typedDataManager;
    
    /**
     * {@inheritdoc}
     */
    protected static $modules = [
        'system',
        'filter',
        'text',
        'entity_test',
        'user',
    ];
    
    /**
     * {@inheritdoc}
     */
    protected function setUp() : void {
        parent::setUp();
        $this->installEntitySchema('entity_test');
        $this->typedDataManager = $this->container
            ->get('typed_data_manager');
    }
    
    /**
     * Tests deriving metadata about fields.
     */
    public function testFields() : void {
        $field_definition = BaseFieldDefinition::create('integer');
        // Fields are lists of complex data.
        $this->assertInstanceOf(ListDataDefinitionInterface::class, $field_definition);
        $this->assertNotInstanceOf(ComplexDataDefinitionInterface::class, $field_definition);
        $field_item_definition = $field_definition->getItemDefinition();
        $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $field_item_definition);
        $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $field_item_definition);
        // Derive metadata about field item properties.
        $this->assertEquals([
            'value',
        ], array_keys($field_item_definition->getPropertyDefinitions()));
        $this->assertEquals('integer', $field_item_definition->getPropertyDefinition('value')
            ->getDataType());
        $this->assertEquals('value', $field_item_definition->getMainPropertyName());
        $this->assertNull($field_item_definition->getPropertyDefinition('invalid'));
        // Test accessing field item property metadata via the field definition.
        $this->assertInstanceOf(FieldDefinitionInterface::class, $field_definition);
        $this->assertEquals([
            'value',
        ], array_keys($field_definition->getPropertyDefinitions()));
        $this->assertEquals('integer', $field_definition->getPropertyDefinition('value')
            ->getDataType());
        $this->assertEquals('value', $field_definition->getMainPropertyName());
        $this->assertNull($field_definition->getPropertyDefinition('invalid'));
        // Test using the definition factory for field item lists and field items.
        $field_item = $this->typedDataManager
            ->createDataDefinition('field_item:integer');
        $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $field_item);
        $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $field_item);
        // Comparison should ignore the internal static cache, so compare the
        // serialized objects instead.
        $this->assertEquals(serialize($field_item_definition), serialize($field_item));
        $field_definition2 = $this->typedDataManager
            ->createListDataDefinition('field_item:integer');
        $this->assertInstanceOf(ListDataDefinitionInterface::class, $field_definition2);
        $this->assertNotInstanceOf(ComplexDataDefinitionInterface::class, $field_definition2);
        $this->assertEquals(serialize($field_definition), serialize($field_definition2));
    }
    
    /**
     * Tests deriving metadata about entities.
     */
    public function testEntities() : void {
        $this->installEntitySchema('entity_test_with_bundle');
        EntityTestBundle::create([
            'id' => 'article',
            'label' => 'Article',
        ])->save();
        $entity_definition = EntityDataDefinition::create('entity_test_with_bundle');
        $bundle_definition = EntityDataDefinition::create('entity_test_with_bundle', 'article');
        // Entities are complex data.
        $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $entity_definition);
        $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $entity_definition);
        // Entity definitions should inherit their labels from the entity type.
        $this->assertEquals('Test entity with bundle', $entity_definition->getLabel());
        $this->assertEquals('Article', $bundle_definition->getLabel());
        $field_definitions = $entity_definition->getPropertyDefinitions();
        // Comparison should ignore the internal static cache, so compare the
        // serialized objects instead.
        $this->assertEquals(serialize(\Drupal::service('entity_field.manager')->getBaseFieldDefinitions('entity_test_with_bundle')), serialize($field_definitions));
        $this->assertEquals('field_item:string', $entity_definition->getPropertyDefinition('name')
            ->getItemDefinition()
            ->getDataType());
        $this->assertNull($entity_definition->getMainPropertyName());
        $this->assertNull($entity_definition->getPropertyDefinition('invalid'));
        $entity_definition2 = $this->typedDataManager
            ->createDataDefinition('entity:entity_test_with_bundle');
        $this->assertNotInstanceOf(ListDataDefinitionInterface::class, $entity_definition2);
        $this->assertInstanceOf(ComplexDataDefinitionInterface::class, $entity_definition2);
        $this->assertEquals(serialize($entity_definition), serialize($entity_definition2));
        // Test that the definition factory creates the right definitions for all
        // entity data types variants.
        $this->assertEquals(serialize(EntityDataDefinition::create()), serialize($this->typedDataManager
            ->createDataDefinition('entity')));
        $this->assertEquals(serialize(EntityDataDefinition::create('entity_test_with_bundle')), serialize($this->typedDataManager
            ->createDataDefinition('entity:entity_test_with_bundle')));
        // Config entities don't support typed data.
        $entity_definition = EntityDataDefinition::create('entity_test_bundle');
        $this->assertEquals([], $entity_definition->getPropertyDefinitions());
    }
    
    /**
     * Tests deriving metadata from entity references.
     */
    public function testEntityReferences() : void {
        $reference_definition = DataReferenceDefinition::create('entity');
        $this->assertInstanceOf(DataReferenceDefinitionInterface::class, $reference_definition);
        // Test retrieving metadata about the referenced data.
        $this->assertEquals('entity', $reference_definition->getTargetDefinition()
            ->getDataType());
        $this->assertInstanceOf(EntityDataDefinitionInterface::class, $reference_definition->getTargetDefinition());
        // Test that the definition factory creates the right definition object.
        $reference_definition2 = $this->typedDataManager
            ->createDataDefinition('entity_reference');
        $this->assertInstanceOf(DataReferenceDefinitionInterface::class, $reference_definition2);
        $this->assertEquals(serialize($reference_definition), serialize($reference_definition2));
    }
    
    /**
     * Tests that an entity annotation can mark the data definition as internal.
     *
     * @dataProvider entityDefinitionIsInternalProvider
     */
    public function testEntityDefinitionIsInternal($internal, $expected) : void {
        $entity_type_id = $this->randomMachineName();
        $entity_type = $this->prophesize(EntityTypeInterface::class);
        $entity_type->entityClassImplements(ConfigEntityInterface::class)
            ->willReturn(FALSE);
        $entity_type->getKey('bundle')
            ->willReturn(FALSE);
        $entity_type->getLabel()
            ->willReturn($this->randomString());
        $entity_type->getConstraints()
            ->willReturn([]);
        $entity_type->isInternal()
            ->willReturn($internal);
        $entity_type->getBundleEntityType()
            ->willReturn(NULL);
        $entity_type_manager = $this->prophesize(EntityTypeManagerInterface::class);
        $entity_type_manager->getDefinitions()
            ->willReturn([
            $entity_type_id => $entity_type->reveal(),
        ]);
        $this->container
            ->set('entity_type.manager', $entity_type_manager->reveal());
        $entity_data_definition = EntityDataDefinition::create($entity_type_id);
        $this->assertSame($expected, $entity_data_definition->isInternal());
    }
    
    /**
     * Provides test cases for testEntityDefinitionIsInternal.
     */
    public static function entityDefinitionIsInternalProvider() {
        return [
            'internal' => [
                TRUE,
                TRUE,
            ],
            'external' => [
                FALSE,
                FALSE,
            ],
            'undefined' => [
                NULL,
                FALSE,
            ],
        ];
    }

}

Classes

Title Deprecated Summary
EntityTypedDataDefinitionTest Tests deriving metadata of entity and field data types.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.