You are here

final class ModerationContext in Lightning Workflow 8.3

Same name and namespace in other branches
  1. 8.2 tests/contexts/ModerationContext.behat.inc \Acquia\LightningExtension\Context\ModerationContext

Contains miscellaneous step definitions for testing moderation UIs.

@internal This is an internal part of Lightning Workflow's testing system and may be changed or removed at any time without warning. External code should not extend, instantiate, or use this class in any way! If you want to use the functionality of this class, you should copy the relevant code into your own project.

Hierarchy

  • class \Acquia\LightningExtension\Context\ModerationContext extends \Behat\MinkExtension\Context\RawMinkContext implements \Drupal\DrupalExtension\Context\DrupalSubContextInterface

Expanded class hierarchy of ModerationContext

File

tests/contexts/ModerationContext.behat.inc, line 23

Namespace

Acquia\LightningExtension\Context
View source
final class ModerationContext extends RawMinkContext implements DrupalSubContextInterface {

  /**
   * {@inheritdoc}
   */
  public function __construct(DrupalDriverManager $drupal) {
  }

  /**
   * Opens the moderation sidebar.
   *
   * @When I open the moderation sidebar
   *
   * @throws \Behat\Mink\Exception\ElementNotFoundException
   *   If the moderation sidebar does not appear on the page.
   */
  public function openModerationSidebar() {
    $this
      ->assertSession()
      ->elementExists('css', '#toolbar-bar')
      ->clickLink('Tasks');
    $session = $this
      ->getSession();
    $sidebar = $session
      ->getPage()
      ->waitFor(10, function (DocumentElement $page) {
      return $page
        ->find('css', '.moderation-sidebar-container');
    });
    if (empty($sidebar)) {
      throw new ElementNotFoundException($session
        ->getDriver(), 'element', 'css', '.moderation-sidebar-container');
    }
  }

  /**
   * Asserts that the "Tasks" toolbar link indicates a moderation state.
   *
   * @param string $state
   *   The label of the expected moderation state.
   *
   * @Then the current moderation state should be :state
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   *   If the current moderation state is not the expected one.
   */
  public function assertCurrentModerationState($state) {
    $assert_session = $this
      ->assertSession();
    $toolbar = $assert_session
      ->elementExists('css', '#toolbar-bar');
    $current_state = $assert_session
      ->elementExists('named', [
      'link',
      'Tasks',
    ], $toolbar)
      ->getAttribute('data-label');
    if ($current_state !== $state) {
      throw new ExpectationException("Expected the current moderation state to be {$state}, but it is {$current_state}.", $this
        ->getSession()
        ->getDriver());
    }
  }

  /**
   * Asserts the presence of the moderation dashboard.
   *
   * @Then I should see a dashboard for moderating content
   */
  public function assertModerationDashboard() {
    $this
      ->assertBlock('views_block:content_moderation_dashboard_in_review-block_1');
    $this
      ->assertBlock('views_block:content_moderation_dashboard_in_review-block_2');
    $this
      ->assertBlock('moderation_dashboard_activity');
    $this
      ->assertBlock('views_block:moderation_dashboard_recently_created-block_1');
    $this
      ->assertBlock('views_block:content_moderation_dashboard_in_review-block_3');
    $this
      ->assertBlock('views_block:moderation_dashboard_recent_changes-block_1');
    $this
      ->assertBlock('views_block:moderation_dashboard_recent_changes-block_2');
    $this
      ->assertBlock('views_block:moderation_dashboard_recently_created-block_2');
  }

  /**
   * Autosaves the current form.
   *
   * @When I wait for my work to be autosaved
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   *   If the autosave notification does not appear or disappear as expected.
   */
  public function awaitAutosave() {
    $driver = $this
      ->getSession()
      ->getDriver();
    $element = $this
      ->assertSession()
      ->elementExists('css', '#autosave-notification');
    $is_visible = $element
      ->waitFor(20, function (NodeElement $element) {
      return $element
        ->isVisible();
    });
    if ($is_visible == FALSE) {
      throw new ExpectationException('Expected autosave notification to appear, but it did not.', $driver);
    }
    $is_hidden = $element
      ->waitFor(10, function (NodeElement $element) {
      return $element
        ->isVisible() === FALSE;
    });
    if ($is_hidden == FALSE) {
      throw new ExpectationException('Expected autosave notification to disappear after saving, but it did not.', $driver);
    }
  }

  /**
   * Restores autosaved work.
   *
   * @Then I should be able to restore my work
   *
   * @throws \Behat\Mink\Exception\ElementNotFoundException
   *   If the "Resume editing" button does not appear.
   */
  public function assertRestoreFromAutosave() {
    $session = $this
      ->getSession();

    /** @var \Behat\Mink\Element\NodeElement $button */
    $button = $session
      ->getPage()
      ->waitFor(10, function (DocumentElement $page) {
      return $page
        ->findButton('Resume editing');
    });
    if ($button) {
      $button
        ->press();
    }
    else {
      throw new ElementNotFoundException($session
        ->getDriver(), 'button', 'named', 'Resume editing');
    }
  }

  /**
   * Compares two revisions of a node.
   *
   * @param string $a
   *   The one-based index of a revision to compare. 1st is oldest.
   * @param string $b
   *   The one-based index of a revision to compare. 1st is oldest.
   *
   * @When I compare the :a and :b revisions
   */
  public function compareRevisions($a, $b) {
    $page = $this
      ->getSession()
      ->getPage();
    $re = '/^[0-9]+(st|nd|rd|th)$/i';
    if (preg_match($re, $a)) {
      $a = substr($a, 0, -2);
    }
    if (preg_match($re, $b)) {
      $b = substr($b, 0, -2);
    }
    $a = (int) $a - 1;
    $b = (int) $b - 1;
    $page
      ->clickLink('Revisions');

    /** @var \Behat\Mink\Element\NodeElement[] $rows */
    $rows = $page
      ->findAll('css', '.diff-revisions tbody tr');
    $rows = array_reverse($rows);
    $a = $rows[$a]
      ->findField('radios_left')
      ->getValue();
    $b = $rows[$b]
      ->findField('radios_right')
      ->getValue();
    $page
      ->selectFieldOption('radios_left', $a);
    $page
      ->selectFieldOption('radios_right', $b);
    $page
      ->pressButton('Compare');
  }

  /**
   * Asserts that Quick Edit is enabled for at least one entity on the page.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   *   If Quick Edit is disabled on the current page.
   *
   * @Then Quick Edit should be enabled
   */
  public function assertQuickEditEnabled() {
    $session = $this
      ->getSession();
    $is_enabled = $session
      ->wait(10000, 'Drupal.quickedit.collections.entities.length > 0');
    if (empty($is_enabled)) {
      throw new ExpectationException('Expected Quick Edit to be enabled, but it is not.', $session
        ->getDriver());
    }
  }

  /**
   * Asserts that Quick Edit is not enabled for any entities on the page.
   *
   * @throws \Behat\Mink\Exception\ExpectationException
   *   If Quick Edit is enabled on the current page.
   *
   * @Then Quick Edit should be disabled
   */
  public function assertQuickEditDisabled() {
    $session = $this
      ->getSession();
    $is_disabled = $session
      ->wait(10000, 'Drupal.quickedit.collections.entities.length === 0');
    if (empty($is_disabled)) {
      throw new ExpectationException('Expected Quick Edit to be disabled, but it is not.', $session
        ->getDriver());
    }
  }

  /**
   * Asserts that a block exists with a Quick Edit contextual link.
   *
   * @param string $plugin
   *   The block plugin ID.
   *
   * @Then I should see a :plugin block with Quick Edit
   */
  public function assertQuickEditableBlock($plugin) {
    $block = $this
      ->assertBlock($plugin);
    $assert = $this
      ->assertSession();
    $links = $assert
      ->elementExists('css', 'ul.contextual-links', $block);
    $assert
      ->elementExists('named', [
      'link',
      'Quick edit',
    ], $links);
  }

  /**
   * Asserts the presence of a particular block by its plugin ID.
   *
   * @param string $plugin_id
   *   The block plugin ID.
   *
   * @return \Behat\Mink\Element\ElementInterface
   *   The block element.
   */
  private function assertBlock($plugin_id) {
    return $this
      ->assertSession()
      ->elementExists('css', '[data-block-plugin-id="' . $plugin_id . '"]');
  }

}

Members

Namesort descending Modifiers Type Description Overrides
ModerationContext::assertBlock private function Asserts the presence of a particular block by its plugin ID.
ModerationContext::assertCurrentModerationState public function Asserts that the "Tasks" toolbar link indicates a moderation state.
ModerationContext::assertModerationDashboard public function Asserts the presence of the moderation dashboard.
ModerationContext::assertQuickEditableBlock public function Asserts that a block exists with a Quick Edit contextual link.
ModerationContext::assertQuickEditDisabled public function Asserts that Quick Edit is not enabled for any entities on the page.
ModerationContext::assertQuickEditEnabled public function Asserts that Quick Edit is enabled for at least one entity on the page.
ModerationContext::assertRestoreFromAutosave public function Restores autosaved work.
ModerationContext::awaitAutosave public function Autosaves the current form.
ModerationContext::compareRevisions public function Compares two revisions of a node.
ModerationContext::openModerationSidebar public function Opens the moderation sidebar.
ModerationContext::__construct public function