farm-2.x-dev/modules/core/entity/tests/src/Kernel/FarmEntityFieldTest.php
modules/core/entity/tests/src/Kernel/FarmEntityFieldTest.php
<?php namespace Drupal\Tests\farm_entity\Kernel; use Drupal\KernelTests\KernelTestBase; /** * Tests farmOS entity fields. * * @group farm */ class FarmEntityFieldTest extends KernelTestBase { /** * The entity field manager. * * @var \Drupal\Core\Entity\EntityFieldManagerInterface */ protected $entityFieldManager; /** * {@inheritdoc} */ protected $profile = 'farm'; /** * {@inheritdoc} */ protected static $modules = [ 'entity', 'asset', 'log', 'plan', 'farm_field', 'farm_entity', 'farm_entity_fields', 'farm_entity_test', 'farm_flag', 'farm_id_tag', 'farm_location', 'farm_log', 'farm_log_asset', 'farm_owner', 'farm_parent', ]; /** * {@inheritdoc} */ protected function setUp():void { parent::setUp(); $this->entityFieldManager = $this->container->get('entity_field.manager'); } /** * Test farmOS fields defined in hook_entity_base_field_info(). */ public function testHookEntityBaseFieldInfo() { // Test asset field storage definitions. $fields = $this->entityFieldManager->getFieldStorageDefinitions('asset'); $field_names = [ 'data', 'flag', 'file', 'id_tag', 'image', 'intrinsic_geometry', 'is_fixed', 'is_location', 'notes', 'owner', 'parent', ]; foreach ($field_names as $field_name) { $this->assertArrayHasKey($field_name, $fields, "The asset $field_name field exists."); } // Test parent field constraints. $parent_field_constraints = $fields['parent']->getConstraints(); $this->assertArrayHasKey('CircularReference', $parent_field_constraints); $this->assertArrayHasKey('DuplicateReference', $parent_field_constraints); // Test log field storage definitions. $fields = $this->entityFieldManager->getFieldStorageDefinitions('log'); $field_names = [ 'asset', 'data', 'flag', 'file', 'geometry', 'image', 'is_movement', 'location', 'notes', 'owner', 'test_hook_base_field', ]; foreach ($field_names as $field_name) { $this->assertArrayHasKey($field_name, $fields, "The log $field_name field exists."); } // Test plan field storage definitions. $fields = $this->entityFieldManager->getFieldStorageDefinitions('plan'); $field_names = [ 'data', 'flag', 'file', 'image', 'notes', ]; foreach ($field_names as $field_name) { $this->assertArrayHasKey($field_name, $fields, "The plan $field_name field exists."); } } /** * Test farmOS fields defined in hook_farm_entity_bundle_field_info(). */ public function testHookFarmEntityBundleFieldInfo() { // Get the log field storage definitions. $log_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions('log'); // Test that 'test_hook_bundle_field' has a storage definition with the // correct provider. $this->assertArrayHasKey('test_hook_bundle_field', $log_storage_definitions); $this->assertEquals('farm_entity_test', $log_storage_definitions['test_hook_bundle_field']->getProvider()); // Test fields definitions for the 'test' log type. $fields = $this->entityFieldManager->getFieldDefinitions('log', 'test'); $this->assertArrayHasKey('test_hook_bundle_field', $fields); // Test fields definitions for the 'test_override' log type. $fields = $this->entityFieldManager->getFieldDefinitions('log', 'test_override'); $this->assertArrayHasKey('test_hook_bundle_field', $fields); // Get all log bundles. /** @var \Drupal\Core\Entity\EntityTypeBundleInfoInterface $entity_type_bundle_info */ $entity_type_bundle_info = $this->container->get('entity_type.bundle.info'); $bundles = $entity_type_bundle_info->getBundleInfo('log'); // Test that all log types have a bundle specific field. foreach (array_keys($bundles) as $bundle) { $fields = $this->entityFieldManager->getFieldDefinitions('log', $bundle); $field_name = 'test_hook_bundle_' . $bundle . '_specific_field'; // Assert field storage definition exists and has the correct provider. $this->assertArrayHasKey($field_name, $log_storage_definitions); $this->assertEquals('farm_entity_test', $log_storage_definitions[$field_name]->getProvider()); // Assert field definition for the bundle. $this->assertArrayHasKey($field_name, $fields); } } /** * Test farmOS fields defined in buildFieldDefinitions(). */ public function testBuildFieldDefinitions() { // Test plan field definitions. $fields = $this->entityFieldManager->getFieldDefinitions('plan', 'test'); $this->assertArrayHasKey('asset', $fields); $this->assertArrayHasKey('log', $fields); } /** * Test that farmOS base fields can be overridden. */ public function testFarmFieldsOverride() { // Load field definitions for test_override logs. $fields = $this->entityFieldManager->getFieldDefinitions('log', 'test_override'); // Test that a module extending FarmLogType can remove default bundle fields // that were provided in parent plugin classes. $this->assertArrayNotHasKey('test_default_bundle_field', $fields); // But also confirm that a module extending a base log type can NOT remove // bundle fields that were provided by hook_farm_entity_bundle_field_info(). $this->assertArrayHasKey('test_hook_bundle_field', $fields); } }