You are here

public function ModuleHandlerTest::testUninstallContentDependency in Drupal 9

Same name and namespace in other branches
  1. 8 core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php \Drupal\Tests\system\Kernel\Extension\ModuleHandlerTest::testUninstallContentDependency()

Tests uninstalling a module that has content.

File

core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php, line 238

Class

ModuleHandlerTest
Tests ModuleHandler functionality.

Namespace

Drupal\Tests\system\Kernel\Extension

Code

public function testUninstallContentDependency() {
  $this
    ->enableModules([
    'module_test',
    'entity_test',
    'text',
    'user',
    'help',
  ]);
  $this
    ->assertTrue($this
    ->moduleHandler()
    ->moduleExists('entity_test'), 'Test module is enabled.');
  $this
    ->assertTrue($this
    ->moduleHandler()
    ->moduleExists('module_test'), 'Test module is enabled.');
  $this
    ->installSchema('user', 'users_data');
  $entity_types = \Drupal::entityTypeManager()
    ->getDefinitions();
  foreach ($entity_types as $entity_type) {
    if ('entity_test' == $entity_type
      ->getProvider()) {
      $this
        ->installEntitySchema($entity_type
        ->id());
    }
  }

  // Create a fake dependency.
  // entity_test will depend on help. This way help can not be uninstalled
  // when there is test content preventing entity_test from being uninstalled.
  \Drupal::state()
    ->set('module_test.dependency', 'dependency');

  // Create an entity so that the modules can not be disabled.
  $entity = EntityTest::create([
    'name' => $this
      ->randomString(),
  ]);
  $entity
    ->save();

  // Uninstalling entity_test is not possible when there is content.
  try {
    $message = 'ModuleInstaller::uninstall() throws ModuleUninstallValidatorException upon uninstalling a module which does not pass validation.';
    $this
      ->moduleInstaller()
      ->uninstall([
      'entity_test',
    ]);
    $this
      ->fail($message);
  } catch (ModuleUninstallValidatorException $e) {

    // Expected exception; just continue testing.
  }

  // Uninstalling help needs entity_test to be un-installable.
  try {
    $message = 'ModuleInstaller::uninstall() throws ModuleUninstallValidatorException upon uninstalling a module which does not pass validation.';
    $this
      ->moduleInstaller()
      ->uninstall([
      'help',
    ]);
    $this
      ->fail($message);
  } catch (ModuleUninstallValidatorException $e) {

    // Expected exception; just continue testing.
  }

  // Deleting the entity.
  $entity
    ->delete();

  /** @var \Drupal\Core\Update\UpdateHookRegistry $update_registry */
  $update_registry = \Drupal::service('update.update_hook_registry');
  $result = $this
    ->moduleInstaller()
    ->uninstall([
    'help',
  ]);
  $this
    ->assertTrue($result, 'ModuleInstaller::uninstall() returns TRUE.');
  $this
    ->assertEquals($update_registry::SCHEMA_UNINSTALLED, $update_registry
    ->getInstalledVersion('entity_test'), "entity_test module was uninstalled.");
}