Source of file DetectLocaleMiddlewareTest.php
Size: 9,404 Bytes - Last Modified: 2021-12-23T10:53:31+00:00
/var/www/docs.ssmods.com/process/src/tests/php/Middleware/DetectLocaleMiddlewareTest.php
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253 | <?php namespace TractorCow\Fluent\Tests\Middleware; use PHPUnit_Framework_MockObject_MockObject; use SilverStripe\Control\Controller; use SilverStripe\Control\Cookie; use SilverStripe\Control\HTTPRequest; use SilverStripe\Control\Session; use SilverStripe\Core\Config\Config; use SilverStripe\Dev\SapphireTest; use TractorCow\Fluent\Extension\FluentDirectorExtension; use TractorCow\Fluent\Middleware\DetectLocaleMiddleware; use TractorCow\Fluent\Model\Domain; use TractorCow\Fluent\Model\Locale; use TractorCow\Fluent\State\FluentState; class DetectLocaleMiddlewareTest extends SapphireTest { protected static $fixture_file = 'DetectLocaleMiddlewareTest.yml'; /** * @var Stub\DetectLocaleMiddlewareSpy */ protected $middleware; /** * @var string */ protected $globalDefaultLocale; protected function setUp() { parent::setUp(); $this->middleware = new Stub\DetectLocaleMiddlewareSpy; Config::modify()->set(FluentDirectorExtension::class, 'query_param', 'l'); // Enable localedetection FluentDirectorExtension::config()->set('detect_locale', true); // Clear cache Locale::clearCached(); Domain::clearCached(); // Get defaults from fixture // Note: es_ES $this->globalDefaultLocale = Locale::get()->find('IsGlobalDefault', 1)->Locale; } public function testGetPersistKey() { FluentState::singleton()->withState(function (FluentState $newState) { $newState->setIsFrontend(true); $this->assertSame('FluentLocale', $this->middleware->getPersistKey()); $newState->setIsFrontend(false); $this->assertSame('FluentLocale_CMS', $this->middleware->getPersistKey()); }); } /** * @dataProvider localePriorityProvider * @param string $url * @param array $routeParams * @param array $queryParams * @param bool $persisted * @param string $header * @param string $expected */ public function testGetLocalePriority($url, $routeParams, $queryParams, $persisted, $header, $expected) { $request = new HTTPRequest('GET', $url, $queryParams); $request->setRouteParams($routeParams); $request->setSession(Controller::curr()->getRequest()->getSession()); $this->middleware->setPersistLocale($request, null); if ($persisted) { $this->middleware->setPersistLocale($request, $persisted); } if ($header) { $request->addHeader('Accept-Language', $header); } $this->assertSame($expected, $this->middleware->getLocale($request)); } /** * @return array[] List of tests with arguments: $url, $routeParams, $queryParams, $persisted, $header, $expected */ public function localePriorityProvider() { return [/* // First priority: controller routing params ['/nz/foo', ['l' => 'en_NZ'], ['l' => 'en_AU'], 'fr_FR', 'es-US', 'en_NZ'], // Second priority: request params ['/foo', [], ['l' => 'en_AU'], 'fr_FR', 'es-US', 'en_AU'], // Third priority: persisted locale ['/foo', [], [], 'fr_FR', 'es-US', 'fr_FR'], // Default to the default locale when not on the homepage ['/foo', [], [], null, 'es-US', 'es_ES'],*/ // Home page only - fourth priority is request header ['/', [], [], null, 'es-US', 'es_US'], ]; } public function testLocaleIsAlwaysPersistedEvenIfNotSetByTheMiddleware() { FluentState::singleton()->withState(function (FluentState $newState) { $request = new HTTPRequest('GET', '/'); $newState->setIsFrontend(true); $newState->setLocale('en_AU'); /** @var DetectLocaleMiddleware|PHPUnit_Framework_MockObject_MockObject $middleware */ $middleware = $this->getMockBuilder(DetectLocaleMiddleware::class) ->setMethods(['getLocale', 'setPersistLocale']) ->getMock(); $middleware->expects($this->never())->method('getLocale'); $middleware->expects($this->once())->method('setPersistLocale')->with($request, 'en_AU'); $middleware->process($request, function () { // no-op }); }); } public function testLocaleIsOnlyPersistedWhenSet() { $request = new HTTPRequest('GET', '/'); FluentState::singleton() ->setLocale(null) ->setIsFrontend(true); /** @var DetectLocaleMiddleware|PHPUnit_Framework_MockObject_MockObject $middleware */ $middleware = $this->getMockBuilder(DetectLocaleMiddleware::class) ->setMethods(['getLocale', 'setPersistLocale']) ->getMock(); $middleware->expects($this->once())->method('getLocale')->willReturn(null); $middleware->expects($this->never())->method('setPersistLocale'); $middleware->process($request, function () { // no-op }); } public function testLocaleIsPersistedFromCookie() { $newLocale = 'fr_FR'; $middleware = $this->middleware; $key = $middleware->getPersistKey(); $request = new HTTPRequest('GET', '/'); $sessionData = []; $sessionMock = $this->getMockBuilder(Session::class) ->setMethods(['set', 'getAll']) ->setConstructorArgs([$sessionData]) ->getMock(); $sessionMock->expects($this->once())->method('set')->with($key, $newLocale); $sessionMock->expects($this->once())->method('getAll')->willReturn([true]); $request->setSession($sessionMock); Cookie::set($key, $newLocale); $middleware->process($request, function () { // no-op }); // TODO PHPUnit's headers_sent() always returns true, so we can't check for cookie values. // PHPUnit has process isolation for this purpose, but we can't use it because autoloading breaks. // $this->assertEquals($newLocale, Cookie::get($key)); } public function testLocaleIsPersistedFromSession() { $newLocale = 'fr_FR'; $middleware = $this->middleware; $key = $middleware->getPersistKey(); $request = new HTTPRequest('GET', '/'); $sessionData = [$key => $newLocale]; $sessionMock = $this->getMockBuilder(Session::class) ->setMethods(['set', 'isStarted']) ->setConstructorArgs([$sessionData]) ->getMock(); $sessionMock->expects($this->any())->method('isStarted')->willReturn(true); $sessionMock->expects($this->once())->method('set')->with($key, $newLocale); $request->setSession($sessionMock); $middleware->process($request, function () { // no-op }); // TODO PHPUnit's headers_sent() always returns true, so we can't check for cookie values. // PHPUnit has process isolation for this purpose, but we can't use it because autoloading breaks. // $this->assertEquals($newLocale, Cookie::get($key)); } public function testLocaleIsNotPersistedFromSessionWhenSessionIsNotStarted() { $newLocale = 'fr_FR'; $middleware = $this->middleware; $key = $middleware->getPersistKey(); $request = new HTTPRequest('GET', '/'); $sessionData = [$key => $newLocale]; $sessionMock = $this->getMockBuilder(Session::class) ->setMethods(['set', 'isStarted']) ->setConstructorArgs([$sessionData]) ->getMock(); $sessionMock->expects($this->any())->method('isStarted')->willReturn(false); $sessionMock->expects($this->never())->method('set'); $request->setSession($sessionMock); $middleware->process($request, function () { // no-op }); // TODO PHPUnit's headers_sent() always returns true, so we can't check for cookie values. // PHPUnit has process isolation for this purpose, but we can't use it because autoloading breaks. // $this->assertEquals($this->globalDefaultLocale, Cookie::get($key)); } public function testLocaleIsNotPersistedFromCookieWhenPersistCookieFalse() { // TODO PHPUnit's headers_sent() always returns true, so we can't check for cookie values. // PHPUnit has process isolation for this purpose, but we can't use it because autoloading breaks. $this->markTestIncomplete(); // $newLocale = 'fr_FR'; // $middleware = $this->middleware; // $middleware->config()->update('persist_cookie', false); // $key = $this->middleware->getPersistKey(); // $request = new HTTPRequest('GET', '/'); // // $sessionData = [$key => $newLocale]; // $sessionMock = $this->getMockBuilder(Session::class) // ->setMethods(['set']) // ->setConstructorArgs([$sessionData]) // ->getMock(); // $sessionMock->expects($this->once())->method('set')->with($key, $this->globalDefaultLocale); // $request->setSession($sessionMock); // // $middleware->process($request, function () { // // no-op // }); // // $this->assertEquals($this->globalDefaultLocale, Cookie::get($key)); } } |