Issue #3218660 by alexpott: help_topics module can break during module uninstall
parent
2c57cbec9a
commit
257efe5439
|
@ -523,12 +523,12 @@ class ModuleInstaller implements ModuleInstallerInterface {
|
||||||
// into its statically cached list.
|
// into its statically cached list.
|
||||||
\Drupal::service('extension.list.module')->reset();
|
\Drupal::service('extension.list.module')->reset();
|
||||||
|
|
||||||
// Clear plugin manager caches.
|
|
||||||
\Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
|
|
||||||
|
|
||||||
// Update the kernel to exclude the uninstalled modules.
|
// Update the kernel to exclude the uninstalled modules.
|
||||||
$this->updateKernel($module_filenames);
|
$this->updateKernel($module_filenames);
|
||||||
|
|
||||||
|
// Clear plugin manager caches.
|
||||||
|
\Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
|
||||||
|
|
||||||
// Update the theme registry to remove the newly uninstalled module.
|
// Update the theme registry to remove the newly uninstalled module.
|
||||||
drupal_theme_rebuild();
|
drupal_theme_rebuild();
|
||||||
|
|
||||||
|
|
|
@ -263,6 +263,28 @@ class HelpTopicSearchTest extends HelpTopicTranslatedTestBase {
|
||||||
$this->assertSession()->statusCodeEquals(200);
|
$this->assertSession()->statusCodeEquals(200);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests uninstalling the search module.
|
||||||
|
*/
|
||||||
|
public function testUninstallSearch() {
|
||||||
|
// Ensure we can uninstall search and use the help system without
|
||||||
|
// breaking.
|
||||||
|
$this->drupalLogin($this->rootUser);
|
||||||
|
$edit = [];
|
||||||
|
$edit['uninstall[search]'] = TRUE;
|
||||||
|
$this->drupalGet('admin/modules/uninstall');
|
||||||
|
$this->submitForm($edit, 'Uninstall');
|
||||||
|
$this->submitForm([], 'Uninstall');
|
||||||
|
$this->assertSession()->pageTextContains('The selected modules have been uninstalled.');
|
||||||
|
$this->drupalGet('admin/help');
|
||||||
|
$this->assertSession()->statusCodeEquals(200);
|
||||||
|
|
||||||
|
// Rebuild the container to reflect the latest changes.
|
||||||
|
$this->rebuildContainer();
|
||||||
|
$this->assertTrue(\Drupal::moduleHandler()->moduleExists('help_topics'), 'The help_topics module is still installed.');
|
||||||
|
$this->assertFalse(\Drupal::moduleHandler()->moduleExists('search'), 'The search module is uninstalled.');
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Asserts that help search returned the expected number of results.
|
* Asserts that help search returned the expected number of results.
|
||||||
*
|
*
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
services:
|
||||||
|
# Tests module uninstall
|
||||||
|
plugin.manager.module_test.cache_clear_test:
|
||||||
|
class: Drupal\module_test\PluginManagerCacheClearer
|
||||||
|
arguments: ['@state', '@?logger.dblog']
|
||||||
|
tags:
|
||||||
|
- { name: plugin_manager_cache_clear }
|
|
@ -0,0 +1,47 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Drupal\module_test;
|
||||||
|
|
||||||
|
use Drupal\Core\Plugin\DefaultPluginManager;
|
||||||
|
use Drupal\Core\State\StateInterface;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Helps test module uninstall.
|
||||||
|
*/
|
||||||
|
class PluginManagerCacheClearer extends DefaultPluginManager {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var \Drupal\Core\State\StateInterface
|
||||||
|
*/
|
||||||
|
protected $state;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* An optional service dependency.
|
||||||
|
*
|
||||||
|
* @var object|null
|
||||||
|
*/
|
||||||
|
protected $optionalService;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PluginManagerCacheClearer constructor.
|
||||||
|
*
|
||||||
|
* @param \Drupal\Core\State\StateInterface $state
|
||||||
|
* The state service for recording what happens.
|
||||||
|
* @param null $optional_service
|
||||||
|
* An optional service for testing.
|
||||||
|
*/
|
||||||
|
public function __construct(StateInterface $state, $optional_service = NULL) {
|
||||||
|
$this->state = $state;
|
||||||
|
$this->optionalService = $optional_service;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests call to CachedDiscoveryInterface::clearCachedDefinitions().
|
||||||
|
*
|
||||||
|
* @see \Drupal\Component\Plugin\Discovery\CachedDiscoveryInterface::clearCachedDefinitions()
|
||||||
|
*/
|
||||||
|
public function clearCachedDefinitions() {
|
||||||
|
$this->state->set(self::class, isset($this->optionalService));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -3,6 +3,7 @@
|
||||||
namespace Drupal\Tests\system\Kernel\Installer;
|
namespace Drupal\Tests\system\Kernel\Installer;
|
||||||
|
|
||||||
use Drupal\KernelTests\KernelTestBase;
|
use Drupal\KernelTests\KernelTestBase;
|
||||||
|
use Drupal\module_test\PluginManagerCacheClearer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tests the uninstallation of modules.
|
* Tests the uninstallation of modules.
|
||||||
|
@ -48,4 +49,24 @@ class UninstallKernelTest extends KernelTestBase {
|
||||||
\Drupal::service('module_installer')->uninstall(['file']);
|
\Drupal::service('module_installer')->uninstall(['file']);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Tests uninstalling a module with a plugin cache clearer service.
|
||||||
|
*/
|
||||||
|
public function testUninstallPluginCacheClear() {
|
||||||
|
\Drupal::service('module_installer')->install(['module_test']);
|
||||||
|
$this->assertFalse($this->container->get('state')->get(PluginManagerCacheClearer::class));
|
||||||
|
\Drupal::service('module_installer')->install(['dblog']);
|
||||||
|
$this->assertTrue($this->container->get('state')->get(PluginManagerCacheClearer::class));
|
||||||
|
|
||||||
|
// The plugin cache clearer service should be called during dblog uninstall
|
||||||
|
// without the dependency.
|
||||||
|
\Drupal::service('module_installer')->uninstall(['dblog']);
|
||||||
|
$this->assertFalse($this->container->get('state')->get(PluginManagerCacheClearer::class));
|
||||||
|
|
||||||
|
// The service should not be called during module_test uninstall.
|
||||||
|
$this->container->get('state')->delete(PluginManagerCacheClearer::class);
|
||||||
|
\Drupal::service('module_installer')->uninstall(['module_test']);
|
||||||
|
$this->assertNull($this->container->get('state')->get(PluginManagerCacheClearer::class));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue