diff --git a/composer/Template/LegacyProject/composer.json b/composer/Template/LegacyProject/composer.json index 1bdaf18e4ec..d6cd5108ba2 100644 --- a/composer/Template/LegacyProject/composer.json +++ b/composer/Template/LegacyProject/composer.json @@ -30,6 +30,13 @@ "minimum-stability": "dev", "prefer-stable": true, "config": { + "allow-plugins": { + "composer/installers": true, + "drupal/core-composer-scaffold": true, + "drupal/core-project-message": true, + "drupal/core-vendor-hardening": true, + "phpstan/extension-installer": true + }, "sort-packages": true }, "extra": { diff --git a/composer/Template/RecommendedProject/composer.json b/composer/Template/RecommendedProject/composer.json index 0784e2b139d..91a4871fffc 100644 --- a/composer/Template/RecommendedProject/composer.json +++ b/composer/Template/RecommendedProject/composer.json @@ -29,6 +29,12 @@ "minimum-stability": "dev", "prefer-stable": true, "config": { + "allow-plugins": { + "composer/installers": true, + "drupal/core-composer-scaffold": true, + "drupal/core-project-message": true, + "phpstan/extension-installer": true + }, "sort-packages": true }, "extra": { diff --git a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php index e7e7b2801ff..7aad3dd7916 100644 --- a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php +++ b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php @@ -244,6 +244,14 @@ class ComposerProjectTemplatesTest extends BuildTestBase { $this->executeCommand("COMPOSER_HOME=$composer_home COMPOSER_ROOT_VERSION=$simulated_core_version composer create-project --no-ansi $project testproject $simulated_core_version -vvv --repository $repository_path"); $this->assertCommandSuccessful(); + // Check the output of the project creation for the absence of warnings + // about any non-allowed composer plugins. + // Note: There are different warnings for unallowed composer plugins + // depending on running in non-interactive mode or not. It seems the Drupal + // CI environment always forces composer commands to run in the + // non-interactive mode. The only thing these messages have in common is the + // following string. + $this->assertErrorOutputNotContains('See https://getcomposer.org/allow-plugins'); // Ensure we used the project from our codebase. $this->assertErrorOutputContains("Installing $project ($simulated_core_version): Symlinking from $package_dir"); @@ -386,6 +394,16 @@ JSON; "version" => $version, ], ]; + // Ensure composer plugins are registered correctly. + $package_json = json_decode(file_get_contents($full_path . '/composer.json'), TRUE); + if (isset($package_json['type']) && $package_json['type'] === 'composer-plugin') { + $packages['packages'][$name][$version]['type'] = $package_json['type']; + $packages['packages'][$name][$version]['require'] = $package_json['require']; + $packages['packages'][$name][$version]['extra'] = $package_json['extra']; + if (isset($package_json['autoload'])) { + $packages['packages'][$name][$version]['autoload'] = $package_json['autoload']; + } + } } } diff --git a/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php b/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php index 39761c8c454..d700a13f4b0 100644 --- a/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php +++ b/core/tests/Drupal/BuildTests/Framework/BuildTestBase.php @@ -272,6 +272,16 @@ abstract class BuildTestBase extends TestCase { $this->assertStringContainsString($expected, $this->commandProcess->getErrorOutput()); } + /** + * Assert text is not present in the error output of the most recent command. + * + * @param string $expected + * Text we expect not to find in the error output of the command. + */ + public function assertErrorOutputNotContains($expected) { + $this->assertStringNotContainsString($expected, $this->commandProcess->getErrorOutput()); + } + /** * Assert that text is present in the output of the most recent command. * diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php index 8ff94785d74..1bc89295b48 100644 --- a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/Functional/ComposerHookTest.php @@ -3,10 +3,10 @@ namespace Drupal\Tests\Composer\Plugin\Scaffold\Functional; use Composer\Util\Filesystem; +use Drupal\BuildTests\Framework\BuildTestBase; use Drupal\Tests\Composer\Plugin\Scaffold\AssertUtilsTrait; use Drupal\Tests\Composer\Plugin\Scaffold\ExecTrait; use Drupal\Tests\Composer\Plugin\Scaffold\Fixtures; -use PHPUnit\Framework\TestCase; /** * Tests Composer Hooks that run scaffold operations. @@ -22,7 +22,8 @@ use PHPUnit\Framework\TestCase; * * @group Scaffold */ -class ComposerHookTest extends TestCase { +class ComposerHookTest extends BuildTestBase { + use ExecTrait; use AssertUtilsTrait; @@ -120,9 +121,10 @@ class ComposerHookTest extends TestCase { $this->mustExec("composer install --no-ansi", $sut); // Require a project that is not allowed to scaffold and confirm that we // get a warning, and it does not scaffold. - $stdout = $this->mustExec("composer require --no-ansi --no-interaction fixtures/drupal-assets-fixture:dev-main fixtures/scaffold-override-fixture:dev-main", $sut); + $this->executeCommand("composer require --no-ansi --no-interaction fixtures/drupal-assets-fixture:dev-main fixtures/scaffold-override-fixture:dev-main", $sut); + $this->assertCommandSuccessful(); $this->assertFileDoesNotExist($sut . '/sites/default/default.settings.php'); - $this->assertStringContainsString("Not scaffolding files for fixtures/scaffold-override-fixture, because it is not listed in the element 'extra.drupal-scaffold.allowed-packages' in the root-level composer.json file.", $stdout); + $this->assertErrorOutputContains('See https://getcomposer.org/allow-plugins'); } /** diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-hooks-fixture/composer.json.tmpl b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-hooks-fixture/composer.json.tmpl index f5f5d2a2866..d28a71273df 100644 --- a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-hooks-fixture/composer.json.tmpl +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/composer-hooks-fixture/composer.json.tmpl @@ -64,5 +64,10 @@ "libraries/{$name}": ["type:drupal-library"], "drush/Commands/contrib/{$name}": ["type:drupal-drush"] } + }, + "config": { + "allow-plugins": { + "drupal/core-composer-scaffold": true + } } } diff --git a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/drupal-drupal/composer.json.tmpl b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/drupal-drupal/composer.json.tmpl index 00a91d79591..bf8b11d6c4a 100644 --- a/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/drupal-drupal/composer.json.tmpl +++ b/core/tests/Drupal/Tests/Composer/Plugin/Scaffold/fixtures/drupal-drupal/composer.json.tmpl @@ -67,5 +67,10 @@ "libraries/{$name}": ["type:drupal-library"], "drush/Commands/contrib/{$name}": ["type:drupal-drush"] } - } + }, + "config": { + "allow-plugins": { + "drupal/core-composer-scaffold": true + } + } }