4 * This file is part of the Symfony package.
6 * (c) Fabien Potencier <fabien@symfony.com>
8 * For the full copyright and license information, please view the LICENSE
9 * file that was distributed with this source code.
12 namespace Symfony\Component\HttpKernel\Tests\EventListener;
14 use PHPUnit\Framework\TestCase;
15 use Symfony\Component\HttpFoundation\Request;
16 use Symfony\Component\HttpKernel\EventListener\LocaleListener;
17 use Symfony\Component\HttpKernel\HttpKernelInterface;
18 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
20 class LocaleListenerTest extends TestCase
22 private $requestStack;
24 protected function setUp()
26 $this->requestStack = $this->getMockBuilder('Symfony\Component\HttpFoundation\RequestStack')->disableOriginalConstructor()->getMock();
29 public function testDefaultLocaleWithoutSession()
31 $listener = new LocaleListener($this->requestStack, 'fr');
32 $event = $this->getEvent($request = Request::create('/'));
34 $listener->onKernelRequest($event);
35 $this->assertEquals('fr', $request->getLocale());
38 public function testLocaleFromRequestAttribute()
40 $request = Request::create('/');
41 $request->cookies->set(session_name(), 'value');
43 $request->attributes->set('_locale', 'es');
44 $listener = new LocaleListener($this->requestStack, 'fr');
45 $event = $this->getEvent($request);
47 $listener->onKernelRequest($event);
48 $this->assertEquals('es', $request->getLocale());
51 public function testLocaleSetForRoutingContext()
53 // the request context is updated
54 $context = $this->getMockBuilder('Symfony\Component\Routing\RequestContext')->getMock();
55 $context->expects($this->once())->method('setParameter')->with('_locale', 'es');
57 $router = $this->getMockBuilder('Symfony\Component\Routing\Router')->setMethods(array('getContext'))->disableOriginalConstructor()->getMock();
58 $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
60 $request = Request::create('/');
62 $request->attributes->set('_locale', 'es');
63 $listener = new LocaleListener($this->requestStack, 'fr', $router);
64 $listener->onKernelRequest($this->getEvent($request));
67 public function testRouterResetWithParentRequestOnKernelFinishRequest()
69 // the request context is updated
70 $context = $this->getMockBuilder('Symfony\Component\Routing\RequestContext')->getMock();
71 $context->expects($this->once())->method('setParameter')->with('_locale', 'es');
73 $router = $this->getMockBuilder('Symfony\Component\Routing\Router')->setMethods(array('getContext'))->disableOriginalConstructor()->getMock();
74 $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
76 $parentRequest = Request::create('/');
77 $parentRequest->setLocale('es');
79 $this->requestStack->expects($this->once())->method('getParentRequest')->will($this->returnValue($parentRequest));
81 $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\FinishRequestEvent')->disableOriginalConstructor()->getMock();
83 $listener = new LocaleListener($this->requestStack, 'fr', $router);
84 $listener->onKernelFinishRequest($event);
87 public function testRequestLocaleIsNotOverridden()
89 $request = Request::create('/');
90 $request->setLocale('de');
91 $listener = new LocaleListener($this->requestStack, 'fr');
92 $event = $this->getEvent($request);
94 $listener->onKernelRequest($event);
95 $this->assertEquals('de', $request->getLocale());
98 private function getEvent(Request $request)
100 return new GetResponseEvent($this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock(), $request, HttpKernelInterface::MASTER_REQUEST);