From b6a8e458882cd8f3d0a7a2e36ffbafc76ea04ffd Mon Sep 17 00:00:00 2001 From: Damian Mooyman Date: Thu, 3 Aug 2017 15:52:31 +1200 Subject: [PATCH] BUG Ensure mocked controller has request assigned Fixes #7237 --- src/Security/Security.php | 1 + tests/php/Security/SecurityTest.php | 24 ++++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/src/Security/Security.php b/src/Security/Security.php index 548432c2c..f7c0683f2 100644 --- a/src/Security/Security.php +++ b/src/Security/Security.php @@ -563,6 +563,7 @@ class Security extends Controller implements TemplateGlobalProvider $controller = ModelAsController::controller_for($holderPage); $controller->doInit(); + $controller->setRequest($this->getRequest()); return $controller; } diff --git a/tests/php/Security/SecurityTest.php b/tests/php/Security/SecurityTest.php index d2c89f729..652381677 100644 --- a/tests/php/Security/SecurityTest.php +++ b/tests/php/Security/SecurityTest.php @@ -2,9 +2,13 @@ namespace SilverStripe\Security\Tests; +use Page; +use PageController; use SilverStripe\Control\Controller; use SilverStripe\Control\Director; +use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\HTTPResponse; +use SilverStripe\Control\Session; use SilverStripe\Core\Config\Config; use SilverStripe\Core\Convert; use SilverStripe\Dev\FunctionalTest; @@ -704,6 +708,26 @@ class SecurityTest extends FunctionalTest $this->assertNull($robotsHeader); } + public function testGetResponseController() + { + if (!class_exists(Page::class)) { + $this->markTestSkipped("This test requires CMS module"); + } + + $request = new HTTPRequest('GET', '/'); + $request->setSession(new Session([])); + $security = new Security(); + $security->setRequest($request); + $reflection = new \ReflectionClass($security); + $method = $reflection->getMethod('getResponseController'); + $method->setAccessible(true); + $result = $method->invoke($security, 'Page'); + + // Ensure page shares the same controller as security + $this->assertInstanceOf(PageController::class, $result); + $this->assertEquals($request, $result->getRequest()); + } + /** * Execute a log-in form using Director::test(). * Helper method for the tests above