Skip to content

Commit

Permalink
Allow setting create_temp_database to false to stop temp db creation
Browse files Browse the repository at this point in the history
TestSessionEnvironment by default will create a temporary database for
use with behat tests, but this may not be required.

e.g. in your behat.yml:

```
default:
...

  extensions:
    ...
    SilverStripe\BehatExtension\Extension:
      create_temp_database: false
```
  • Loading branch information
Sean Harvey committed Oct 8, 2014
1 parent 5af1c3d commit 9c3319a
Show file tree
Hide file tree
Showing 4 changed files with 80 additions and 52 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,13 @@
*/
class SilverStripeAwareInitializer implements InitializerInterface
{

private $databaseName;

/**
* @var bool
*/
protected $createTempDatabase;

protected $databaseName;

/**
* @var Array
Expand Down Expand Up @@ -57,40 +62,36 @@ class SilverStripeAwareInitializer implements InitializerInterface
*/
protected $testSessionEnvironment;

/**
* Initializes initializer.
*/
public function __construct($frameworkPath)
{
$this->bootstrap($frameworkPath);
protected $frameworkPath;

file_put_contents('php://stdout', "Creating test session environment" . PHP_EOL);
public function initTestSession() {
$this->bootstrap($this->frameworkPath);

$testEnv = \Injector::inst()->get('TestSessionEnvironment');
$testEnv->startTestSession(array(
'createDatabase' => true
));
if($this->createTempDatabase) {
file_put_contents('php://stdout', "Creating test session environment" . PHP_EOL);

$state = $testEnv->getState();
$testEnv = \Injector::inst()->get('TestSessionEnvironment');
$testEnv->startTestSession();

$this->databaseName = $state->database;
$this->testSessionEnvironment = $testEnv;
$state = $testEnv->getState();
$this->databaseName = $state->database;
$this->testSessionEnvironment = $testEnv;

file_put_contents('php://stdout', "Temp Database: $this->databaseName" . PHP_EOL . PHP_EOL);
file_put_contents('php://stdout', "Temp Database: $this->databaseName" . PHP_EOL . PHP_EOL);

register_shutdown_function(array($this, '__destruct'));
}
register_shutdown_function(array($this, 'killTestSession'));
}
}

public function __destruct()
{
file_put_contents('php://stdout', "Killing test session environment...");
public function killTestSession() {
file_put_contents('php://stdout', "Killing test session environment...");

if($this->testSessionEnvironment) {
$this->testSessionEnvironment->endTestSession();
}
if($this->testSessionEnvironment) {
$this->testSessionEnvironment->endTestSession();
}

file_put_contents('php://stdout', " done!" . PHP_EOL);
}
file_put_contents('php://stdout', " done!" . PHP_EOL);
}

/**
* Checks if initializer supports provided context.
Expand All @@ -111,13 +112,26 @@ public function supports(ContextInterface $context)
*/
public function initialize(ContextInterface $context)
{
$context->setCreateTempDatabase($this->createTempDatabase);
$context->setDatabase($this->databaseName);
$context->setAjaxSteps($this->ajaxSteps);
$context->setAjaxTimeout($this->ajaxTimeout);
$context->setScreenshotPath($this->screenshotPath);
$context->setRegionMap($this->regionMap);
$context->setAdminUrl($this->adminUrl);
$context->setLoginUrl($this->loginUrl);

$this->initTestSession();
}

public function setFrameworkPath($path)
{
$this->frameworkPath = $path;
}

public function setCreateTempDatabase($bool)
{
$this->createTempDatabase = $bool;
}

public function setAjaxSteps($ajaxSteps)
Expand Down Expand Up @@ -193,4 +207,4 @@ protected function bootstrap($frameworkPath)
// Remove the error handler so that PHPUnit can add its own
restore_error_handler();
}
}
}
51 changes: 30 additions & 21 deletions src/SilverStripe/BehatExtension/Context/SilverStripeContext.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,9 @@
*/
class SilverStripeContext extends MinkContext implements SilverStripeAwareContextInterface
{

protected $createTempDatabase;

protected $databaseName;

/**
Expand Down Expand Up @@ -76,6 +79,10 @@ public function __construct(array $parameters) {
$this->testSessionEnvironment = new \TestSessionEnvironment();
}

public function setCreateTempDatabase($bool) {
$this->createTempDatabase = $bool;
}

public function setDatabase($databaseName) {
$this->databaseName = $databaseName;
}
Expand Down Expand Up @@ -180,29 +187,31 @@ public function getRegionObj($region) {
* @BeforeScenario
*/
public function before(ScenarioEvent $event) {
if (!isset($this->databaseName)) {
throw new \LogicException(
'Context\'s $databaseName has to be set when implementing SilverStripeAwareContextInterface.'
);
}

$state = $this->getTestSessionState();
$this->testSessionEnvironment->startTestSession($state);
if($this->createTempDatabase) {
if (!isset($this->databaseName)) {
throw new \LogicException(
'Context\'s $databaseName has to be set when implementing SilverStripeAwareContextInterface.'
);
}

// Optionally import database
if(!empty($state['importDatabasePath'])) {
$this->testSessionEnvironment->importDatabase(
$state['importDatabasePath'],
!empty($state['requireDefaultRecords']) ? $state['requireDefaultRecords'] : false
);
} else if(!empty($state['requireDefaultRecords']) && $state['requireDefaultRecords']) {
$this->testSessionEnvironment->requireDefaultRecords();
}
$state = $this->getTestSessionState();
$this->testSessionEnvironment->startTestSession($state);

// Optionally import database
if(!empty($state['importDatabasePath'])) {
$this->testSessionEnvironment->importDatabase(
$state['importDatabasePath'],
!empty($state['requireDefaultRecords']) ? $state['requireDefaultRecords'] : false
);
} else if(!empty($state['requireDefaultRecords']) && $state['requireDefaultRecords']) {
$this->testSessionEnvironment->requireDefaultRecords();
}

// Fixtures
$fixtureFile = (!empty($params['fixture'])) ? $params['fixture'] : null;
if($fixtureFile) {
$this->testSessionEnvironment->loadFixtureIntoDb($fixtureFile);
// Fixtures
$fixtureFile = (!empty($params['fixture'])) ? $params['fixture'] : null;
if($fixtureFile) {
$this->testSessionEnvironment->loadFixtureIntoDb($fixtureFile);
}
}

if($screenSize = getenv('BEHAT_SCREEN_SIZE')) {
Expand Down
4 changes: 4 additions & 0 deletions src/SilverStripe/BehatExtension/Extension.php
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,7 @@ public function load(array $config, ContainerBuilder $container)
$container->setParameter('behat.silverstripe_extension.admin_url', $config['admin_url']);
$container->setParameter('behat.silverstripe_extension.login_url', $config['login_url']);
$container->setParameter('behat.silverstripe_extension.screenshot_path', $config['screenshot_path']);
$container->setParameter('behat.silverstripe_extension.create_temp_database', $config['create_temp_database']);
$container->setParameter('behat.silverstripe_extension.ajax_timeout', $config['ajax_timeout']);
if (isset($config['ajax_steps'])) {
$container->setParameter('behat.silverstripe_extension.ajax_steps', $config['ajax_steps']);
Expand Down Expand Up @@ -82,6 +83,9 @@ function getConfig(ArrayNodeDefinition $builder)
{
$builder->
children()->
scalarNode('create_temp_database')->
defaultValue(true)->
end()->
scalarNode('framework_path')->
defaultValue('framework')->
end()->
Expand Down
7 changes: 4 additions & 3 deletions src/SilverStripe/BehatExtension/services/silverstripe.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,15 +10,16 @@ parameters:
behat.silverstripe_extension.admin_url: ~
behat.silverstripe_extension.login_url: ~
behat.silverstripe_extension.screenshot_path: ~
behat.silverstripe_extension.create_temp_database: true
behat.silverstripe_extension.module:
behat.silverstripe_extension.region_map: ~
behat.silverstripe_extension.context.path_suffix: tests/behat/features/
services:
behat.silverstripe_extension.context.initializer:
class: %behat.silverstripe_extension.context.initializer.class%
arguments:
- %behat.silverstripe_extension.framework_path%
calls:
- [setFrameworkPath, [%behat.silverstripe_extension.framework_path%]]
- [setCreateTempDatabase, [%behat.silverstripe_extension.create_temp_database%]]
- [setAjaxSteps, [%behat.silverstripe_extension.ajax_steps%]]
- [setAjaxTimeout, [%behat.silverstripe_extension.ajax_timeout%]]
- [setAdminUrl, [%behat.silverstripe_extension.admin_url%]]
Expand All @@ -33,4 +34,4 @@ services:
- %behat.silverstripe_extension.context.namespace_suffix%
- %behat.context.class%
tags:
- { name: behat.context.class_guesser, priority: 10 }
- { name: behat.context.class_guesser, priority: 10 }

0 comments on commit 9c3319a

Please sign in to comment.