Issue #3477329 by phenaproxima, thejimbirch, b_sharpe: Recipe validation should always treat required modules as installed
parent
f9d146518b
commit
81f055eb1c
|
@ -383,14 +383,23 @@ final class Recipe {
|
|||
|
||||
$configurator = new RecipeConfigurator($recipe_being_validated['recipes'] ?? [], $include_path);
|
||||
|
||||
/** @var \Drupal\Core\Extension\ModuleExtensionList $module_list */
|
||||
$module_list = \Drupal::service('extension.list.module');
|
||||
// The config provider must either be an already-installed module or theme,
|
||||
// or an extension being installed by this recipe or a recipe it depends on.
|
||||
$all_extensions = [
|
||||
...array_keys(\Drupal::service('extension.list.module')->getAllInstalledInfo()),
|
||||
...array_keys($module_list->getAllInstalledInfo()),
|
||||
...array_keys(\Drupal::service('extension.list.theme')->getAllInstalledInfo()),
|
||||
...$recipe_being_validated['install'] ?? [],
|
||||
...$configurator->listAllExtensions(),
|
||||
];
|
||||
// Explicitly treat required modules as installed, even if Drupal isn't
|
||||
// installed yet, because we know they WILL be installed.
|
||||
foreach ($module_list->getAllAvailableInfo() as $name => $info) {
|
||||
if (!empty($info['required'])) {
|
||||
$all_extensions[] = $name;
|
||||
}
|
||||
}
|
||||
|
||||
if (!in_array($config_provider, $all_extensions, TRUE)) {
|
||||
$context->addViolation('Config actions cannot be applied to %config_name because the %config_provider extension is not installed, and is not installed by this recipe or any of the recipes it depends on.', [
|
||||
|
|
|
@ -8,6 +8,7 @@ use Drupal\Core\Recipe\Recipe;
|
|||
use Drupal\Core\Recipe\RecipeFileException;
|
||||
use Drupal\Core\Recipe\RecipePreExistingConfigException;
|
||||
use Drupal\Core\Recipe\RecipeRunner;
|
||||
use Drupal\FunctionalTests\Core\Recipe\RecipeTestTrait;
|
||||
use Drupal\KernelTests\KernelTestBase;
|
||||
|
||||
/**
|
||||
|
@ -16,6 +17,8 @@ use Drupal\KernelTests\KernelTestBase;
|
|||
*/
|
||||
class RecipeTest extends KernelTestBase {
|
||||
|
||||
use RecipeTestTrait;
|
||||
|
||||
/**
|
||||
* {@inheritdoc}
|
||||
*/
|
||||
|
@ -80,4 +83,19 @@ class RecipeTest extends KernelTestBase {
|
|||
$this->assertSame($this->config('text.settings')->get('default_summary_length'), 700);
|
||||
}
|
||||
|
||||
public function testImplicitlyRequiredModule(): void {
|
||||
$this->disableModules(['user']);
|
||||
$recipe = $this->createRecipe([
|
||||
'name' => 'Actions on config from required module',
|
||||
'config' => [
|
||||
'actions' => [
|
||||
'user.role.authenticated' => [
|
||||
'grantPermission' => 'access administration pages',
|
||||
],
|
||||
],
|
||||
],
|
||||
]);
|
||||
$this->assertIsObject($recipe);
|
||||
}
|
||||
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue