class ConfigImportThemeInstallTest in Drupal 10
Tests installing and uninstalling of themes via configuration import.
@group Extension
Hierarchy
- class \Drupal\KernelTests\KernelTestBase extends \PHPUnit\Framework\TestCase implements ServiceProviderInterface uses \Drupal\Tests\PhpUnitCompatibilityTrait, \Symfony\Bridge\PhpUnit\ExpectDeprecationTrait, AssertContentTrait, ConfigTestTrait, ExtensionListTestTrait, RandomGeneratorTrait, TestRequirementsTrait, PhpUnitWarnings
- class \Drupal\KernelTests\Core\Theme\ConfigImportThemeInstallTest
Expanded class hierarchy of ConfigImportThemeInstallTest
File
- core/
tests/ Drupal/ KernelTests/ Core/ Theme/ ConfigImportThemeInstallTest.php, line 13
Namespace
Drupal\KernelTests\Core\ThemeView source
class ConfigImportThemeInstallTest extends KernelTestBase {
/**
* Modules to enable.
*
* @var array
*/
protected static $modules = [
'system',
];
protected function setUp() : void {
parent::setUp();
$this
->installConfig([
'system',
]);
}
/**
* Tests config imports that install and uninstall a theme with dependencies.
*/
public function testConfigImportWithThemeWithModuleDependencies() {
$this->container
->get('module_installer')
->install([
'test_module_required_by_theme',
'test_another_module_required_by_theme',
]);
$this->container
->get('theme_installer')
->install([
'test_theme_depending_on_modules',
]);
$this
->assertTrue($this->container
->get('theme_handler')
->themeExists('test_theme_depending_on_modules'), 'test_theme_depending_on_modules theme installed');
$sync = $this->container
->get('config.storage.sync');
$this
->copyConfig($this->container
->get('config.storage'), $sync);
$extensions = $sync
->read('core.extension');
// Remove one of the modules the theme depends on.
unset($extensions['module']['test_module_required_by_theme']);
$sync
->write('core.extension', $extensions);
try {
$this
->configImporter()
->validate();
$this
->fail('ConfigImporterException not thrown; an invalid import was not stopped due to missing dependencies.');
} catch (ConfigImporterException $e) {
$error_message = 'Unable to uninstall the <em class="placeholder">Test Module Required by Theme</em> module because: Required by the theme: Test Theme Depending on Modules.';
$this
->assertStringContainsString($error_message, $e
->getMessage(), 'There were errors validating the config synchronization.');
$error_log = $this->configImporter
->getErrors();
$this
->assertEquals([
$error_message,
], $error_log);
}
// Remove the other module and the theme.
unset($extensions['module']['test_another_module_required_by_theme']);
unset($extensions['theme']['test_theme_depending_on_modules']);
$sync
->write('core.extension', $extensions);
$this
->configImporter()
->import();
$this
->assertFalse($this->container
->get('theme_handler')
->themeExists('test_theme_depending_on_modules'), 'test_theme_depending_on_modules theme uninstalled by configuration import');
// Try installing a theme with dependencies via config import.
$extensions['theme']['test_theme_depending_on_modules'] = 0;
$extensions['module']['test_another_module_required_by_theme'] = 0;
$sync
->write('core.extension', $extensions);
try {
$this
->configImporter()
->validate();
$this
->fail('ConfigImporterException not thrown; an invalid import was not stopped due to missing dependencies.');
} catch (ConfigImporterException $e) {
$error_message = 'Unable to install the <em class="placeholder">Test Theme Depending on Modules</em> theme since it requires the <em class="placeholder">Test Module Required by Theme</em> module.';
$this
->assertStringContainsString($error_message, $e
->getMessage(), 'There were errors validating the config synchronization.');
$error_log = $this->configImporter
->getErrors();
$this
->assertEquals([
$error_message,
], $error_log);
}
$extensions['module']['test_module_required_by_theme'] = 0;
$sync
->write('core.extension', $extensions);
$this
->configImporter()
->import();
$this
->assertTrue($this->container
->get('theme_handler')
->themeExists('test_theme_depending_on_modules'), 'test_theme_depending_on_modules theme installed');
}
}