diff --git a/automatic_updates_extensions/tests/src/Kernel/ExtensionUpdaterTest.php b/automatic_updates_extensions/tests/src/Kernel/ExtensionUpdaterTest.php index e664d5d5c33f4e873ad206e87d379209fe876632..d863afa1b1dd91ebda566544eb559ef27a235778 100644 --- a/automatic_updates_extensions/tests/src/Kernel/ExtensionUpdaterTest.php +++ b/automatic_updates_extensions/tests/src/Kernel/ExtensionUpdaterTest.php @@ -46,8 +46,7 @@ class ExtensionUpdaterTest extends AutomaticUpdatesKernelTestBase { $user = $this->createUser([], NULL, TRUE, ['uid' => 2]); $this->setCurrentUser($user); - $fixture_dir = __DIR__ . '/../../fixtures/fake-site'; - $locator = $this->mockPathLocator($fixture_dir, $fixture_dir); + $this->createVirtualProject(__DIR__ . '/../../fixtures/fake-site'); $id = $this->container->get('automatic_updates_extensions.updater')->begin([ 'my_module' => '9.8.1', @@ -60,8 +59,7 @@ class ExtensionUpdaterTest extends AutomaticUpdatesKernelTestBase { $kernel = $this->container->get('kernel'); $kernel->rebuildContainer(); $this->container = $kernel->getContainer(); - // Keep using the mocked path locator and current user. - $this->container->set('package_manager.path_locator', $locator); + // Keep using the user account we created. $this->setCurrentUser($user); $extension_updater = $this->container->get('automatic_updates_extensions.updater'); diff --git a/package_manager/tests/modules/package_manager_bypass/src/PackageManagerBypassServiceProvider.php b/package_manager/tests/modules/package_manager_bypass/src/PackageManagerBypassServiceProvider.php index 2d7866983f1368864fea64fc858ddfeb51d64cc0..b526d5242ce94254da2995e0ba7882e47ebb0680 100644 --- a/package_manager/tests/modules/package_manager_bypass/src/PackageManagerBypassServiceProvider.php +++ b/package_manager/tests/modules/package_manager_bypass/src/PackageManagerBypassServiceProvider.php @@ -4,6 +4,7 @@ namespace Drupal\package_manager_bypass; use Drupal\Core\DependencyInjection\ContainerBuilder; use Drupal\Core\DependencyInjection\ServiceProviderBase; +use Drupal\Core\Site\Settings; use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\Filesystem\Filesystem; @@ -18,17 +19,19 @@ class PackageManagerBypassServiceProvider extends ServiceProviderBase { public function alter(ContainerBuilder $container) { parent::alter($container); - $services = [ - 'package_manager.beginner' => Beginner::class, - 'package_manager.stager' => Stager::class, - 'package_manager.committer' => Committer::class, - ]; $arguments = [ new Reference('state'), new Reference(Filesystem::class), ]; - foreach ($services as $id => $class) { - $container->getDefinition($id)->setClass($class)->setArguments($arguments); + if (Settings::get('package_manager_bypass_composer_stager', TRUE)) { + $services = [ + 'package_manager.beginner' => Beginner::class, + 'package_manager.stager' => Stager::class, + 'package_manager.committer' => Committer::class, + ]; + foreach ($services as $id => $class) { + $container->getDefinition($id)->setClass($class)->setArguments($arguments); + } } $container->getDefinition('package_manager.path_locator') diff --git a/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php b/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php index 281ce40da27cb21b1ded340a9784132ee4ddab0c..f4a0f22fd986b08b8ab75cd4345d8a70f60cc3bc 100644 --- a/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php +++ b/package_manager/tests/src/Kernel/PackageManagerKernelTestBase.php @@ -8,7 +8,6 @@ use Drupal\package_manager\Event\StageEvent; use Drupal\package_manager\Validator\DiskSpaceValidator; use Drupal\package_manager\Exception\StageException; use Drupal\package_manager\Exception\StageValidationException; -use Drupal\package_manager\PathLocator; use Drupal\package_manager\Stage; use Drupal\package_manager_bypass\Beginner; use Drupal\Tests\package_manager\Traits\ValidationTestTrait; @@ -77,19 +76,14 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase { $container->setDefinition($class, $definition->setPublic(FALSE)); $container->setAlias(PathFactoryInterface::class, $class); - // When a virtual project is used, the path locator and disk space validator - // are replaced with mocks. When staged changes are applied, the container - // is rebuilt, which destroys the mocked services and can cause unexpected - // side effects. The 'persist' tag prevents the mocks from being destroyed - // during a container rebuild. + // When a virtual project is used, the disk space validator is replaced with + // a mock. When staged changes are applied, the container is rebuilt, which + // destroys the mocked service and can cause unexpected side effects. The + // 'persist' tag prevents the mock from being destroyed during a container + // rebuild. // @see ::createVirtualProject() - $persist = [ - 'package_manager.path_locator', - 'package_manager.validator.disk_space', - ]; - foreach ($persist as $service_id) { - $container->getDefinition($service_id)->addTag('persist'); - } + $container->getDefinition('package_manager.validator.disk_space') + ->addTag('persist'); foreach ($this->disableValidators as $service_id) { if ($container->hasDefinition($service_id)) { @@ -173,12 +167,18 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase { * 'active', which is the active directory containing a fake Drupal code base, * and 'stage', which is the root directory used to stage changes. The path * locator service will also be mocked so that it points to the test project. + * + * @param string|null $source_dir + * (optional) The path of a directory which should be copied into the + * virtual file system and used as the active directory. */ - protected function createVirtualProject(): void { + protected function createVirtualProject(?string $source_dir = NULL): void { + $source_dir = $source_dir ?? __DIR__ . '/../../fixtures/fake_site'; + // Create the active directory and copy its contents from a fixture. $active_dir = vfsStream::newDirectory('active'); $this->vfsRoot->addChild($active_dir); - vfsStream::copyFromFileSystem(__DIR__ . '/../../fixtures/fake_site', $active_dir); + vfsStream::copyFromFileSystem($source_dir, $active_dir); // Because we can't commit physical `.git` directories into the fixture, use // a visitor to traverse the virtual file system and rename all `_git` @@ -209,8 +209,13 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase { $this->vfsRoot->addChild($stage_dir); static::$testStagingRoot = $stage_dir->url(); + // Ensure the path locator points to the virtual active directory. We assume + // that is its own web root and that the vendor directory is at its top + // level. $active_dir = $active_dir->url(); - $path_locator = $this->mockPathLocator($active_dir); + /** @var \Drupal\package_manager_bypass\PathLocator $path_locator */ + $path_locator = $this->container->get('package_manager.path_locator'); + $path_locator->setPaths($active_dir, $active_dir . '/vendor', ''); // Ensure the active directory will be copied into the virtual staging area. Beginner::setFixturePath($active_dir); @@ -221,7 +226,7 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase { // by vfsStream. This validator will persist through container rebuilds. // @see ::register() $validator = new TestDiskSpaceValidator( - $this->container->get('package_manager.path_locator'), + $path_locator, $this->container->get('string_translation') ); // By default, the validator should report that the root, vendor, and @@ -234,40 +239,6 @@ abstract class PackageManagerKernelTestBase extends KernelTestBase { $this->container->set('package_manager.validator.disk_space', $validator); } - /** - * Mocks the path locator and injects it into the service container. - * - * The mocked path locator will persist through container rebuilds. - * - * @param string $project_root - * The project root. - * @param string|null $vendor_dir - * (optional) The vendor directory. Defaults to `$project_root/vendor`. - * @param string $web_root - * (optional) The web root, relative to the project root. Defaults to '' - * (i.e., same as the project root). - * - * @return \Drupal\package_manager\PathLocator - * The mocked path locator. - * - * @see ::register() - */ - protected function mockPathLocator(string $project_root, string $vendor_dir = NULL, string $web_root = ''): PathLocator { - if (empty($vendor_dir)) { - $vendor_dir = $project_root . '/vendor'; - } - $path_locator = $this->prophesize(PathLocator::class); - $path_locator->getProjectRoot()->willReturn($project_root); - $path_locator->getVendorDirectory()->willReturn($vendor_dir); - $path_locator->getWebRoot()->willReturn($web_root); - - // We don't need the prophet anymore. - $path_locator = $path_locator->reveal(); - $this->container->set('package_manager.path_locator', $path_locator); - - return $path_locator; - } - } /** diff --git a/package_manager/tests/src/Kernel/PathExcluder/GitExcluderTest.php b/package_manager/tests/src/Kernel/PathExcluder/GitExcluderTest.php index 36007e400db4b7749cce6b785ce5f8ec9d122bf3..0966b1fa55c363cf40ce4b332a2e3f79b82d6d9c 100644 --- a/package_manager/tests/src/Kernel/PathExcluder/GitExcluderTest.php +++ b/package_manager/tests/src/Kernel/PathExcluder/GitExcluderTest.php @@ -52,9 +52,9 @@ class GitExcluderTest extends PackageManagerKernelTestBase { public function testGitDirectoriesExcluded(): void { // In this test, we want to perform the actual staging operations so that we // can be sure that files are staged as expected. - $this->disableModules(['package_manager_bypass']); + $this->setSetting('package_manager_bypass_composer_stager', FALSE); // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); + $this->container = $this->container->get('kernel')->rebuildContainer(); $active_dir = $this->container->get('package_manager.path_locator') ->getProjectRoot(); diff --git a/package_manager/tests/src/Kernel/PathExcluder/SiteConfigurationExcluderTest.php b/package_manager/tests/src/Kernel/PathExcluder/SiteConfigurationExcluderTest.php index 75f0b0cd3fc90bc278b23ff82e071acf4f7fc8cd..385e6132e6ab9899a838ae1c180cce1d84ebe8a7 100644 --- a/package_manager/tests/src/Kernel/PathExcluder/SiteConfigurationExcluderTest.php +++ b/package_manager/tests/src/Kernel/PathExcluder/SiteConfigurationExcluderTest.php @@ -40,9 +40,9 @@ class SiteConfigurationExcluderTest extends PackageManagerKernelTestBase { public function testExcludedPaths(): void { // In this test, we want to perform the actual staging operations so that we // can be sure that files are staged as expected. - $this->disableModules(['package_manager_bypass']); + $this->setSetting('package_manager_bypass_composer_stager', FALSE); // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); + $this->container = $this->container->get('kernel')->rebuildContainer(); $active_dir = $this->container->get('package_manager.path_locator') ->getProjectRoot(); diff --git a/package_manager/tests/src/Kernel/PathExcluder/SiteFilesExcluderTest.php b/package_manager/tests/src/Kernel/PathExcluder/SiteFilesExcluderTest.php index 3dd86484ae941af0d11d24f59a9f337827abab61..059c3115eb4586f293a4f692f07529a1a72065c9 100644 --- a/package_manager/tests/src/Kernel/PathExcluder/SiteFilesExcluderTest.php +++ b/package_manager/tests/src/Kernel/PathExcluder/SiteFilesExcluderTest.php @@ -32,9 +32,9 @@ class SiteFilesExcluderTest extends PackageManagerKernelTestBase { // In this test, we want to perform the actual staging operations so that we // can be sure that files are staged as expected. This will also rebuild // the container, enabling the private stream wrapper. - $this->disableModules(['package_manager_bypass']); + $this->setSetting('package_manager_bypass_composer_stager', FALSE); // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); + $this->container = $this->container->get('kernel')->rebuildContainer(); $active_dir = $this->container->get('package_manager.path_locator') ->getProjectRoot(); diff --git a/package_manager/tests/src/Kernel/PathExcluder/SqliteDatabaseExcluderTest.php b/package_manager/tests/src/Kernel/PathExcluder/SqliteDatabaseExcluderTest.php index bb1bc506cc95a3d96a9ff7336f92acb9bc92857f..7b142714db137892f7cdc47f1eb0388b01865366 100644 --- a/package_manager/tests/src/Kernel/PathExcluder/SqliteDatabaseExcluderTest.php +++ b/package_manager/tests/src/Kernel/PathExcluder/SqliteDatabaseExcluderTest.php @@ -57,9 +57,9 @@ class SqliteDatabaseExcluderTest extends PackageManagerKernelTestBase { public function testSqliteDatabaseFilesExcluded(): void { // In this test, we want to perform the actual staging operations so that we // can be sure that files are staged as expected. - $this->disableModules(['package_manager_bypass']); + $this->setSetting('package_manager_bypass_composer_stager', FALSE); // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); + $this->container = $this->container->get('kernel')->rebuildContainer(); $active_dir = $this->container->get('package_manager.path_locator') ->getProjectRoot(); diff --git a/package_manager/tests/src/Kernel/PathExcluder/TestSiteExcluderTest.php b/package_manager/tests/src/Kernel/PathExcluder/TestSiteExcluderTest.php index 43a7ad9f063c1b4d1023fca026180e54d81ceaec..4b53ba79ef589e3c5f2b076013bd0d02db381379 100644 --- a/package_manager/tests/src/Kernel/PathExcluder/TestSiteExcluderTest.php +++ b/package_manager/tests/src/Kernel/PathExcluder/TestSiteExcluderTest.php @@ -28,9 +28,9 @@ class TestSiteExcluderTest extends PackageManagerKernelTestBase { public function testTestSitesExcluded(): void { // In this test, we want to perform the actual staging operations so that we // can be sure that files are staged as expected. - $this->disableModules(['package_manager_bypass']); + $this->setSetting('package_manager_bypass_composer_stager', FALSE); // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); + $this->container = $this->container->get('kernel')->rebuildContainer(); $active_dir = $this->container->get('package_manager.path_locator') ->getProjectRoot(); diff --git a/package_manager/tests/src/Kernel/PathExcluder/VendorHardeningExcluderTest.php b/package_manager/tests/src/Kernel/PathExcluder/VendorHardeningExcluderTest.php index 0e28251ea7c02366e10ecf0f71c763a5d31135ed..93218424562e532910722ebcff4e73da2160b8e2 100644 --- a/package_manager/tests/src/Kernel/PathExcluder/VendorHardeningExcluderTest.php +++ b/package_manager/tests/src/Kernel/PathExcluder/VendorHardeningExcluderTest.php @@ -28,9 +28,9 @@ class VendorHardeningExcluderTest extends PackageManagerKernelTestBase { public function testVendorHardeningFilesExcluded(): void { // In this test, we want to perform the actual staging operations so that we // can be sure that files are staged as expected. - $this->disableModules(['package_manager_bypass']); + $this->setSetting('package_manager_bypass_composer_stager', FALSE); // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); + $this->container = $this->container->get('kernel')->rebuildContainer(); $active_dir = $this->container->get('package_manager.path_locator') ->getProjectRoot(); diff --git a/package_manager/tests/src/Kernel/StageOwnershipTest.php b/package_manager/tests/src/Kernel/StageOwnershipTest.php index ccb4073793dcaa3e8eef3472b4ca3bcca127aea0..39594018b3f72f7b6c51647f839d683602e6cc3a 100644 --- a/package_manager/tests/src/Kernel/StageOwnershipTest.php +++ b/package_manager/tests/src/Kernel/StageOwnershipTest.php @@ -239,14 +239,6 @@ class StageOwnershipTest extends PackageManagerKernelTestBase { * Tests that the stage is available if ::destroy() has a file system error. */ public function testStageDestroyedWithFileSystemError(): void { - // Enable the Composer Stager library, since we will actually want to create - // the stage directory. - $this->container->get('module_installer')->uninstall([ - 'package_manager_bypass', - ]); - // Ensure we have an up-to-date container. - $this->container = $this->container->get('kernel')->getContainer(); - $logger_channel = $this->container->get('logger.channel.file'); $arguments = [ $this->container->get('stream_wrapper_manager'), diff --git a/tests/src/Kernel/ReadinessValidation/StagedDatabaseUpdateValidatorTest.php b/tests/src/Kernel/ReadinessValidation/StagedDatabaseUpdateValidatorTest.php index bab20837831b48591b8469d4197726411c317328..2934a84bf0afa188dbf1d419f4fbd90c29951b9c 100644 --- a/tests/src/Kernel/ReadinessValidation/StagedDatabaseUpdateValidatorTest.php +++ b/tests/src/Kernel/ReadinessValidation/StagedDatabaseUpdateValidatorTest.php @@ -48,8 +48,8 @@ class StagedDatabaseUpdateValidatorTest extends AutomaticUpdatesKernelTestBase { /** * {@inheritdoc} */ - protected function createVirtualProject(): void { - parent::createVirtualProject(); + protected function createVirtualProject(?string $source_dir = NULL): void { + parent::createVirtualProject($source_dir); $drupal_root = $this->getDrupalRoot(); $virtual_active_dir = $this->container->get('package_manager.path_locator') diff --git a/tests/src/Kernel/UpdaterTest.php b/tests/src/Kernel/UpdaterTest.php index 03a249e851d6efde803efd90745934df85b991e6..04344519a2f1cabe517c0ddf7bbd565d3bbb7111 100644 --- a/tests/src/Kernel/UpdaterTest.php +++ b/tests/src/Kernel/UpdaterTest.php @@ -50,8 +50,7 @@ class UpdaterTest extends AutomaticUpdatesKernelTestBase { // Point to a fake site which requires Drupal core via a distribution. The // lock file should be scanned to determine the core packages, which should // result in drupal/core-recommended being updated. - $fixture_dir = __DIR__ . '/../../fixtures/fake-site'; - $locator = $this->mockPathLocator($fixture_dir, $fixture_dir); + $this->createVirtualProject(__DIR__ . '/../../fixtures/fake-site'); $id = $this->container->get('automatic_updates.updater')->begin([ 'drupal' => '9.8.1', @@ -61,8 +60,7 @@ class UpdaterTest extends AutomaticUpdatesKernelTestBase { $kernel = $this->container->get('kernel'); $kernel->rebuildContainer(); $this->container = $kernel->getContainer(); - // Keep using the mocked path locator and current user. - $this->container->set('package_manager.path_locator', $locator); + // Keep using the user account we created. $this->setCurrentUser($user); /** @var \Drupal\automatic_updates\Updater $updater */