Skip to content
This repository has been archived by the owner on Nov 9, 2017. It is now read-only.

Commit

Permalink
added mink class
Browse files Browse the repository at this point in the history
  • Loading branch information
everzet committed Mar 30, 2011
1 parent 6c586eb commit 2fd93cc
Show file tree
Hide file tree
Showing 2 changed files with 242 additions and 0 deletions.
145 changes: 145 additions & 0 deletions src/Behat/Mink/Mink.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,145 @@
<?php

namespace Behat\Mink;

use Behat\Mink\Driver\DriverInterface,
Behat\Mink\Selector\SelectorsHandler;

/*
* This file is part of the Behat\Mink.
* (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.
*/

/**
* Mink.
*
* @author Konstantin Kudryashov <ever.zet@gmail.com>
*/
class Mink
{
private $selectorsHandler;
private $defaultDriverName;
private $currentDriverName;
private $drivers = array();

/**
* Initializes mink.
*
* @param Behat\Mink\Selector\SelectorsHandler $selectorsHandler
*/
public function __construct(SelectorsHandler $selectorsHandler = null)
{
if (null === $selectorsHandler) {
$selectorsHandler = new SelectorsHandler();
}

$this->selectorsHandler = $selectorsHandler;
}

/**
* Stops all started drivers.
*/
public function __destruct()
{
foreach ($this->drivers as $driver) {
if ($driver->isStarted()) {
$driver->stop();
}
}
}

/**
* Registers new driver.
*
* @param string $name driver alias name
* @param Behat\Mink\Driver\DriverInterface $driver driver instance
* @param Boolean $isDefault should this driver be the default one?
*/
public function registerDriver($name, DriverInterface $driver, $isDefault = false)
{
$name = strtolower($name);

$this->drivers[$name] = $driver;

if ($isDefault) {
$this->defaultDriverName = $name;
}
}

/**
* Switches mink to specific driver.
*
* @param string $name driver alias name
*/
public function switchToDriver($name)
{
$name = strtolower($name);

if (!isset($this->drivers[$name])) {
throw new \InvalidArgumentException(sprintf('Driver "%s" is not registered.', $name));
}

if (null !== $this->currentDriverName && $name === $this->currentDriverName) {
return;
}

$this->currentDriverName = $name;
}

/**
* Switches mink to default driver.
*/
public function switchToDefaultDriver()
{
if (null === $this->defaultDriverName) {
throw new \RuntimeException('Default driver is not defined.');
}

$this->switchToDriver($this->defaultDriverName);
}

/**
* Resets driver (between tests for example).
*/
public function resetDriver()
{
$this->getDriver()->reset();
}

/**
* Returns mink session, initialized with current (or default) driver.
*
* @return Behat\Mink\Session
*/
public function getSession()
{
static $session;

if (null === $session || $session->getDriver() !== $this->getDriver()) {
$session = new Session($this->getDriver(), $this->selectorsHandler);
}

return $session;
}

/**
* Returns current (or default) driver.
*
* @return Behat\Mink\Driver\DriverInterface
*/
private function getDriver()
{
if (null === $this->currentDriverName) {
$this->switchToDefaultDriver();
}

if (!$this->drivers[$this->currentDriverName]->isStarted()) {
$this->drivers[$this->currentDriverName]->start();
}

return $this->drivers[$this->currentDriverName];
}
}
97 changes: 97 additions & 0 deletions tests/Behat/Mink/MinkTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,97 @@
<?php

namespace Tests\Behat\Mink;

use Behat\Mink\Mink;

class MinkTest extends \PHPUnit_Framework_TestCase
{
protected function setUp()
{
$this->mink = new Mink();
}

public function testSwitchToNotStartedDriver()
{
$driver = $this->getMockBuilder('Behat\Mink\Driver\DriverInterface')->getMock();
$driver
->expects($this->once())
->method('isStarted')
->will($this->returnValue(false));
$driver
->expects($this->once())
->method('start');
$driver
->expects($this->once())
->method('reset');

$this->mink->registerDriver('everzet', $driver);
$this->mink->switchToDriver('everzet');
$this->mink->resetDriver();

$this->setExpectedException('InvalidArgumentException');
$this->mink->switchToDriver('undefined');
}

public function testSwitchToStartedDriver()
{
$driver = $this->getMockBuilder('Behat\Mink\Driver\DriverInterface')->getMock();
$driver
->expects($this->once())
->method('isStarted')
->will($this->returnValue(true));
$driver
->expects($this->never())
->method('start');
$driver
->expects($this->once())
->method('reset');

$this->mink->registerDriver('everzet', $driver);
$this->mink->switchToDriver('everzet');
$this->mink->resetDriver();

$this->setExpectedException('RuntimeException');
$this->mink->switchToDefaultDriver();
}

public function testSwitchToDefaultDriver()
{
$driver = $this->getMockBuilder('Behat\Mink\Driver\DriverInterface')->getMock();
$driver
->expects($this->once())
->method('isStarted')
->will($this->returnValue(true));
$driver
->expects($this->once())
->method('reset');

$this->mink->registerDriver('everzet', $driver, true);
$this->mink->resetDriver();
}

public function testSessionCreation()
{
$driver1 = $this->getMockBuilder('Behat\Mink\Driver\DriverInterface')->getMock();
$driver1
->expects($this->exactly(2))
->method('isStarted')
->will($this->returnValue(true));
$driver2 = $this->getMockBuilder('Behat\Mink\Driver\DriverInterface')->getMock();
$driver2
->expects($this->exactly(4))
->method('isStarted')
->will($this->returnValue(true));

$this->mink->registerDriver('driver1', $driver1, true);
$this->mink->registerDriver('driver2', $driver2);

$session = $this->mink->getSession();
$this->assertInstanceOf('Behat\Mink\Session', $session);
$this->assertSame($session, $this->mink->getSession());

$this->mink->switchToDriver('driver2');
$this->assertNotSame($session, $this->mink->getSession());
$this->assertSame($this->mink->getSession(), $this->mink->getSession());
}
}

0 comments on commit 2fd93cc

Please sign in to comment.