Security update for permissions_by_term
[yaffs-website] / vendor / behat / mink-extension / src / Behat / MinkExtension / Listener / SessionsListener.php
diff --git a/vendor/behat/mink-extension/src/Behat/MinkExtension/Listener/SessionsListener.php b/vendor/behat/mink-extension/src/Behat/MinkExtension/Listener/SessionsListener.php
new file mode 100644 (file)
index 0000000..7a18cc9
--- /dev/null
@@ -0,0 +1,177 @@
+<?php
+
+/*
+ * This file is part of the Behat MinkExtension.
+ * (c) Konstantin Kudryashov <ever.zet@gmail.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Behat\MinkExtension\Listener;
+
+use Behat\Behat\EventDispatcher\Event\ExampleTested;
+use Behat\Behat\EventDispatcher\Event\ScenarioLikeTested;
+use Behat\Behat\EventDispatcher\Event\ScenarioTested;
+use Behat\Mink\Mink;
+use Behat\Testwork\EventDispatcher\Event\ExerciseCompleted;
+use Behat\Testwork\ServiceContainer\Exception\ProcessingException;
+use Behat\Testwork\Suite\Exception\SuiteConfigurationException;
+use Behat\Testwork\Suite\Suite;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Mink sessions listener.
+ * Listens Behat events and configures/stops Mink sessions.
+ *
+ * @author Konstantin Kudryashov <ever.zet@gmail.com>
+ */
+class SessionsListener implements EventSubscriberInterface
+{
+    private $mink;
+    private $defaultSession;
+    private $javascriptSession;
+
+    /**
+     * @var string[] The available javascript sessions
+     */
+    private $availableJavascriptSessions;
+
+    /**
+     * Initializes initializer.
+     *
+     * @param Mink        $mink
+     * @param string      $defaultSession
+     * @param string|null $javascriptSession
+     * @param string[]    $availableJavascriptSessions
+     */
+    public function __construct(Mink $mink, $defaultSession, $javascriptSession, array $availableJavascriptSessions = array())
+    {
+        $this->mink              = $mink;
+        $this->defaultSession    = $defaultSession;
+        $this->javascriptSession = $javascriptSession;
+        $this->availableJavascriptSessions = $availableJavascriptSessions;
+    }
+
+    /**
+     * {@inheritdoc}
+     */
+    public static function getSubscribedEvents()
+    {
+        return array(
+            ScenarioTested::BEFORE   => array('prepareDefaultMinkSession', 10),
+            ExampleTested::BEFORE    => array('prepareDefaultMinkSession', 10),
+            ExerciseCompleted::AFTER => array('tearDownMinkSessions', -10)
+        );
+    }
+
+    /**
+     * Configures default Mink session before each scenario.
+     * Configuration is based on provided scenario tags:
+     *
+     * `@javascript` tagged scenarios will get `javascript_session` as default session
+     * `@mink:CUSTOM_NAME tagged scenarios will get `CUSTOM_NAME` as default session
+     * Other scenarios get `default_session` as default session
+     *
+     * `@insulated` tag will cause Mink to stop current sessions before scenario
+     * instead of just soft-resetting them
+     *
+     * @param ScenarioLikeTested $event
+     *
+     * @throws ProcessingException when the @javascript tag is used without a javascript session
+     */
+    public function prepareDefaultMinkSession(ScenarioLikeTested $event)
+    {
+        $scenario = $event->getScenario();
+        $feature  = $event->getFeature();
+        $session  = null;
+
+        foreach (array_merge($feature->getTags(), $scenario->getTags()) as $tag) {
+            if ('javascript' === $tag) {
+                $session = $this->getJavascriptSession($event->getSuite());
+            } elseif (preg_match('/^mink\:(.+)/', $tag, $matches)) {
+                $session = $matches[1];
+            }
+        }
+
+        if (null === $session) {
+            $session = $this->getDefaultSession($event->getSuite());
+        }
+
+        if ($scenario->hasTag('insulated') || $feature->hasTag('insulated')) {
+            $this->mink->stopSessions();
+        } else {
+            $this->mink->resetSessions();
+        }
+
+        $this->mink->setDefaultSessionName($session);
+    }
+
+    /**
+     * Stops all started Mink sessions.
+     */
+    public function tearDownMinkSessions()
+    {
+        $this->mink->stopSessions();
+    }
+
+    private function getDefaultSession(Suite $suite)
+    {
+        if (!$suite->hasSetting('mink_session')) {
+            return $this->defaultSession;
+        }
+
+        $session = $suite->getSetting('mink_session');
+
+        if (!is_string($session)) {
+            throw new SuiteConfigurationException(
+                sprintf(
+                    '`mink_session` setting of the "%s" suite is expected to be a string, %s given.',
+                    $suite->getName(),
+                    gettype($session)
+                ),
+                $suite->getName()
+            );
+        }
+
+        return $session;
+    }
+
+    private function getJavascriptSession(Suite $suite)
+    {
+        if (!$suite->hasSetting('mink_javascript_session')) {
+            if (null === $this->javascriptSession) {
+                throw new ProcessingException('The @javascript tag cannot be used without enabling a javascript session');
+            }
+
+            return $this->javascriptSession;
+        }
+
+        $session = $suite->getSetting('mink_javascript_session');
+
+        if (!is_string($session)) {
+            throw new SuiteConfigurationException(
+                sprintf(
+                    '`mink_javascript_session` setting of the "%s" suite is expected to be a string, %s given.',
+                    $suite->getName(),
+                    gettype($session)
+                ),
+                $suite->getName()
+            );
+        }
+
+        if (!in_array($session, $this->availableJavascriptSessions)) {
+            throw new SuiteConfigurationException(
+                sprintf(
+                    '`mink_javascript_session` setting of the "%s" suite is not a javascript session. %s given but expected one of %s.',
+                    $suite->getName(),
+                    $session,
+                    implode(', ', $this->availableJavascriptSessions)
+                ),
+                $suite->getName()
+            );
+        }
+
+        return $session;
+    }
+}