farm-2.x-dev/modules/core/entity/tests/src/Functional/FarmEntityBundleFieldTest.php
modules/core/entity/tests/src/Functional/FarmEntityBundleFieldTest.php
<?php namespace Drupal\Tests\farm_entity\Functional; use Drupal\Tests\farm_test\Functional\FarmBrowserTestBase; /** * Tests that bundle fields are created during a postponed install. * * @group farm */ class FarmEntityBundleFieldTest extends FarmBrowserTestBase { /** * The entity field manager. * * @var \Drupal\Core\Entity\EntityFieldManagerInterface */ protected $entityFieldManager; /** * The entity type manager. * * @var \Drupal\Core\Entity\EntityTypeManagerInterface */ protected $entityTypeManager; /** * The database connection. * * @var \Drupal\Core\Database\Connection */ protected $database; /** * The module installer service. * * @var \Drupal\Core\Extension\ModuleInstallerInterface */ protected $moduleInstaller; /** * {@inheritdoc} */ protected static $modules = [ 'farm_entity', 'farm_entity_test', 'farm_entity_bundle_fields_test', ]; /** * {@inheritdoc} */ protected function setUp():void { parent::setUp(); $this->entityFieldManager = $this->container->get('entity_field.manager'); $this->entityTypeManager = $this->container->get('entity_type.manager'); $this->database = $this->container->get('database'); $this->moduleInstaller = $this->container->get('module_installer'); } /** * Test installing the farm_entity_contrib_test module after farm_entity_test. */ public function testBundleFieldPostponedInstall() { // Install the farm_entity_contrib_test module. $result = $this->moduleInstaller->install(['farm_entity_contrib_test'], TRUE); $this->assertTrue($result); // Must clear the cache for the test environment. $this->entityFieldManager->clearCachedFieldDefinitions(); // Test bundle field definition exists. $fields = $this->entityFieldManager->getFieldDefinitions('log', 'test'); $this->assertArrayHasKey('test_contrib_hook_bundle_field', $fields); // Test log field storage definition exists. $this->assertFieldStorageDefinitionExists('log', 'test_contrib_hook_bundle_field'); // Save the contrib field storage definition for later. $installed_contrib_field_storage_definition = $this->entityFieldManager->getFieldStorageDefinitions('log')['test_contrib_hook_bundle_field']; // Uninstall the farm_entity_contrib_test module. $result = $this->moduleInstaller->uninstall(['farm_entity_contrib_test']); $this->assertTrue($result); // Must clear the cache for the test environment. $this->entityFieldManager->clearCachedFieldDefinitions(); // Test bundle field definition is deleted. $fields = $this->entityFieldManager->getFieldDefinitions('log', 'test'); $this->assertArrayNotHasKey('test_contrib_hook_bundle_field', $fields); // Test log field storage definition is deleted. $this->assertFieldStorageDefinitionExists('log', 'test_contrib_hook_bundle_field', FALSE); // Ensure the database table was deleted. /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ $table_mapping = $this->entityTypeManager->getStorage('log')->getTableMapping(); $table = $table_mapping->getDedicatedDataTableName($installed_contrib_field_storage_definition); $this->assertFalse($this->database->schema()->tableExists($table)); } /** * Test that bundle fields can be reused across bundles. */ public function testBundlePluginModuleUninstallation() { // Test that database tables exist after uninstalling a bundle with // a field storage definition used by other bundles. $this->moduleInstaller->uninstall(['farm_entity_bundle_fields_test']); // Must clear the cache for the test environment. $this->entityFieldManager->clearCachedFieldDefinitions(); // Test that correct field storage definitions and database tables exist. $test_fields = [ 'second_plan_field' => FALSE, 'asset' => TRUE, 'log' => TRUE, ]; foreach ($test_fields as $field_name => $exists) { $this->assertFieldStorageDefinitionExists('plan', $field_name, $exists); } } /** * Helper function to check the existence of field storage definitions. * * @param string $entity_type * The entity type to check. * @param string $field_name * The field name to check. * @param bool $exists * If the field should exists, defaults to TRUE. */ protected function assertFieldStorageDefinitionExists(string $entity_type, string $field_name, bool $exists = TRUE) { $field_storage_definitions = $this->entityFieldManager->getFieldStorageDefinitions($entity_type); // Test the field storage definition existence. $this->assertEquals($exists, array_key_exists($field_name, $field_storage_definitions)); // Test that the database table exists if the field storage definition // exists. if ($exists) { /** @var \Drupal\Core\Entity\Sql\DefaultTableMapping $table_mapping */ $table_mapping = $this->entityTypeManager->getStorage($entity_type)->getTableMapping(); $table = $table_mapping->getDedicatedDataTableName($field_storage_definitions[$field_name]); $this->assertTrue($this->database->schema()->tableExists($table)); } } }