diff --git a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php index 1660cabbcb..ad15768358 100644 --- a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php +++ b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php @@ -107,14 +107,9 @@ public function testVerifyTemplateTestProviderIsAccurate() { public function testTemplateCreateProject($project, $package_dir, $docroot_dir) { $composerVersionLine = exec('composer --version'); if (strpos($composerVersionLine, 'Composer version 2') !== FALSE) { - $this->markTestSkipped('We cannot run the template create project test with Composer 2 until we have a stable version of composer/semver 2.x. The create project test installs drupal/core-recommended and the Drupal Composer plugins from Packagist, so these must also be compatible with Composer 2.x in order for this test to work.'); + $this->markTestSkipped("This test is pretty close to being usable with Composer 2, but exhibits some failures with the vendor packages. We won't worry about this for now."); } - $this->copyCodebase(); - - // Keep our working directory around for inspection - $this->destroyBuild = FALSE; - // Make a working COMPOSER_HOME directory for setting global composer config $composerHome = $this->getWorkspaceDirectory() . '/composer-home'; mkdir($composerHome); @@ -126,6 +121,34 @@ public function testTemplateCreateProject($project, $package_dir, $docroot_dir) // 8.9.x-dev for the 8.9.x branch. $core_version = Composer::drupalVersionBranch(); + // We will make our packages.json file in the SUT so that we can use + // relative paths into the vendor directory. + $vendor_packages_path = $this->getWorkspaceDirectory() . '/vendor_packages/packages.json'; + $composer_installers = $this->makeVendorPackage($vendor_packages_path); + + // Make a copy of the code to alter. + $this->copyCodebase(); + + // Remove the packages.drupal.org entry from the SUT's repositories section. + // and add in a package repository for composer/installers + $composer_json_path = $this->getWorkspaceDirectory() . "/$package_dir/composer.json"; + $composer_json = json_decode(file_get_contents($composer_json_path), TRUE); + $composer_json['repositories'] = [ + 'composer/installers' => [ + 'type' => 'package', + 'package' => [ + 'name' => 'composer/installers', + 'version' => '1.9.0', + 'dist' => [ + 'type' => 'path', + 'url' => $this->getDrupalRoot() . '/vendor/composer/installers', + ], + ], + ], + ]; + $json = json_encode($composer_json, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); + file_put_contents($composer_json_path, $json); + // Set up the template to use our path repos. Inclusion of metapackages is // reported differently, so we load up a separate set for them. $metapackage_path_repos = $this->getPathReposForType($this->getWorkspaceDirectory(), 'Metapackage'); @@ -137,15 +160,15 @@ public function testTemplateCreateProject($project, $package_dir, $docroot_dir) $this->assertCommandSuccessful(); } + $this->executeCommand("composer config -n repositories.local composer file://" . $vendor_packages_path, $package_dir); + $repository_path = $this->getWorkspaceDirectory() . '/test_repository/packages.json'; $this->makeTestPackage($repository_path, $core_version); - $this->executeCommand("composer config -n repositories.local composer file://" . dirname($repository_path), $package_dir); - $autoloader = $this->getWorkspaceDirectory() . '/testproject' . $docroot_dir . '/autoload.php'; $this->assertFileNotExists($autoloader); - $this->executeCommand("COMPOSER_HOME=$composerHome COMPOSER_CORE_VERSION=$core_version composer create-project --no-ansi $project testproject $core_version -s dev -vv --repository $repository_path"); + $this->executeCommand("COMPOSER_HOME=$composerHome COMPOSER_ROOT_VERSION=$core_version composer create-project --no-ansi $project testproject $core_version -s dev -vv --repository $repository_path"); $this->assertCommandSuccessful(); // Ensure we used the project from our codebase. @@ -194,52 +217,64 @@ public function testTemplateCreateProject($project, $package_dir, $docroot_dir) * The version under test. */ protected function makeTestPackage($repository_path, $version) { - $root = $this->getDrupalRoot(); + $json = << [ - "drupal/recommended-project" => [ - "$version" => [ - "name" => "drupal/recommended-project", - "dist" => [ - "type" => "path", - "url" => "composer/Template/RecommendedProject" - ], - "type" => "project", - "version" => "$version" - ] - ], - "drupal/legacy-project" => [ - "$version" => [ - "name" => "drupal/legacy-project", - "dist" => [ - "type" => "path", - "url" => "composer/Template/LegacyProject" - ], - "type" => "project", - "version" => "$version" - ] - ] - ] - ]; + /** + * Creates a test package that points to all the projects in vendor. + * + * @param string $repository_path + * The path where to create the test package. + */ + protected function makeVendorPackage($repository_path) { + $root = $this->getDrupalRoot(); - // Build out additional package definitions for everything installed in + // Build out package definitions for everything installed in // the vendor directory. + $packages = []; $installed = json_decode(file_get_contents($root . "/vendor/composer/installed.json"), TRUE); foreach ($installed as $package) { $name = $package['name']; $path = "vendor/$name"; + $fullPath = "$root/$path"; $projectVersion = $package['version']; $projectType = $package['type']; - if (is_dir($path)) { - $packages[$name] = [ + if (is_dir($fullPath)) { + $packages['packages'][$name] = [ $projectVersion => [ "name" => $name, "dist" => [ "type" => "path", - "url" => "$path" + "url" => "$path", ], "type" => "$projectType", "version" => "$projectVersion", @@ -248,10 +283,13 @@ protected function makeTestPackage($repository_path, $version) { } } - $json = json_encode($packages); + $composer_installers = $packages['packages']['composer/installers']; + unset($packages['packages']['composer/installers']); + $composer_installers = array_shift($composer_installers); + + $json = json_encode($packages, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES); mkdir(dirname($repository_path)); file_put_contents($repository_path, $json); } } -