EnabledExtensionsValidatorTest.php

Namespace

Drupal\Tests\package_manager\Kernel

File

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

View source
<?php

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

use Drupal\Core\Extension\Extension;
use Drupal\fixture_manipulator\ActiveFixtureManipulator;
use Drupal\package_manager\Event\PreApplyEvent;
use Drupal\package_manager\PathLocator;
use Drupal\package_manager\ValidationResult;
use Drupal\Tests\package_manager\Traits\ComposerInstallersTrait;

/**
 * @covers \Drupal\package_manager\Validator\EnabledExtensionsValidator
 * @group package_manager
 * @internal
 */
class EnabledExtensionsValidatorTest extends PackageManagerKernelTestBase {
  use ComposerInstallersTrait;
  
  /**
   * Data provider for testExtensionRemoved().
   *
   * @return mixed[][]
   *   The test cases.
   */
  public static function providerExtensionRemoved() : array {
    $summary = t('The update cannot proceed because the following enabled Drupal extension was removed during the update.');
    return [
      'module' => [
        [
          [
            'name' => 'drupal/test_module2',
            'version' => '1.3.1',
            'type' => 'drupal-module',
          ],
        ],
        [
          ValidationResult::createError([
            t("'test_module2' module (provided by <code>drupal/test_module2</code>)"),
          ], $summary),
        ],
      ],
      'module and theme' => [
        [
          [
            'name' => 'drupal/test_module1',
            'version' => '1.3.1',
            'type' => 'drupal-module',
          ],
          [
            'name' => 'drupal/test_theme',
            'version' => '1.3.1',
            'type' => 'drupal-theme',
          ],
        ],
        [
          ValidationResult::createError([
            t("'test_module1' module (provided by <code>drupal/test_module1</code>)"),
            t("'test_theme' theme (provided by <code>drupal/test_theme</code>)"),
          ], t('The update cannot proceed because the following enabled Drupal extensions were removed during the update.')),
        ],
      ],
      'profile' => [
        [
          [
            'name' => 'drupal/test_profile',
            'version' => '1.3.1',
            'type' => 'drupal-profile',
          ],
        ],
        [
          ValidationResult::createError([
            t("'test_profile' profile (provided by <code>drupal/test_profile</code>)"),
          ], $summary),
        ],
      ],
      'theme' => [
        [
          [
            'name' => 'drupal/test_theme',
            'version' => '1.3.1',
            'type' => 'drupal-theme',
          ],
        ],
        [
          ValidationResult::createError([
            t("'test_theme' theme (provided by <code>drupal/test_theme</code>)"),
          ], $summary),
        ],
      ],
    ];
  }
  
  /**
   * Tests that error is raised if Drupal modules, profiles or themes are removed.
   *
   * @param array $packages
   *   Packages that will be added to the active directory, and removed from the
   *   stage directory.
   * @param \Drupal\package_manager\ValidationResult[] $expected_results
   *   The expected validation results.
   *
   * @dataProvider providerExtensionRemoved
   */
  public function testExtensionRemoved(array $packages, array $expected_results) : void {
    $project_root = $this->container
      ->get(PathLocator::class)
      ->getProjectRoot();
    $this->installComposerInstallers($project_root);
    $active_manipulator = new ActiveFixtureManipulator();
    $stage_manipulator = $this->getStageFixtureManipulator();
    foreach ($packages as $package) {
      $active_manipulator->addPackage($package, FALSE, TRUE);
      $stage_manipulator->removePackage($package['name']);
    }
    $active_manipulator->commitChanges();
    foreach ($packages as $package) {
      $extension_name = str_replace('drupal/', '', $package['name']);
      $extension = self::createExtension($project_root, $package['type'], $extension_name);
      if ($extension->getType() === 'theme') {
        /** @var \Drupal\Core\Extension\ThemeHandlerInterface $theme_handler */
        $theme_handler = $this->container
          ->get('theme_handler');
        $theme_handler->addTheme($extension);
        $this->assertArrayHasKey($extension_name, $theme_handler->listInfo());
      }
      else {
        /** @var \Drupal\Core\Extension\ModuleHandlerInterface $module_handler */
        $module_handler = $this->container
          ->get('module_handler');
        $module_list = $module_handler->getModuleList();
        $module_list[$extension_name] = $extension;
        $module_handler->setModuleList($module_list);
        $this->assertArrayHasKey($extension_name, $module_handler->getModuleList());
      }
    }
    $this->assertResults($expected_results, PreApplyEvent::class);
  }
  
  /**
   * Returns a mocked extension object for a package.
   *
   * @param string $project_root
   *   The project root directory.
   * @param string $package_type
   *   The package type (e.g., `drupal-module` or `drupal-theme`).
   * @param string $extension_name
   *   The name of the extension.
   *
   * @return \Drupal\Core\Extension\Extension
   *   An extension object.
   */
  private static function createExtension(string $project_root, string $package_type, string $extension_name) : Extension {
    $type = match ($package_type) {  'drupal-theme' => 'theme',
      'drupal-profile' => 'profile',
      default => 'module',
    
    };
    $subdirectory = match ($type) {  'theme' => 'themes',
      'profile' => 'profiles',
      'module' => 'modules',
    
    };
    return new Extension($project_root, $type, "{$subdirectory}/contrib/{$extension_name}/{$extension_name}.info.yml");
  }

}

Classes

Title Deprecated Summary
EnabledExtensionsValidatorTest @covers \Drupal\package_manager\Validator\EnabledExtensionsValidator[[api-linebreak]] @group package_manager @internal

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