diff --git a/code/TestSessionController.php b/code/TestSessionController.php index 83d02d0..d5209c7 100644 --- a/code/TestSessionController.php +++ b/code/TestSessionController.php @@ -12,7 +12,10 @@ class TestSessionController extends Controller { public function init() { parent::init(); - $canAccess = (Director::isDev() || Director::is_cli() || Permission::check("ADMIN")); + $canAccess = ( + !Director::isLive() + && (Director::isDev() || Director::is_cli() || Permission::check("ADMIN")) + ); if(!$canAccess) return Security::permissionFailure($this); } @@ -29,71 +32,66 @@ class TestSessionController extends Controller { * as an encrypted cookie. */ public function start() { - if(!Director::isLive()) { - if(SapphireTest::using_temp_db()) { - $endLink = Director::baseURL() . "dev/testsession/end"; - return "

You're in the middle of a test session;" - . " click here to end it.

"; - - } else if(!isset($_GET['fixture'])) { - $me = Director::baseURL() . "dev/testsession/start"; - return <<You're in the middle of a test session;" + . " click here to end it.

"; + + } else if(!isset($_GET['fixture'])) { + $me = Director::baseURL() . "dev/testsession/start"; + return << -

Enter a fixture file name to start a new test session. Don't forget to visit dev/testsession/end when - you're done!

-

Fixture file (leave blank to start with default set-up):

- -

+

Enter a fixture file name to start a new test session. Don't forget to visit dev/testsession/end when +you're done!

+

Fixture file (leave blank to start with default set-up):

+ +

HTML; - } else { - $fixtureFile = $_GET['fixture']; - - if($fixtureFile) { - // Validate fixture file - $realFile = realpath(BASE_PATH.'/'.$fixtureFile); - $baseDir = realpath(Director::baseFolder()); - if(!$realFile || !file_exists($realFile)) { - return "

Fixture file doesn't exist

"; - } else if(substr($realFile,0,strlen($baseDir)) != $baseDir) { - return "

Fixture file must be inside $baseDir

"; - } else if(substr($realFile,-4) != '.yml') { - return "

Fixture file must be a .yml file

"; - } else if(!preg_match('/^([^\/.][^\/]+)\/tests\//', $fixtureFile)) { - return "

Fixture file must be inside the tests subfolder of one of your modules.

"; - } - } - - $dbname = SapphireTest::create_temp_db(); - - DB::set_alternative_database_name($dbname); - - // Fixture - if($fixtureFile) { - $fixture = Injector::inst()->create('YamlFixture', $fixtureFile); - $fixture->saveIntoDatabase(); - - // If no fixture, then use defaults - } else { - $dataClasses = ClassInfo::subclassesFor('DataObject'); - array_shift($dataClasses); - foreach($dataClasses as $dataClass) singleton($dataClass)->requireDefaultRecords(); - } - - return "

Started testing session with fixture '$fixtureFile'. - Time to start testing; where would you like to start?

- "; - } - } else { - return "

startession can only be used on dev and test sites

"; + $fixtureFile = $_GET['fixture']; + + if($fixtureFile) { + // Validate fixture file + $realFile = realpath(BASE_PATH.'/'.$fixtureFile); + $baseDir = realpath(Director::baseFolder()); + if(!$realFile || !file_exists($realFile)) { + return "

Fixture file doesn't exist

"; + } else if(substr($realFile,0,strlen($baseDir)) != $baseDir) { + return "

Fixture file must be inside $baseDir

"; + } else if(substr($realFile,-4) != '.yml') { + return "

Fixture file must be a .yml file

"; + } else if(!preg_match('/^([^\/.][^\/]+)\/tests\//', $fixtureFile)) { + return "

Fixture file must be inside the tests subfolder of one of your modules.

"; + } + } + + $dbname = SapphireTest::create_temp_db(); + + DB::set_alternative_database_name($dbname); + + // Fixture + if($fixtureFile) { + $fixture = Injector::inst()->create('YamlFixture', $fixtureFile); + $fixture->saveIntoDatabase(); + + // If no fixture, then use defaults + } else { + $dataClasses = ClassInfo::subclassesFor('DataObject'); + array_shift($dataClasses); + foreach($dataClasses as $dataClass) singleton($dataClass)->requireDefaultRecords(); + } + + return "

Started testing session with fixture '$fixtureFile'. + Time to start testing; where would you like to start?

+ "; } } @@ -115,9 +113,6 @@ HTML; * as an encrypted cookie. */ public function setdb() { - if(Director::isLive()) { - return $this->httpError(403, "dev/testsession/setdb can only be used on dev and test sites"); - } if(!isset($_GET['database'])) { return $this->httpError(400, "dev/testsession/setdb must be used with a 'database' parameter"); } @@ -158,10 +153,11 @@ HTML; . " dev/testsession/start first?

"; } } - + public function end() { SapphireTest::kill_temp_db(); DB::set_alternative_database_name(null); + Session::clear('testsession'); return "

Test session ended.