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 @group package_manager @internal

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