Loading package_manager/package_manager.services.yml +7 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,13 @@ services: - '@extension.list.theme' tags: - { name: event_subscriber } package_manager.validator.composer_json_exists: class: Drupal\package_manager\Validator\ComposerJsonExistsValidator arguments: - '@package_manager.path_locator' - '@string_translation' tags: - { name: event_subscriber } package_manager.test_site_excluder: class: Drupal\package_manager\PathExcluder\TestSiteExcluder arguments: Loading package_manager/src/Validator/ComposerJsonExistsValidator.php 0 → 100644 +73 −0 Original line number Diff line number Diff line <?php declare(strict_types = 1); namespace Drupal\package_manager\Validator; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslationInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\PreOperationStageEvent; use Drupal\package_manager\Event\StatusCheckEvent; use Drupal\package_manager\PathLocator; /** * Validates that the active composer.json file exists. * * @internal * This is an internal part of Package Manager and may be changed or removed * at any time without warning. External code should not interact with this * class. */ final class ComposerJsonExistsValidator implements EventSubscriberInterface { use StringTranslationTrait; /** * The path locator service. * * @var \Drupal\package_manager\PathLocator */ protected $pathLocator; /** * Constructs a ComposerJsonExistsValidator object. * * @param \Drupal\package_manager\PathLocator $path_locator * The path locator service. * @param \Drupal\Core\StringTranslation\TranslationInterface $translation * The string translation service. */ public function __construct(PathLocator $path_locator, TranslationInterface $translation) { $this->pathLocator = $path_locator; $this->setStringTranslation($translation); } /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { // Set priority to 190 which puts it just after EnvironmentSupportValidator. // @see \Drupal\package_manager\Validator\EnvironmentSupportValidator return [ PreCreateEvent::class => ['validateComposerJson', 190], StatusCheckEvent::class => ['validateComposerJson', 190], ]; } /** * Validates that the active composer.json file exists. * * @param \Drupal\package_manager\Event\PreOperationStageEvent $event * The event. */ public function validateComposerJson(PreOperationStageEvent $event): void { $project_root = $this->pathLocator->getProjectRoot(); if (!file_exists($project_root . '/composer.json')) { $event->addError([$this->t('No composer.json file can be found at @project_root', ['@project_root' => $project_root])]); $event->stopPropagation(); } } } package_manager/tests/src/Kernel/ComposerJsonExistsValidatorTest.php 0 → 100644 +42 −0 Original line number Diff line number Diff line <?php declare(strict_types = 1); namespace Drupal\Tests\package_manager\Kernel; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\StatusCheckEvent; use Drupal\package_manager\ValidationResult; /** * @covers \Drupal\package_manager\Validator\ComposerJsonExistsValidator * @group package_manager */ class ComposerJsonExistsValidatorTest extends PackageManagerKernelTestBase { /** * Tests validation when the active composer.json is not present. */ public function testComposerRequirement(): void { unlink($this->container->get('package_manager.path_locator') ->getProjectRoot() . '/composer.json'); $result = ValidationResult::createError([ 'No composer.json file can be found at vfs://root/active', ]); foreach ([PreCreateEvent::class, StatusCheckEvent::class] as $event_class) { $this->container->get('event_dispatcher')->addListener( $event_class, function () use ($event_class): void { $this->fail('Event propagation should have been stopped during ' . $event_class . '.'); }, // Execute this listener immediately after the tested validator, which // uses priority 190. This ensures informative test failures. // @see \Drupal\package_manager\Validator\ComposerJsonExistsValidator::getSubscribedEvents() 189 ); } $this->assertStatusCheckResults([$result]); $this->assertResults([$result], PreCreateEvent::class); } } package_manager/tests/src/Kernel/EnvironmentSupportValidatorTest.php +14 −33 Original line number Diff line number Diff line Loading @@ -3,47 +3,16 @@ namespace Drupal\Tests\package_manager\Kernel; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\PreOperationStageEvent; use Drupal\package_manager\Event\StatusCheckEvent; use Drupal\package_manager\ValidationResult; use Drupal\package_manager\Validator\EnvironmentSupportValidator; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * @covers \Drupal\package_manager\Validator\EnvironmentSupportValidator * @group package_manager * @internal */ class EnvironmentSupportValidatorTest extends PackageManagerKernelTestBase implements EventSubscriberInterface { /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->container->get('event_dispatcher')->addSubscriber($this); } /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { $map = function (): string { return 'assertValidationStopped'; }; return array_map($map, EnvironmentSupportValidator::getSubscribedEvents()); } /** * Ensures that the validator stops any further validation. * * @param \Drupal\package_manager\Event\PreOperationStageEvent $event * The event object. */ public function assertValidationStopped(PreOperationStageEvent $event): void { if ($event->getResults()) { $this->assertTrue($event->isPropagationStopped()); } } class EnvironmentSupportValidatorTest extends PackageManagerKernelTestBase { /** * Tests handling of an invalid URL in the environment support variable. Loading @@ -54,6 +23,18 @@ class EnvironmentSupportValidatorTest extends PackageManagerKernelTestBase imple $result = ValidationResult::createError([ 'Package Manager is not supported by your environment.', ]); foreach ([PreCreateEvent::class, StatusCheckEvent::class] as $event_class) { $this->container->get('event_dispatcher')->addListener( $event_class, function () use ($event_class): void { $this->fail('Event propagation should have been stopped during ' . $event_class . '.'); }, // Execute this listener immediately after the tested validator, which // uses priority 200. This ensures informative test failures. // @see \Drupal\package_manager\Validator\EnvironmentSupportValidator::getSubscribedEvents() 199 ); } $this->assertStatusCheckResults([$result]); $this->assertResults([$result], PreCreateEvent::class); } Loading Loading
package_manager/package_manager.services.yml +7 −0 Original line number Diff line number Diff line Loading @@ -141,6 +141,13 @@ services: - '@extension.list.theme' tags: - { name: event_subscriber } package_manager.validator.composer_json_exists: class: Drupal\package_manager\Validator\ComposerJsonExistsValidator arguments: - '@package_manager.path_locator' - '@string_translation' tags: - { name: event_subscriber } package_manager.test_site_excluder: class: Drupal\package_manager\PathExcluder\TestSiteExcluder arguments: Loading
package_manager/src/Validator/ComposerJsonExistsValidator.php 0 → 100644 +73 −0 Original line number Diff line number Diff line <?php declare(strict_types = 1); namespace Drupal\package_manager\Validator; use Drupal\Core\StringTranslation\StringTranslationTrait; use Drupal\Core\StringTranslation\TranslationInterface; use Symfony\Component\EventDispatcher\EventSubscriberInterface; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\PreOperationStageEvent; use Drupal\package_manager\Event\StatusCheckEvent; use Drupal\package_manager\PathLocator; /** * Validates that the active composer.json file exists. * * @internal * This is an internal part of Package Manager and may be changed or removed * at any time without warning. External code should not interact with this * class. */ final class ComposerJsonExistsValidator implements EventSubscriberInterface { use StringTranslationTrait; /** * The path locator service. * * @var \Drupal\package_manager\PathLocator */ protected $pathLocator; /** * Constructs a ComposerJsonExistsValidator object. * * @param \Drupal\package_manager\PathLocator $path_locator * The path locator service. * @param \Drupal\Core\StringTranslation\TranslationInterface $translation * The string translation service. */ public function __construct(PathLocator $path_locator, TranslationInterface $translation) { $this->pathLocator = $path_locator; $this->setStringTranslation($translation); } /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { // Set priority to 190 which puts it just after EnvironmentSupportValidator. // @see \Drupal\package_manager\Validator\EnvironmentSupportValidator return [ PreCreateEvent::class => ['validateComposerJson', 190], StatusCheckEvent::class => ['validateComposerJson', 190], ]; } /** * Validates that the active composer.json file exists. * * @param \Drupal\package_manager\Event\PreOperationStageEvent $event * The event. */ public function validateComposerJson(PreOperationStageEvent $event): void { $project_root = $this->pathLocator->getProjectRoot(); if (!file_exists($project_root . '/composer.json')) { $event->addError([$this->t('No composer.json file can be found at @project_root', ['@project_root' => $project_root])]); $event->stopPropagation(); } } }
package_manager/tests/src/Kernel/ComposerJsonExistsValidatorTest.php 0 → 100644 +42 −0 Original line number Diff line number Diff line <?php declare(strict_types = 1); namespace Drupal\Tests\package_manager\Kernel; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\StatusCheckEvent; use Drupal\package_manager\ValidationResult; /** * @covers \Drupal\package_manager\Validator\ComposerJsonExistsValidator * @group package_manager */ class ComposerJsonExistsValidatorTest extends PackageManagerKernelTestBase { /** * Tests validation when the active composer.json is not present. */ public function testComposerRequirement(): void { unlink($this->container->get('package_manager.path_locator') ->getProjectRoot() . '/composer.json'); $result = ValidationResult::createError([ 'No composer.json file can be found at vfs://root/active', ]); foreach ([PreCreateEvent::class, StatusCheckEvent::class] as $event_class) { $this->container->get('event_dispatcher')->addListener( $event_class, function () use ($event_class): void { $this->fail('Event propagation should have been stopped during ' . $event_class . '.'); }, // Execute this listener immediately after the tested validator, which // uses priority 190. This ensures informative test failures. // @see \Drupal\package_manager\Validator\ComposerJsonExistsValidator::getSubscribedEvents() 189 ); } $this->assertStatusCheckResults([$result]); $this->assertResults([$result], PreCreateEvent::class); } }
package_manager/tests/src/Kernel/EnvironmentSupportValidatorTest.php +14 −33 Original line number Diff line number Diff line Loading @@ -3,47 +3,16 @@ namespace Drupal\Tests\package_manager\Kernel; use Drupal\package_manager\Event\PreCreateEvent; use Drupal\package_manager\Event\PreOperationStageEvent; use Drupal\package_manager\Event\StatusCheckEvent; use Drupal\package_manager\ValidationResult; use Drupal\package_manager\Validator\EnvironmentSupportValidator; use Symfony\Component\EventDispatcher\EventSubscriberInterface; /** * @covers \Drupal\package_manager\Validator\EnvironmentSupportValidator * @group package_manager * @internal */ class EnvironmentSupportValidatorTest extends PackageManagerKernelTestBase implements EventSubscriberInterface { /** * {@inheritdoc} */ protected function setUp(): void { parent::setUp(); $this->container->get('event_dispatcher')->addSubscriber($this); } /** * {@inheritdoc} */ public static function getSubscribedEvents(): array { $map = function (): string { return 'assertValidationStopped'; }; return array_map($map, EnvironmentSupportValidator::getSubscribedEvents()); } /** * Ensures that the validator stops any further validation. * * @param \Drupal\package_manager\Event\PreOperationStageEvent $event * The event object. */ public function assertValidationStopped(PreOperationStageEvent $event): void { if ($event->getResults()) { $this->assertTrue($event->isPropagationStopped()); } } class EnvironmentSupportValidatorTest extends PackageManagerKernelTestBase { /** * Tests handling of an invalid URL in the environment support variable. Loading @@ -54,6 +23,18 @@ class EnvironmentSupportValidatorTest extends PackageManagerKernelTestBase imple $result = ValidationResult::createError([ 'Package Manager is not supported by your environment.', ]); foreach ([PreCreateEvent::class, StatusCheckEvent::class] as $event_class) { $this->container->get('event_dispatcher')->addListener( $event_class, function () use ($event_class): void { $this->fail('Event propagation should have been stopped during ' . $event_class . '.'); }, // Execute this listener immediately after the tested validator, which // uses priority 200. This ensures informative test failures. // @see \Drupal\package_manager\Validator\EnvironmentSupportValidator::getSubscribedEvents() 199 ); } $this->assertStatusCheckResults([$result]); $this->assertResults([$result], PreCreateEvent::class); } Loading