FakeSiteFixtureTest.php

Namespace

Drupal\Tests\package_manager\Kernel

File

core/modules/package_manager/tests/src/Kernel/FakeSiteFixtureTest.php

View source
<?php

declare (strict_types=1);
namespace Drupal\Tests\package_manager\Kernel;

use Drupal\fixture_manipulator\ActiveFixtureManipulator;
use Drupal\package_manager\ComposerInspector;
use Drupal\package_manager\PathLocator;
use Symfony\Component\Process\Process;

/**
 * Test that the 'fake-site' fixture is a valid starting point.
 *
 * @group package_manager
 * @internal
 */
class FakeSiteFixtureTest extends PackageManagerKernelTestBase {
    
    /**
     * Tests the complete stage life cycle using the 'fake-site' fixture.
     */
    public function testLifeCycle() : void {
        $this->assertStatusCheckResults([]);
        $this->assertResults([]);
        // Ensure there are no validation errors after the stage lifecycle has been
        // completed.
        $this->assertStatusCheckResults([]);
    }
    
    /**
     * Tests calls to ComposerInspector class methods.
     */
    public function testCallToComposerInspectorMethods() : void {
        $active_dir = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot();
        
        /** @var \Drupal\package_manager\ComposerInspector $inspector */
        $inspector = $this->container
            ->get(ComposerInspector::class);
        $list = $inspector->getInstalledPackagesList($active_dir);
        $this->assertNull($list->getPackageByDrupalProjectName('any_random_name'));
        $this->assertFalse(isset($list['drupal/any_random_name']));
    }
    
    /**
     * Tests if `setVersion` can be called on all packages in the fixture.
     *
     * @see \Drupal\fixture_manipulator\FixtureManipulator::setVersion()
     */
    public function testCallToSetVersion() : void {
        
        /** @var \Drupal\package_manager\ComposerInspector $inspector */
        $inspector = $this->container
            ->get(ComposerInspector::class);
        $active_dir = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot();
        $installed_packages = $inspector->getInstalledPackagesList($active_dir);
        foreach (self::getExpectedFakeSitePackages() as $package_name) {
            $this->assertArrayHasKey($package_name, $installed_packages);
            $this->assertSame($installed_packages[$package_name]->version, '9.8.0');
            (new ActiveFixtureManipulator())->setVersion($package_name, '11.1.0')
                ->commitChanges();
            $list = $inspector->getInstalledPackagesList($active_dir);
            $this->assertSame($list[$package_name]?->version, '11.1.0');
        }
    }
    
    /**
     * Tests if `removePackage` can be called on all packages in the fixture.
     *
     * @covers \Drupal\fixture_manipulator\FixtureManipulator::removePackage
     */
    public function testCallToRemovePackage() : void {
        
        /** @var \Drupal\package_manager\ComposerInspector $inspector */
        $inspector = $this->container
            ->get(ComposerInspector::class);
        $active_dir = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot();
        $expected_packages = self::getExpectedFakeSitePackages();
        $actual_packages = array_keys($inspector->getInstalledPackagesList($active_dir)
            ->getArrayCopy());
        sort($actual_packages);
        $this->assertSame($expected_packages, $actual_packages);
        foreach (self::getExpectedFakeSitePackages() as $package_name) {
            (new ActiveFixtureManipulator())->removePackage($package_name, $package_name === 'drupal/core-dev')
                ->commitChanges();
            array_shift($expected_packages);
            $actual_package_names = array_keys($inspector->getInstalledPackagesList($active_dir)
                ->getArrayCopy());
            sort($actual_package_names);
            $this->assertSame($expected_packages, $actual_package_names);
        }
    }
    
    /**
     * Checks that the expected packages are installed in the fake site fixture.
     */
    public function testExpectedPackages() : void {
        $project_root = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot();
        $installed_packages = $this->container
            ->get(ComposerInspector::class)
            ->getInstalledPackagesList($project_root)
            ->getArrayCopy();
        ksort($installed_packages);
        $this->assertSame($this->getExpectedFakeSitePackages(), array_keys($installed_packages));
    }
    
    /**
     * Gets the expected packages in the `fake_site` fixture.
     *
     * @return string[]
     *   The package names.
     */
    private static function getExpectedFakeSitePackages() : array {
        $packages = [
            'drupal/core',
            'drupal/core-recommended',
            'drupal/core-dev',
        ];
        sort($packages);
        return $packages;
    }
    
    /**
     * Tests that Composer show command can be used on the fixture.
     */
    public function testComposerShow() : void {
        $active_dir = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot();
        (new ActiveFixtureManipulator())->addPackage([
            'type' => 'package',
            'version' => '1.2.3',
            'name' => 'any-org/any-package',
        ])
            ->commitChanges();
        $process = new Process([
            'composer',
            'show',
            '--format=json',
        ], $active_dir);
        $process->run();
        if ($error = $process->getErrorOutput()) {
            $this->fail('Process error: ' . $error);
        }
        $output = json_decode($process->getOutput(), TRUE);
        $package_names = array_map(fn(array $package) => $package['name'], $output['installed']);
        $this->assertTrue(asort($package_names));
        $this->assertSame([
            'any-org/any-package',
            'drupal/core',
            'drupal/core-dev',
            'drupal/core-recommended',
        ], $package_names);
        $list = $this->container
            ->get(ComposerInspector::class)
            ->getInstalledPackagesList($active_dir);
        $list_packages_names = array_keys($list->getArrayCopy());
        $this->assertSame([
            'any-org/any-package',
            'drupal/core',
            'drupal/core-dev',
            'drupal/core-recommended',
        ], $list_packages_names);
    }
    
    /**
     * Tests that the fixture passes `composer validate`.
     */
    public function testComposerValidate() : void {
        $active_dir = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot();
        $process = new Process([
            'composer',
            'validate',
            '--check-lock',
            '--with-dependencies',
            '--no-interaction',
            '--ansi',
            '--no-cache',
        ], $active_dir);
        $process->mustRun();
    }

}

Classes

Title Deprecated Summary
FakeSiteFixtureTest Test that the 'fake-site' fixture is a valid starting point.

Buggy or inaccurate documentation? Please file an issue. Need support? Need help programming? Connect with the Drupal community.