function InstalledPackagesListTest::testPackageByDrupalProjectName

@covers \Drupal\package_manager\InstalledPackage::getProjectName
@covers ::getPackageByDrupalProjectName

File

core/modules/package_manager/tests/src/Kernel/InstalledPackagesListTest.php, line 24

Class

InstalledPackagesListTest
@coversDefaultClass \Drupal\package_manager\InstalledPackagesList[[api-linebreak]]

Namespace

Drupal\Tests\package_manager\Kernel

Code

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');
}

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