class TestSubscriber

Defines an event subscriber for testing validation of Package Manager events.

Hierarchy

  • class \Drupal\package_manager_test_validation\EventSubscriber\TestSubscriber extends \Symfony\Component\EventDispatcher\EventSubscriberInterface

Expanded class hierarchy of TestSubscriber

2 files declare their use of TestSubscriber
StageLoggedOnErrorTest.php in core/modules/package_manager/tests/src/Kernel/StageLoggedOnErrorTest.php
StageOwnershipTest.php in core/modules/package_manager/tests/src/Kernel/StageOwnershipTest.php
1 string reference to 'TestSubscriber'
package_manager_test_validation.services.yml in core/modules/package_manager/tests/modules/package_manager_test_validation/package_manager_test_validation.services.yml
core/modules/package_manager/tests/modules/package_manager_test_validation/package_manager_test_validation.services.yml
1 service uses TestSubscriber
package_manager_test_validation.subscriber in core/modules/package_manager/tests/modules/package_manager_test_validation/package_manager_test_validation.services.yml
Drupal\package_manager_test_validation\EventSubscriber\TestSubscriber

File

core/modules/package_manager/tests/modules/package_manager_test_validation/src/EventSubscriber/TestSubscriber.php, line 21

Namespace

Drupal\package_manager_test_validation\EventSubscriber
View source
class TestSubscriber implements EventSubscriberInterface {
  
  /**
   * The key to use store the test results.
   *
   * @var string
   */
  protected const STATE_KEY = 'package_manager_test_validation';
  
  /**
   * The state service.
   *
   * @var \Drupal\Core\State\StateInterface
   */
  protected $state;
  
  /**
   * Creates a TestSubscriber object.
   *
   * @param \Drupal\Core\State\StateInterface $state
   *   The state service.
   */
  public function __construct(StateInterface $state) {
    $this->state = $state;
  }
  
  /**
   * Sets whether a specific event will call exit().
   *
   * This is useful for simulating an unrecoverable (fatal) error when handling
   * the given event.
   *
   * @param string $event
   *   The event class.
   */
  public static function setExit(string $event) : void {
    \Drupal::state()->set(self::getStateKey($event), 'exit');
  }
  
  /**
   * Sets validation results for a specific event.
   *
   * This method is static to enable setting the expected results before this
   * module is enabled.
   *
   * @param \Drupal\package_manager\ValidationResult[]|null $results
   *   The validation results, or NULL to delete stored results.
   * @param string $event
   *   The event class.
   */
  public static function setTestResult(?array $results, string $event) : void {
    $key = static::getStateKey($event);
    $state = \Drupal::state();
    if (isset($results)) {
      $state->set($key, $results);
    }
    else {
      $state->delete($key);
    }
  }
  
  /**
   * Sets an exception to throw for a specific event.
   *
   * This method is static to enable setting the expected results before this
   * module is enabled.
   *
   * @param \Throwable|null $error
   *   The exception to throw, or NULL to delete a stored exception.
   * @param string $event
   *   The event class.
   */
  public static function setException(?\Throwable $error, string $event) : void {
    $key = self::getStateKey($event);
    $state = \Drupal::state();
    if (isset($error)) {
      $state->set($key, $error);
    }
    else {
      $state->delete($key);
    }
  }
  
  /**
   * Computes the state key to use for a given event class.
   *
   * @param string $event
   *   The event class.
   *
   * @return string
   *   The state key under which to store the results for the given event.
   */
  protected static function getStateKey(string $event) : string {
    $key = hash('sha256', static::class . $event);
    return static::STATE_KEY . substr($key, 0, 8);
  }
  
  /**
   * Adds validation results to a stage event.
   *
   * @param \Drupal\package_manager\Event\SandboxEvent $event
   *   The event object.
   */
  public function handleEvent(SandboxEvent $event) : void {
    $results = $this->state
      ->get(self::getStateKey(get_class($event)), []);
    // Record that value of maintenance mode for each event.
    $this->state
      ->set(get_class($event) . '.system.maintenance_mode', $this->state
      ->get('system.maintenance_mode'));
    if ($results instanceof \Throwable) {
      throw $results;
    }
    elseif ($results === 'exit') {
      exit;
    }
    elseif (is_string($results)) {
      \Drupal::messenger()->addStatus($results);
      return;
    }
    /** @var \Drupal\package_manager\ValidationResult $result */
    foreach ($results as $result) {
      $event->addResult($result);
    }
  }
  
  /**
   * {@inheritdoc}
   */
  public static function getSubscribedEvents() : array {
    return [
      PreCreateEvent::class => [
        'handleEvent',
        5,
      ],
      PostCreateEvent::class => [
        'handleEvent',
        5,
      ],
      PreRequireEvent::class => [
        'handleEvent',
        5,
      ],
      PostRequireEvent::class => [
        'handleEvent',
        5,
      ],
      PreApplyEvent::class => [
        'handleEvent',
        5,
      ],
      PostApplyEvent::class => [
        'handleEvent',
        5,
      ],
      StatusCheckEvent::class => [
        'handleEvent',
        5,
      ],
    ];
  }
  
  /**
   * Sets a status message that will be sent to the messenger for an event.
   *
   * @param string $message
   *   Message text.
   * @param string $event
   *   The event class.
   */
  public static function setMessage(string $message, string $event) : void {
    $key = static::getStateKey($event);
    $state = \Drupal::state();
    $state->set($key, $message);
  }

}

Members

Title Sort descending Modifiers Object type Summary
TestSubscriber::$state protected property The state service.
TestSubscriber::getStateKey protected static function Computes the state key to use for a given event class.
TestSubscriber::getSubscribedEvents public static function
TestSubscriber::handleEvent public function Adds validation results to a stage event.
TestSubscriber::setException public static function Sets an exception to throw for a specific event.
TestSubscriber::setExit public static function Sets whether a specific event will call exit().
TestSubscriber::setMessage public static function Sets a status message that will be sent to the messenger for an event.
TestSubscriber::setTestResult public static function Sets validation results for a specific event.
TestSubscriber::STATE_KEY protected constant The key to use store the test results.
TestSubscriber::__construct public function Creates a TestSubscriber object.

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