Security update for permissions_by_term
[yaffs-website] / vendor / drupal / drupal-extension / src / Drupal / DrupalExtension / Context / MessageContext.php
diff --git a/vendor/drupal/drupal-extension/src/Drupal/DrupalExtension/Context/MessageContext.php b/vendor/drupal/drupal-extension/src/Drupal/DrupalExtension/Context/MessageContext.php
new file mode 100644 (file)
index 0000000..0d5e7dd
--- /dev/null
@@ -0,0 +1,295 @@
+<?php
+
+namespace Drupal\DrupalExtension\Context;
+
+use Behat\Behat\Context\TranslatableContext;
+use Behat\Gherkin\Node\TableNode;
+
+/**
+ * Provides step-definitions for interacting with Drupal messages.
+ */
+class MessageContext extends RawDrupalContext implements TranslatableContext {
+
+  /**
+   * {@inheritDoc}
+   */
+  public static function getTranslationResources() {
+    return glob(__DIR__ . '/../../../../i18n/*.xliff');
+  }
+
+  /**
+   * Checks if the current page contains the given error message
+   *
+   * @param $message
+   *   string The text to be checked
+   *
+   * @Then I should see the error message( containing) :message
+   */
+  public function assertErrorVisible($message) {
+    $this->_assert(
+      $message,
+      'error_message_selector',
+      "The page '%s' does not contain any error messages",
+      "The page '%s' does not contain the error message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page contains the given set of error messages
+   *
+   * @param $messages
+   *   array An array of texts to be checked
+   *
+   * @Then I should see the following error message(s):
+   */
+  public function assertMultipleErrors(TableNode $messages) {
+    foreach ($messages->getHash() as $key => $value) {
+      $message = trim($value['error messages']);
+      $this->assertErrorVisible($message);
+    }
+  }
+
+  /**
+   * Checks if the current page does not contain the given error message
+   *
+   * @param $message
+   *   string The text to be checked
+   *
+   * @Given I should not see the error message( containing) :message
+   */
+  public function assertNotErrorVisible($message) {
+    $this->_assertNot(
+      $message,
+      'error_message_selector',
+      "The page '%s' contains the error message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page does not contain the given set error messages
+   *
+   * @param $messages
+   *   array An array of texts to be checked
+   *
+   * @Then I should not see the following error messages:
+   */
+  public function assertNotMultipleErrors(TableNode $messages) {
+    foreach ($messages->getHash() as $key => $value) {
+      $message = trim($value['error messages']);
+      $this->assertNotErrorVisible($message);
+    }
+  }
+
+  /**
+   * Checks if the current page contains the given success message
+   *
+   * @param $message
+   *   string The text to be checked
+   *
+   * @Then I should see the success message( containing) :message
+   */
+  public function assertSuccessMessage($message) {
+    $this->_assert(
+      $message,
+      'success_message_selector',
+      "The page '%s' does not contain any success messages",
+      "The page '%s' does not contain the success message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page contains the given set of success messages
+   *
+   * @param $message
+   *   array An array of texts to be checked
+   *
+   * @Then I should see the following success messages:
+   */
+  public function assertMultipleSuccessMessage(TableNode $messages) {
+    foreach ($messages->getHash() as $key => $value) {
+      $message = trim($value['success messages']);
+      $this->assertSuccessMessage($message);
+    }
+  }
+
+  /**
+   * Checks if the current page does not contain the given set of success message
+   *
+   * @param $message
+   *   string The text to be checked
+   *
+   * @Given I should not see the success message( containing) :message
+   */
+  public function assertNotSuccessMessage($message) {
+    $this->_assertNot(
+      $message,
+      'success_message_selector',
+      "The page '%s' contains the success message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page does not contain the given set of success messages
+   *
+   * @param $message
+   *   array An array of texts to be checked
+   *
+   * @Then I should not see the following success messages:
+   */
+  public function assertNotMultipleSuccessMessage(TableNode $messages) {
+    foreach ($messages->getHash() as $key => $value) {
+      $message = trim($value['success messages']);
+      $this->assertNotSuccessMessage($message);
+    }
+  }
+
+  /**
+   * Checks if the current page contains the given warning message
+   *
+   * @param $message
+   *   string The text to be checked
+   *
+   * @Then I should see the warning message( containing) :message
+   */
+  public function assertWarningMessage($message) {
+    $this->_assert(
+      $message,
+      'warning_message_selector',
+      "The page '%s' does not contain any warning messages",
+      "The page '%s' does not contain the warning message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page contains the given set of warning messages
+   *
+   * @param $message
+   *   array An array of texts to be checked
+   *
+   * @Then I should see the following warning messages:
+   */
+  public function assertMultipleWarningMessage(TableNode $messages) {
+    foreach ($messages->getHash() as $key => $value) {
+      $message = trim($value['warning messages']);
+      $this->assertWarningMessage($message);
+    }
+  }
+
+  /**
+   * Checks if the current page does not contain the given set of warning message
+   *
+   * @param $message
+   *   string The text to be checked
+   *
+   * @Given I should not see the warning message( containing) :message
+   */
+  public function assertNotWarningMessage($message) {
+    $this->_assertNot(
+      $message,
+      'warning_message_selector',
+      "The page '%s' contains the warning message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page does not contain the given set of warning messages
+   *
+   * @param $message
+   *   array An array of texts to be checked
+   *
+   * @Then I should not see the following warning messages:
+   */
+  public function assertNotMultipleWarningMessage(TableNode $messages) {
+    foreach ($messages->getHash() as $key => $value) {
+      $message = trim($value['warning messages']);
+      $this->assertNotWarningMessage($message);
+    }
+  }
+
+  /**
+   * Checks if the current page contain the given message
+   *
+   * @param $message
+   *   string The message to be checked
+   *
+   * @Then I should see the message( containing) :message
+   */
+  public function assertMessage($message) {
+    $this->_assert(
+      $message,
+      'message_selector',
+      "The page '%s' does not contain any messages",
+      "The page '%s' does not contain the message '%s'"
+    );
+  }
+
+  /**
+   * Checks if the current page does not contain the given message
+   *
+   * @param $message
+   *   string The message to be checked
+   *
+   * @Then I should not see the message( containing) :message
+   */
+  public function assertNotMessage($message) {
+    $this->_assertNot(
+      $message,
+      'message_selector',
+      "The page '%s' contains the message '%s'"
+    );
+  }
+
+  /**
+   * Internal callback to check for a specific message in a given context.
+   *
+   * @param $message
+   *   string The message to be checked
+   * @param $selectorId
+   *   string CSS selector name
+   * @param $exceptionMsgNone
+   *   string The message being thrown when no message is contained, string
+   *   should contain one '%s' as a placeholder for the current URL
+   * @param $exceptionMsgMissing
+   *   string The message being thrown when the message is not contained, string
+   *   should contain two '%s' as placeholders for the current URL and the message.
+   * @throws \Exception
+   */
+  private function _assert($message, $selectorId, $exceptionMsgNone, $exceptionMsgMissing) {
+    $selector = $this->getDrupalSelector($selectorId);
+    $selectorObjects = $this->getSession()->getPage()->findAll("css", $selector);
+    if (empty($selectorObjects)) {
+      throw new \Exception(sprintf($exceptionMsgNone, $this->getSession()->getCurrentUrl()));
+    }
+    foreach ($selectorObjects as $selectorObject) {
+      if (strpos(trim($selectorObject->getText()), $message) !== FALSE) {
+        return;
+      }
+    }
+    throw new \Exception(sprintf($exceptionMsgMissing, $this->getSession()->getCurrentUrl(), $message));
+  }
+
+  /**
+   * Internal callback to check if the current page does not contain the given message
+   *
+   * @param $message
+   *   string The message to be checked
+   * @param $selectorId
+   *   string CSS selector name
+   * @param $exceptionMsg
+   *   string The message being thrown when the message is contained, string
+   *   should contain two '%s' as placeholders for the current URL and the message.
+   * @throws \Exception
+   */
+  private function _assertNot($message, $selectorId, $exceptionMsg) {
+    $selector = $this->getDrupalSelector($selectorId);
+    $selectorObjects = $this->getSession()->getPage()->findAll("css", $selector);
+    if (!empty($selectorObjects)) {
+      foreach ($selectorObjects as $selectorObject) {
+        if (strpos(trim($selectorObject->getText()), $message) !== FALSE) {
+          throw new \Exception(sprintf($exceptionMsg, $this->getSession()->getCurrentUrl(), $message));
+        }
+      }
+    }
+  }
+
+}