diff --git a/core/lib/Drupal/Core/Composer/ExtensionDependencyChecker.php b/core/lib/Drupal/Core/Composer/ExtensionDependencyChecker.php index 3ac601d..f801ccc 100644 --- a/core/lib/Drupal/Core/Composer/ExtensionDependencyChecker.php +++ b/core/lib/Drupal/Core/Composer/ExtensionDependencyChecker.php @@ -99,7 +99,7 @@ public function getUnmetDependencies(Extension $extension) { if (strpos($package_name, '/') === FALSE) { continue; } - // Rule out extension dependencies specified in the info.yml file. + // Skip extension dependencies specified in the info.yml file. if (strpos($package_name, 'drupal/') === 0) { if (in_array(substr($package_name, 7), $info_dependencies)) { continue; diff --git a/core/modules/system/src/Tests/Module/HookRequirementsTest.php b/core/modules/system/src/Tests/Module/HookRequirementsTest.php index 760e423..632be0c 100644 --- a/core/modules/system/src/Tests/Module/HookRequirementsTest.php +++ b/core/modules/system/src/Tests/Module/HookRequirementsTest.php @@ -27,48 +27,79 @@ function testHookRequirementsFailure() { } /** - * Tests that a module with uninstalled dependencies is not installable. + * Tests that modules with uninstalled dependencies are not installable. */ public function testComposerDependenciesFailure() { - $this->assertModules(['composer_uninstallable'], FALSE); + $data = [ + [ + 'composer_uninstallable', + 'The following extensions have unmet Composer-based dependencies: composer_uninstallable (scalopus/empty: ^1.1, jellyfish/empty: ~2.0, ordinal/empty: 4.0.*). Read the documentation on drupal.org on how to install them.', + ], + [ + 'composer_mixed_uninstallable', + 'The following extensions have unmet Composer-based dependencies: composer_mixed_uninstallable (drupal/system: ^8.2). Read the documentation on drupal.org on how to install them.', + ], + ]; + foreach ($data as $datum) { + $this->assertComposerDependenciesFailure($datum[0], $datum[1]); + } + } + + /** + * Tests that a module with uninstalled dependencies is not installable. + */ + public function assertComposerDependenciesFailure($module, $error_message) { + $this->assertModules([$module], FALSE); - // Attempt to install the composer_uninstallable module using internals. - // This should throw a + // Attempt to install the module using internals. This should throw a // \Drupal\Core\Extension\ExtensionComposerRequirementsException. - $message = sprintf('Attempting to install composer_uninstallable threw %s.', ExtensionComposerRequirementsException::class); + $message = sprintf('Attempting to install %s threw %s.', $module, ExtensionComposerRequirementsException::class); try { $installer = $this->container->get('module_installer'); - $installer->install(['composer_uninstallable'], TRUE); + $installer->install([$module], TRUE); $this->fail($message); } catch (ExtensionComposerRequirementsException $e) { $this->pass($message); } - // Attempt to install the composer_uninstallable module using the module - // list form. This should fail with a message to the user. + // Attempt to install the $module module using the module list form. This + // should fail with a message to the user. $edit = []; - $edit['modules[Testing][composer_uninstallable][enable]'] = 'composer_uninstallable'; + $edit["modules[Testing][$module][enable]"] = '$module'; $this->drupalPostForm('admin/modules', $edit, t('Install')); - $this->assertText('The following extensions have unmet Composer-based dependencies: composer_uninstallable (scalopus/empty: ^1.1, jellyfish/empty: ~2.0, ordinal/empty: 4.0.*). Read the documentation on drupal.org on how to install them.'); + $this->assertText($error_message); // Makes sure the module was NOT installed. - $this->assertModules(['composer_uninstallable'], FALSE); + $this->assertModules([$module], FALSE); } /** - * Tests that a module with installed dependencies is installable. + * Tests that modules with installed dependencies are installable. */ public function testComposerDependenciesSuccess() { - $this->assertModules(['composer_installable'], FALSE); + $data = [ + 'composer_installable', + 'composer_mixed_installable', + ]; + foreach ($data as $datum) { + $this->assertComposerDependenciesSuccess($datum); + } + } + + /** + * Tests that modules with installed dependencies are installable. + */ + public function assertComposerDependenciesSuccess($module) { + $this->assertModules([$module], FALSE); - // Attempt to install the composer_installable module. + // Attempt to install the module. $edit = []; - $edit['modules[Testing][composer_installable][enable]'] = 'composer_installable'; + $edit["modules[Testing][$module][enable]"] = $module; $this->drupalPostForm('admin/modules', $edit, t('Install')); // Makes sure the module was installed. - $this->assertModules(['composer_installable'], TRUE); + $this->assertModules([$module], TRUE); } } diff --git a/core/modules/system/tests/modules/composer_mixed_installable/composer.json b/core/modules/system/tests/modules/composer_mixed_installable/composer.json new file mode 100644 index 0000000..4f0d5a7 --- /dev/null +++ b/core/modules/system/tests/modules/composer_mixed_installable/composer.json @@ -0,0 +1,7 @@ +{ + "name": "drupal_test/composer_mixed_installable", + "description": "Test module that is installable because it declares a core dependency in both composer.json and info.yml.", + "require": { + "drupal/system": "^8.2" + } +} diff --git a/core/modules/system/tests/modules/composer_mixed_installable/composer_mixed_installable.info.yml b/core/modules/system/tests/modules/composer_mixed_installable/composer_mixed_installable.info.yml new file mode 100644 index 0000000..c4fded8 --- /dev/null +++ b/core/modules/system/tests/modules/composer_mixed_installable/composer_mixed_installable.info.yml @@ -0,0 +1,8 @@ +name: 'Composer Mixed Installable' +type: module +description: 'Test module that is installable because it declares a core dependency in both composer.json and info.yml.' +package: Testing +version: VERSION +core: 8.x +dependencies: + - system diff --git a/core/modules/system/tests/modules/composer_mixed_uninstallable/composer.json b/core/modules/system/tests/modules/composer_mixed_uninstallable/composer.json new file mode 100644 index 0000000..e79cab5 --- /dev/null +++ b/core/modules/system/tests/modules/composer_mixed_uninstallable/composer.json @@ -0,0 +1,7 @@ +{ + "name": "drupal_test/composer_mixed_uninstallable", + "description": "Test module that is not installable because it declares a core dependency in composer.json but not info.yml.", + "require": { + "drupal/system": "^8.2" + } +} diff --git a/core/modules/system/tests/modules/composer_mixed_uninstallable/composer_mixed_uninstallable.info.yml b/core/modules/system/tests/modules/composer_mixed_uninstallable/composer_mixed_uninstallable.info.yml new file mode 100644 index 0000000..21007ed --- /dev/null +++ b/core/modules/system/tests/modules/composer_mixed_uninstallable/composer_mixed_uninstallable.info.yml @@ -0,0 +1,6 @@ +name: 'Composer Mixed Uninstallable' +type: module +description: 'Test module that is not installable because it declares a core dependency in composer.json but not info.yml.' +package: Testing +version: VERSION +core: 8.x diff --git a/core/tests/Drupal/Tests/Core/Composer/ExtensionDependencyCheckerTest.php b/core/tests/Drupal/Tests/Core/Composer/ExtensionDependencyCheckerTest.php index b5c80fc..9d4384e 100644 --- a/core/tests/Drupal/Tests/Core/Composer/ExtensionDependencyCheckerTest.php +++ b/core/tests/Drupal/Tests/Core/Composer/ExtensionDependencyCheckerTest.php @@ -143,6 +143,7 @@ public function testDependenciesAreMet($expected, $composer_json, $installed_jso $counter = static::$counter; $module_name = "some_module$counter"; + // Make an info.yml file. $info = [ 'type' => 'module', 'core' => '8.x', @@ -151,8 +152,9 @@ public function testDependenciesAreMet($expected, $composer_json, $installed_jso if ($info_dependencies) { $info['dependencies'] = $info_dependencies; } + // Make a file system. $structure = [ - 'modules' => [$module_name => ["$module_name.info.yml" => Yaml::dump($info, 2, 2)]], + 'modules' => [$module_name => ["$module_name.info.yml" => Yaml::dump($info)]], 'vendor' => ['composer' => []], ]; if ($installed_json !== NULL) {