diff --git a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php index 641dba464b..1660cabbcb 100644 --- a/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php +++ b/core/tests/Drupal/BuildTests/Composer/Template/ComposerProjectTemplatesTest.php @@ -112,6 +112,16 @@ public function testTemplateCreateProject($project, $package_dir, $docroot_dir) $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); + + // Disable packagist + $this->executeCommand("COMPOSER_HOME=$composerHome composer config -n -g repo.packagist false"); + // Get the Drupal core version branch. For instance, this should be // 8.9.x-dev for the 8.9.x branch. $core_version = Composer::drupalVersionBranch(); @@ -123,17 +133,19 @@ public function testTemplateCreateProject($project, $package_dir, $docroot_dir) // Always add drupal/core as a path repo. $path_repos['drupal/core'] = $this->getWorkspaceDirectory() . '/core'; foreach ($path_repos as $name => $path) { - $this->executeCommand('composer config repositories.' . $name . ' path ' . $path, $package_dir); + $this->executeCommand("composer config -n repositories.$name path $path", $package_dir); $this->assertCommandSuccessful(); } $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_CORE_VERSION=$core_version composer create-project $project testproject $core_version -s dev -vv --repository $repository_path"); + $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->assertCommandSuccessful(); // Ensure we used the project from our codebase. @@ -182,36 +194,64 @@ public function testTemplateCreateProject($project, $package_dir, $docroot_dir) * The version under test. */ protected function makeTestPackage($repository_path, $version) { - $json = <<getDrupalRoot(); + + // Create a package definition for our template projects, metapackages, + // composer plugins and other path repository projects, e.g. drupal/core. + $packages = [ + "packages" => [ + "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" + ] + ] + ] + ]; + + // Build out additional package definitions for everything installed in + // the vendor directory. + $installed = json_decode(file_get_contents($root . "/vendor/composer/installed.json"), TRUE); + foreach ($installed as $package) { + $name = $package['name']; + $path = "vendor/$name"; + $projectVersion = $package['version']; + $projectType = $package['type']; + if (is_dir($path)) { + $packages[$name] = [ + $projectVersion => [ + "name" => $name, + "dist" => [ + "type" => "path", + "url" => "$path" + ], + "type" => "$projectType", + "version" => "$projectVersion", + ], + ]; } } - } -} -JSON; + + $json = json_encode($packages); mkdir(dirname($repository_path)); file_put_contents($repository_path, $json); } } +