function ModuleHandlerTest::testUninstallContentDependency

Same name and namespace in other branches
  1. 9 core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php \Drupal\Tests\system\Kernel\Extension\ModuleHandlerTest::testUninstallContentDependency()
  2. 8.9.x core/modules/system/tests/src/Kernel/Extension/ModuleHandlerTest.php \Drupal\Tests\system\Kernel\Extension\ModuleHandlerTest::testUninstallContentDependency()
  3. 10 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 263

Class

ModuleHandlerTest
Tests ModuleHandler functionality.

Namespace

Drupal\Tests\system\Kernel\Extension

Code

public function testUninstallContentDependency() : void {
    $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_type instanceof ContentEntityTypeInterface && '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.");
}

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