InstalledPackagesListTest.php

Same filename in this branch
  1. 11.x core/modules/package_manager/tests/src/Unit/InstalledPackagesListTest.php

Namespace

Drupal\Tests\package_manager\Kernel

File

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

View source
<?php

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

use Drupal\Component\Serialization\Yaml;
use Drupal\fixture_manipulator\ActiveFixtureManipulator;
use Drupal\package_manager\InstalledPackage;
use Drupal\package_manager\InstalledPackagesList;
use Drupal\package_manager\PathLocator;

/**
 * @coversDefaultClass \Drupal\package_manager\InstalledPackagesList
 *
 * @group package_manager
 */
class InstalledPackagesListTest extends PackageManagerKernelTestBase {
    
    /**
     * @covers \Drupal\package_manager\InstalledPackage::getProjectName
     * @covers ::getPackageByDrupalProjectName
     */
    public function testPackageByDrupalProjectName() : void {
        // In getPackageByDrupalProjectName(), we don't expect that projects will be
        // in the "correct" places -- for example, we don't assume that modules will
        // be in the `modules` directory, or themes will be the `themes` directory.
        // So, in this test, we ensure that flexibility works by just throwing all
        // the projects into a single `projects` directory.
        $projects_path = $this->container
            ->get(PathLocator::class)
            ->getProjectRoot() . '/projects';
        // The project name does not match the package name, and the project
        // physically exists.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/theme_project')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'drupal/a_package' => InstalledPackage::createFromArray([
                'name' => 'drupal/a_package',
                'version' => '1.0.0',
                'type' => 'drupal-theme',
                'path' => $projects_path . '/theme_project',
            ]),
        ]);
        $this->assertSame($list['drupal/a_package'], $list->getPackageByDrupalProjectName('theme_project'));
        // The project physically exists, but the package path points to the wrong
        // place.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/example3')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'drupal/example3' => InstalledPackage::createFromArray([
                'name' => 'drupal/example3',
                'version' => '1.0.0',
                'type' => 'drupal-module',
                // This path exists, but it doesn't contain the `example3` project.
'path' => $projects_path . '/theme_project',
            ]),
        ]);
        $this->assertNull($list->getPackageByDrupalProjectName('example3'));
        // The project does not physically exist, which means it must be a metapackage.
        $list = new InstalledPackagesList([
            'drupal/missing' => InstalledPackage::createFromArray([
                'name' => 'drupal/missing',
                'version' => '1.0.0',
                'type' => 'metapackage',
                'path' => NULL,
            ]),
        ]);
        $this->assertNull($list->getPackageByDrupalProjectName('missing'));
        // The project physically exists in a subdirectory of the package.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/grab_bag/modules/module_in_subdirectory')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'drupal/grab_bag' => InstalledPackage::createFromArray([
                'name' => 'drupal/grab_bag',
                'version' => '1.0.0',
                'type' => 'drupal-profile',
                'path' => $projects_path . '/grab_bag',
            ]),
        ]);
        $this->assertSame($list['drupal/grab_bag'], $list->getPackageByDrupalProjectName('module_in_subdirectory'));
        // The package name matches a project that physically exists, but the
        // package vendor is not `drupal`.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/not_from_drupal')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'vendor/not_from_drupal' => InstalledPackage::createFromArray([
                'name' => 'vendor/not_from_drupal',
                'version' => '1.0.0',
                'type' => 'drupal-module',
                'path' => $projects_path . '/not_from_drupal',
            ]),
        ]);
        $this->assertNull($list->getPackageByDrupalProjectName('not_from_drupal'));
        // These package names match physically existing projects, and they are
        // from the `drupal` vendor, but they're not supported package types.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/custom_module')
            ->addProjectAtPath('projects/custom_theme')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'drupal/custom_module' => InstalledPackage::createFromArray([
                'name' => 'drupal/custom_module',
                'version' => '1.0.0',
                'type' => 'drupal-custom-module',
                'path' => $projects_path . '/custom_module',
            ]),
            'drupal/custom_theme' => InstalledPackage::createFromArray([
                'name' => 'drupal/custom_theme',
                'version' => '1.0.0',
                'type' => 'drupal-custom-theme',
                'path' => $projects_path . '/custom_theme',
            ]),
        ]);
        $this->assertNull($list->getPackageByDrupalProjectName('custom_module'));
        $this->assertNull($list->getPackageByDrupalProjectName('custom_theme'));
        // The `project` key has been removed from the info file.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/no_project_key')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'drupal/no_project_key' => InstalledPackage::createFromArray([
                'name' => 'drupal/no_project_key',
                'version' => '1.0.0',
                'type' => 'drupal-module',
                'path' => $projects_path . '/no_project_key',
            ]),
        ]);
        $info_file = $list['drupal/no_project_key']->path . '/no_project_key.info.yml';
        $this->assertFileIsWritable($info_file);
        $info = Yaml::decode(file_get_contents($info_file));
        unset($info['project']);
        file_put_contents($info_file, Yaml::encode($info));
        $this->assertNull($list->getPackageByDrupalProjectName('no_project_key'));
        // The project name is repeated.
        (new ActiveFixtureManipulator())->addProjectAtPath('projects/duplicate_project')
            ->addProjectAtPath('projects/repeat/duplicate_project')
            ->commitChanges();
        $list = new InstalledPackagesList([
            'drupal/test_project1' => InstalledPackage::createFromArray([
                'name' => 'drupal/test_project1',
                'version' => '1.0.0',
                'type' => 'drupal-module',
                'path' => $projects_path . '/duplicate_project',
            ]),
            'drupal/test_project2' => InstalledPackage::createFromArray([
                'name' => 'drupal/test_project2',
                'version' => '1.0.0',
                'type' => 'drupal-module',
                'path' => $projects_path . '/repeat/duplicate_project',
            ]),
        ]);
        $this->expectException(\UnexpectedValueException::class);
        $this->expectExceptionMessage("Project 'duplicate_project' was found in packages 'drupal/test_project1' and 'drupal/test_project2'.");
        $list->getPackageByDrupalProjectName('duplicate_project');
    }

}

Classes

Title Deprecated Summary
InstalledPackagesListTest @coversDefaultClass \Drupal\package_manager\InstalledPackagesList

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