Chris@0: Chris@0: * Chris@0: * For the full copyright and license information, please view the LICENSE Chris@0: * file that was distributed with this source code. Chris@0: */ Chris@0: Chris@0: namespace Behat\Mink; Chris@0: Chris@0: /** Chris@0: * Mink sessions manager. Chris@0: * Chris@0: * @author Konstantin Kudryashov Chris@0: */ Chris@0: class Mink Chris@0: { Chris@0: private $defaultSessionName; Chris@0: Chris@0: /** Chris@0: * Sessions. Chris@0: * Chris@0: * @var Session[] Chris@0: */ Chris@0: private $sessions = array(); Chris@0: Chris@0: /** Chris@0: * Initializes manager. Chris@0: * Chris@0: * @param Session[] $sessions Chris@0: */ Chris@0: public function __construct(array $sessions = array()) Chris@0: { Chris@0: foreach ($sessions as $name => $session) { Chris@0: $this->registerSession($name, $session); Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Stops all started sessions. Chris@0: */ Chris@0: public function __destruct() Chris@0: { Chris@0: $this->stopSessions(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Registers new session. Chris@0: * Chris@0: * @param string $name Chris@0: * @param Session $session Chris@0: */ Chris@0: public function registerSession($name, Session $session) Chris@0: { Chris@0: $name = strtolower($name); Chris@0: Chris@0: $this->sessions[$name] = $session; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Checks whether session with specified name is registered. Chris@0: * Chris@0: * @param string $name Chris@0: * Chris@0: * @return Boolean Chris@0: */ Chris@0: public function hasSession($name) Chris@0: { Chris@0: return isset($this->sessions[strtolower($name)]); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Sets default session name to use. Chris@0: * Chris@0: * @param string $name name of the registered session Chris@0: * Chris@0: * @throws \InvalidArgumentException Chris@0: */ Chris@0: public function setDefaultSessionName($name) Chris@0: { Chris@0: $name = strtolower($name); Chris@0: Chris@0: if (!isset($this->sessions[$name])) { Chris@0: throw new \InvalidArgumentException(sprintf('Session "%s" is not registered.', $name)); Chris@0: } Chris@0: Chris@0: $this->defaultSessionName = $name; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns default session name or null if none. Chris@0: * Chris@0: * @return null|string Chris@0: */ Chris@0: public function getDefaultSessionName() Chris@0: { Chris@0: return $this->defaultSessionName; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns registered session by it's name or default one. Chris@0: * Chris@0: * @param string $name session name Chris@0: * Chris@0: * @return Session Chris@0: * Chris@0: * @throws \InvalidArgumentException If the named session is not registered Chris@0: */ Chris@0: public function getSession($name = null) Chris@0: { Chris@0: return $this->locateSession($name); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Checks whether a named session (or the default session) has already been started. Chris@0: * Chris@0: * @param string $name session name - if null then the default session will be checked Chris@0: * Chris@0: * @return bool whether the session has been started Chris@0: * Chris@0: * @throws \InvalidArgumentException If the named session is not registered Chris@0: */ Chris@0: public function isSessionStarted($name = null) Chris@0: { Chris@0: $session = $this->locateSession($name); Chris@0: Chris@0: return $session->isStarted(); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns session asserter. Chris@0: * Chris@0: * @param Session|string $session session object or name Chris@0: * Chris@0: * @return WebAssert Chris@0: */ Chris@0: public function assertSession($session = null) Chris@0: { Chris@0: if (!($session instanceof Session)) { Chris@0: $session = $this->getSession($session); Chris@0: } Chris@0: Chris@0: return new WebAssert($session); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Resets all started sessions. Chris@0: */ Chris@0: public function resetSessions() Chris@0: { Chris@0: foreach ($this->sessions as $session) { Chris@0: if ($session->isStarted()) { Chris@0: $session->reset(); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Restarts all started sessions. Chris@0: */ Chris@0: public function restartSessions() Chris@0: { Chris@0: foreach ($this->sessions as $session) { Chris@0: if ($session->isStarted()) { Chris@0: $session->restart(); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Stops all started sessions. Chris@0: */ Chris@0: public function stopSessions() Chris@0: { Chris@0: foreach ($this->sessions as $session) { Chris@0: if ($session->isStarted()) { Chris@0: $session->stop(); Chris@0: } Chris@0: } Chris@0: } Chris@0: Chris@0: /** Chris@0: * Returns the named or default session without starting it. Chris@0: * Chris@0: * @param string $name session name Chris@0: * Chris@0: * @return Session Chris@0: * Chris@0: * @throws \InvalidArgumentException If the named session is not registered Chris@0: */ Chris@0: protected function locateSession($name = null) Chris@0: { Chris@0: $name = strtolower($name) ?: $this->defaultSessionName; Chris@0: Chris@0: if (null === $name) { Chris@0: throw new \InvalidArgumentException('Specify session name to get'); Chris@0: } Chris@0: Chris@0: if (!isset($this->sessions[$name])) { Chris@0: throw new \InvalidArgumentException(sprintf('Session "%s" is not registered.', $name)); Chris@0: } Chris@0: Chris@0: $session = $this->sessions[$name]; Chris@0: Chris@0: return $session; Chris@0: } Chris@0: }