Issue #2664292 by harings_rob, xjm, Spokje, claudiu.cristea, bircher, dawehner, alexpott, klausi: Convert Module\InstallTest into a Kernel test

merge-requests/2965/head
Alex Pott 2023-01-03 09:39:39 +00:00
parent 4b58966440
commit 8a2f6514b7
No known key found for this signature in database
GPG Key ID: BDA67E7EE836E5CE
2 changed files with 122 additions and 102 deletions

View File

@ -1,102 +0,0 @@
<?php
namespace Drupal\Tests\system\Functional\Module;
use Drupal\Component\Render\FormattableMarkup;
use Drupal\Core\Database\Database;
use Drupal\Core\Extension\ExtensionNameLengthException;
use Drupal\Tests\BrowserTestBase;
/**
* Tests the installation of modules.
*
* @group Module
*/
class InstallTest extends BrowserTestBase {
/**
* Modules to enable.
*
* @var array
*/
protected static $modules = ['module_test'];
/**
* {@inheritdoc}
*/
protected $defaultTheme = 'stark';
/**
* Verify that module's schema can be used during module installation.
*/
public function testGetSchemaAtInstallTime() {
// @see module_test_install()
$value = Database::getConnection()->select('module_test', 'mt')->fields('mt', ['data'])->execute()->fetchField();
$this->assertSame('varchar', $value);
}
/**
* Tests enabling User module once more.
*
* Regression: The installer might enable a module twice due to automatic
* dependency resolution. A bug caused the stored weight for User module to
* be an array.
*/
public function testEnableUserTwice() {
\Drupal::service('module_installer')->install(['user'], FALSE);
$this->assertSame(0, $this->config('core.extension')->get('module.user'));
}
/**
* Tests recorded schema versions of early installed modules in the installer.
*/
public function testRequiredModuleSchemaVersions() {
/** @var \Drupal\Core\Update\UpdateHookRegistry $update_registry */
$update_registry = \Drupal::service('update.update_hook_registry');
$version = $update_registry->getInstalledVersion('system');
$this->assertGreaterThan(0, $version);
$version = $update_registry->getInstalledVersion('user');
$this->assertGreaterThan(0, $version);
$post_update_key_value = \Drupal::keyValue('post_update');
$existing_updates = $post_update_key_value->get('existing_updates', []);
$this->assertContains('module_test_post_update_test', $existing_updates);
}
/**
* Ensures that post update functions are removed on uninstall.
*/
public function testUninstallPostUpdateFunctions() {
\Drupal::service('module_installer')->uninstall(['module_test']);
$post_update_key_value = \Drupal::keyValue('post_update');
$existing_updates = $post_update_key_value->get('existing_updates', []);
$this->assertNotContains('module_test_post_update_test', $existing_updates);
}
/**
* Tests that an exception is thrown when a module name is too long.
*/
public function testModuleNameLength() {
$module_name = 'invalid_module_name_over_the_maximum_allowed_character_length';
$message = new FormattableMarkup('Exception thrown when enabling module %name with a name length over the allowed maximum', ['%name' => $module_name]);
try {
$this->container->get('module_installer')->install([$module_name]);
$this->fail($message);
}
catch (\Exception $e) {
$this->assertInstanceOf(ExtensionNameLengthException::class, $e);
}
// Since for the UI, the submit callback uses FALSE, test that too.
$message = new FormattableMarkup('Exception thrown when enabling as if via the UI the module %name with a name length over the allowed maximum', ['%name' => $module_name]);
try {
$this->container->get('module_installer')->install([$module_name], FALSE);
$this->fail($message);
}
catch (\Exception $e) {
$this->assertInstanceOf(ExtensionNameLengthException::class, $e);
}
}
}

View File

@ -0,0 +1,122 @@
<?php
namespace Drupal\Tests\system\Kernel\Module;
use Drupal\Core\Extension\ExtensionNameLengthException;
use Drupal\Core\Extension\ModuleInstallerInterface;
use Drupal\KernelTests\KernelTestBase;
/**
* Tests the installation of modules.
*
* @group Module
*/
class InstallTest extends KernelTestBase {
/**
* The module installer service.
*/
protected ModuleInstallerInterface $moduleInstaller;
/**
* {@inheritdoc}
*/
protected function setUp(): void {
parent::setUp();
$this->moduleInstaller = $this->container->get('module_installer');
$this->moduleInstaller->install([
'module_test',
'system',
'user',
]);
}
/**
* Verify that drupal_get_schema() can be used during module installation.
*/
public function testGetSchemaAtInstallTime(): void {
// @see module_test_install()
$database = $this->container->get('database');
$value = $database->select('module_test')
->fields('module_test', ['data'])
->execute()
->fetchField();
$this->assertEquals('varchar', $value);
}
/**
* Tests enabling User module once more.
*
* Regression: The installer might enable a module twice due to automatic
* dependency resolution. A bug caused the stored weight for user.module to
* be an array.
*/
public function testEnableUserTwice(): void {
$this->moduleInstaller->install(['user'], FALSE);
$this->assertSame(0, $this->config('core.extension')->get('module.user'));
// To avoid false positives, ensure that a module that does not exist does
// not return exactly zero.
$this->assertNotSame(0, $this->config('core.extension')
->get('module.does_not_exist'));
}
/**
* Tests recorded schema versions of early installed modules in the installer.
*/
public function testRequiredModuleSchemaVersions(): void {
/** @var \Drupal\Core\Update\UpdateHookRegistry $update_registry */
$update_registry = \Drupal::service('update.update_hook_registry');
$version = $update_registry->getInstalledVersion('system');
$this->assertGreaterThan(0, $version);
$version = $update_registry->getInstalledVersion('user');
$this->assertGreaterThan(0, $version);
$post_update_key_value = \Drupal::keyValue('post_update');
$existing_updates = $post_update_key_value->get('existing_updates', []);
$this->assertContains('module_test_post_update_test', $existing_updates);
}
/**
* Ensures that post update functions are removed on uninstallation.
*/
public function testUninstallPostUpdateFunctions(): void {
// First, to avoid false positives, ensure that the post_update function
// exists while the module is still installed.
$post_update_key_value = $this->container->get('keyvalue')
->get('post_update');
$existing_updates = $post_update_key_value->get('existing_updates', []);
$this->assertContains('module_test_post_update_test', $existing_updates);
// Uninstall the module.
$this->moduleInstaller->uninstall(['module_test']);
// Ensure the post update function is no longer listed.
$existing_updates = $post_update_key_value->get('existing_updates', []);
$this->assertNotContains('module_test_post_update_test', $existing_updates);
}
/**
* Tests that an exception is thrown when a module name is too long.
*/
public function testModuleNameLength(): void {
$module_name = 'invalid_module_name_over_the_maximum_allowed_character_length';
$this->expectException(ExtensionNameLengthException::class);
$this->expectExceptionMessage("Module name 'invalid_module_name_over_the_maximum_allowed_character_length' is over the maximum allowed length of 50 characters");
$this->moduleInstaller->install([$module_name]);
}
/**
* Tests that an exception is thrown when a module name is too long.
*
* We do this without checking dependencies for the module to install.
*/
public function testModuleNameLengthWithoutDependencyCheck(): void {
$module_name = 'invalid_module_name_over_the_maximum_allowed_character_length';
$this->expectException(ExtensionNameLengthException::class);
$this->expectExceptionMessage("Module name 'invalid_module_name_over_the_maximum_allowed_character_length' is over the maximum allowed length of 50 characters");
$this->moduleInstaller->install([$module_name], FALSE);
}
}