From 2e1a5081fabf709720c4893587ed03724935ccf7 Mon Sep 17 00:00:00 2001 From: Ingo Schommer Date: Wed, 19 Dec 2012 16:05:37 +0100 Subject: [PATCH] API Remove dev/tests/startsession etc, use new "testsession" module Removed commands: startsession, endsession, sessionloadyml, setdb, emptydb. See https://github.com/silverstripe-labs/silverstripe-testsession --- dev/DevelopmentAdmin.php | 13 --- dev/TestRunner.php | 206 --------------------------------------- model/DB.php | 2 +- 3 files changed, 1 insertion(+), 220 deletions(-) diff --git a/dev/DevelopmentAdmin.php b/dev/DevelopmentAdmin.php index ac76a27fa..dd458bed3 100644 --- a/dev/DevelopmentAdmin.php +++ b/dev/DevelopmentAdmin.php @@ -79,9 +79,6 @@ class DevelopmentAdmin extends Controller { "build" => "Build/rebuild this environment. Call this whenever you have updated your project sources", "tests" => "See a list of unit tests to run", "tests/all" => "Run all tests", - "tests/startsession" => "Start a test session in your browser" - . " (gives you a temporary database with default content)", - "tests/endsession" => "Ends a test session", "jstests" => "See a list of JavaScript tests to run", "jstests/all" => "Run all JavaScript tests", "tasks" => "See a list of build tasks to run" @@ -191,16 +188,6 @@ Config::inst()->update('Security', 'token', '$token'); TXT; } - public function reset() { - $link = BASE_URL.'/dev/tests/startsession'; - - return "

The dev/reset feature has been removed. If you are trying to test your site " . - "with a clean datababase, we recommend that you use " . - "dev/test/startsession ". - "instead.

"; - - } - public function errors() { $this->redirect("Debug_"); } diff --git a/dev/TestRunner.php b/dev/TestRunner.php index f09fb9714..cf9395d5e 100644 --- a/dev/TestRunner.php +++ b/dev/TestRunner.php @@ -29,12 +29,7 @@ class TestRunner extends Controller { 'coverage/module/$ModuleName' => 'coverageModule', 'coverage/$TestCase!' => 'coverageOnly', 'coverage' => 'coverageAll', - 'sessionloadyml' => 'sessionloadyml', - 'startsession' => 'startsession', - 'endsession' => 'endsession', - 'setdb' => 'setdb', 'cleanupdb' => 'cleanupdb', - 'emptydb' => 'emptydb', 'module/$ModuleName' => 'module', 'all' => 'all', 'build' => 'build', @@ -48,9 +43,6 @@ class TestRunner extends Controller { 'coverageAll', 'coverageModule', 'coverageOnly', - 'startsession', - 'endsession', - 'setdb', 'cleanupdb', 'module', 'all', @@ -341,204 +333,6 @@ class TestRunner extends Controller { if(Director::is_cli() && ($results->failureCount() + $results->errorCount()) > 0) exit(2); } - /** - * Start a test session. - * Usage: visit dev/tests/startsession?fixture=(fixturefile). A test database will be constructed, and your - * browser session will be amended to use this database. This can only be run on dev and test sites. - * - * See {@link setdb()} for an alternative approach which just sets a database - * name, and is used for more advanced use cases like interacting with test databases - * directly during functional tests. - * - * Requires PHP's mycrypt extension in order to set the database name - * as an encrypted cookie. - */ - public function startsession() { - if(!Director::isLive()) { - if(SapphireTest::using_temp_db()) { - $endLink = Director::baseURL() . "dev/tests/endsession"; - return "

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

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

Enter a fixture file name to start a new test session. Don't forget to visit dev/tests/endsession 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

"; - } - } - - /** - * Set an alternative database name in the current browser session as a cookie. - * Useful for functional testing libraries like behat to create a "clean slate". - * Does not actually create the database, that's usually handled - * by {@link SapphireTest::create_temp_db()}. - * - * The database names are limited to a specific naming convention as a security measure: - * The "tmpdb" prefix and a random sequence of seven digits. - * This avoids the user gaining access to other production databases - * available on the same connection. - * - * See {@link startsession()} for a different approach which actually creates - * the DB and loads a fixture file instead. - * - * Requires PHP's mycrypt extension in order to set the database name - * as an encrypted cookie. - */ - public function setdb() { - if(Director::isLive()) { - return $this->httpError(403, "dev/tests/setdb can only be used on dev and test sites"); - } - if(!isset($_GET['database'])) { - return $this->httpError(400, "dev/tests/setdb must be used with a 'database' parameter"); - } - - $name = $_GET['database']; - $prefix = defined('SS_DATABASE_PREFIX') ? SS_DATABASE_PREFIX : 'ss_'; - $pattern = strtolower(sprintf('#^%stmpdb\d{7}#', $prefix)); - if($name && !preg_match($pattern, $name)) { - return $this->httpError(400, "Invalid database name format"); - } - - DB::set_alternative_database_name($name); - - if($name) { - return "

Set database session to '$name'.

"; - } else { - return "

Unset database session.

"; - } - - } - - public function emptydb() { - if(SapphireTest::using_temp_db()) { - SapphireTest::empty_temp_db(); - - if(isset($_GET['fixture']) && ($fixtureFile = $_GET['fixture'])) { - $fixture = Injector::inst()->create('YamlFixture', $fixtureFile); - $fixture->saveIntoDatabase(); - return "

Re-test the test database with fixture '$fixtureFile'. Time to start testing; where would" - . " you like to start?

"; - - } else { - return "

Re-test the test database. Time to start testing; where would you like to start?

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

dev/tests/emptydb can only be used with a temporary database. Perhaps you should use" - . " dev/tests/startsession first?

"; - } - } - - public function endsession() { - SapphireTest::kill_temp_db(); - DB::set_alternative_database_name(null); - - return "

Test session ended.

- "; - } - - public function sessionloadyml() { - // Load incremental YAML fixtures - // TODO: We will probably have to filter out the admin member here, - // as it is supplied by Bare.yml - if(Director::isLive()) { - return "

sessionloadyml can only be used on dev and test sites

"; - } - if (!SapphireTest::using_temp_db()) { - return "

Please load /dev/tests/startsession first

"; - } - - $fixtureFile = isset($_GET['fixture']) ? $_GET['fixture'] : null; - if (empty($fixtureFile)) { - $me = Director::baseURL() . "/dev/tests/sessionloadyml"; - return << -

Enter a fixture file name to load a new YAML fixture into the session.

-

Fixture file

- -

- -HTML; - } - // 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.

"; - } - - // Fixture - $fixture = Injector::inst()->create('YamlFixture', $fixtureFile); - $fixture->saveIntoDatabase(); - - return "

Loaded fixture '$fixtureFile' into session

"; - } - public function setUp() { // The first DB test will sort out the DB, we don't have to SSViewer::flush_template_cache(); diff --git a/model/DB.php b/model/DB.php index d9c1a3dac..b4eb45ac6 100644 --- a/model/DB.php +++ b/model/DB.php @@ -153,7 +153,7 @@ class DB { * rest of the options, see the specific class. */ public static function connect($databaseConfig) { - // This is used by TestRunner::startsession() to test up a test session using an alt + // This is used by the "testsession" module to test up a test session using an alternative name if($name = self::get_alternative_database_name()) { $databaseConfig['database'] = $name; }