diff --git a/_config/processors.yml b/_config/processors.yml index d52ef3c..eac4898 100644 --- a/_config/processors.yml +++ b/_config/processors.yml @@ -1,8 +1,12 @@ --- Name: testsessionprocessors +After: + - requestprocessors +Before: + - coresecurity --- SilverStripe\Core\Injector\Injector: - SilverStripe\Control\RequestProcessor: + SilverStripe\Control\Director: properties: - filters: - - '%$SilverStripe\TestSession\TestSessionRequestFilter' + Middlewares: + TestSessionHTTPMiddleware: %$SilverStripe\TestSession\TestSessionHTTPMiddleware diff --git a/composer.json b/composer.json index 9627fb2..9594136 100644 --- a/composer.json +++ b/composer.json @@ -20,7 +20,7 @@ }, "extra": { "branch-alias": { - "dev-master": "2.x-dev" + "dev-master": "2.0.x-dev" } }, "scripts": { diff --git a/src/TestSessionController.php b/src/TestSessionController.php index 1f862f5..8cfe67e 100644 --- a/src/TestSessionController.php +++ b/src/TestSessionController.php @@ -2,11 +2,12 @@ namespace SilverStripe\TestSession; +use FilesystemIterator; +use LogicException; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; use SilverStripe\Control\HTTPRequest; use SilverStripe\Core\Injector\Injector; -use SilverStripe\Dev\SapphireTest; use SilverStripe\Forms\CheckboxField; use SilverStripe\Forms\DatetimeField; use SilverStripe\Forms\DropdownField; @@ -24,8 +25,6 @@ use SilverStripe\Security\RandomGenerator; use SilverStripe\Security\Security; use SilverStripe\View\ArrayData; use SilverStripe\View\Requirements; -use LogicException; -use FilesystemIterator; /** * Requires PHP's mycrypt extension in order to set the database name as an encrypted cookie. diff --git a/src/TestSessionEnvironment.php b/src/TestSessionEnvironment.php index 19f945c..39b3324 100644 --- a/src/TestSessionEnvironment.php +++ b/src/TestSessionEnvironment.php @@ -85,7 +85,7 @@ class TestSessionEnvironment public function init(HTTPRequest $request) { if (!$this->id) { - $request->getSession()->init(); + $request->getSession()->init($request); // $_SESSION != Session::get() in some execution paths, suspect Controller->pushCurrent() // as part of the issue, easiest resolution is to use session directly for now $this->id = $request->getSession()->get('TestSessionId'); @@ -98,9 +98,9 @@ class TestSessionEnvironment public function getFilePath() { if ($this->id) { - $path = Director::getAbsFile(sprintf($this->config()->test_state_id_file, $this->id)); + $path = Director::getAbsFile(sprintf($this->config()->get('test_state_id_file'), $this->id)); } else { - $path = Director::getAbsFile($this->config()->test_state_file); + $path = Director::getAbsFile($this->config()->get('test_state_file')); } return $path; diff --git a/src/TestSessionRequestFilter.php b/src/TestSessionHTTPMiddleware.php similarity index 74% rename from src/TestSessionRequestFilter.php rename to src/TestSessionHTTPMiddleware.php index cda508c..c75bc38 100644 --- a/src/TestSessionRequestFilter.php +++ b/src/TestSessionHTTPMiddleware.php @@ -6,8 +6,7 @@ use SilverStripe\Control\Director; use SilverStripe\Control\Email\Email; use SilverStripe\Control\Email\Mailer; use SilverStripe\Control\HTTPRequest; -use SilverStripe\Control\HTTPResponse; -use SilverStripe\Control\RequestFilter; +use SilverStripe\Control\Middleware\HTTPMiddleware; use SilverStripe\Core\Injector\Injector; use SilverStripe\ORM\DB; use SilverStripe\ORM\FieldType\DBDatetime; @@ -15,7 +14,7 @@ use SilverStripe\ORM\FieldType\DBDatetime; /** * Sets state previously initialized through {@link TestSessionController}. */ -class TestSessionRequestFilter implements RequestFilter +class TestSessionHTTPMiddleware implements HTTPMiddleware { /** * @var TestSessionEnvironment @@ -27,14 +26,35 @@ class TestSessionRequestFilter implements RequestFilter $this->testSessionEnvironment = TestSessionEnvironment::singleton(); } - public function preRequest(HTTPRequest $request) + public function process(HTTPRequest $request, callable $delegate) { - $isRunningTests = $this->testSessionEnvironment->isRunningTests(); + // Init environment $this->testSessionEnvironment->init($request); + + // If not running tests, just pass through + $isRunningTests = $this->testSessionEnvironment->isRunningTests(); if (!$isRunningTests) { - return; + return $delegate($request); } + // Load test state + $this->loadTestState($request); + + // Call with safe teardown + try { + return $delegate($request); + } finally { + $this->restoreTestState($request); + } + } + + /** + * Load test state from environment into "real" environment + * + * @param HTTPRequest $request + */ + protected function loadTestState(HTTPRequest $request) + { $testState = $this->testSessionEnvironment->getState(); // Date and time @@ -67,12 +87,8 @@ class TestSessionRequestFilter implements RequestFilter } } - public function postRequest(HTTPRequest $request, HTTPResponse $response) + protected function restoreTestState(HTTPRequest $request) { - if (!$this->testSessionEnvironment->isRunningTests()) { - return; - } - // Store PHP session $state = $this->testSessionEnvironment->getState(); $state->session = $request->getSession()->getAll();