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('/');
42 $request->cookies->set('foo', 'value');
44 $request->attributes->set('_locale', 'es');
45 $listener = new LocaleListener($this->requestStack, 'fr');
46 $event = $this->getEvent($request);
48 $listener->onKernelRequest($event);
49 $this->assertEquals('es', $request->getLocale());
52 public function testLocaleSetForRoutingContext()
54 // the request context is updated
55 $context = $this->getMockBuilder('Symfony\Component\Routing\RequestContext')->getMock();
56 $context->expects($this->once())->method('setParameter')->with('_locale', 'es');
58 $router = $this->getMockBuilder('Symfony\Component\Routing\Router')->setMethods(array('getContext'))->disableOriginalConstructor()->getMock();
59 $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
61 $request = Request::create('/');
63 $request->attributes->set('_locale', 'es');
64 $listener = new LocaleListener($this->requestStack, 'fr', $router);
65 $listener->onKernelRequest($this->getEvent($request));
68 public function testRouterResetWithParentRequestOnKernelFinishRequest()
70 // the request context is updated
71 $context = $this->getMockBuilder('Symfony\Component\Routing\RequestContext')->getMock();
72 $context->expects($this->once())->method('setParameter')->with('_locale', 'es');
74 $router = $this->getMockBuilder('Symfony\Component\Routing\Router')->setMethods(array('getContext'))->disableOriginalConstructor()->getMock();
75 $router->expects($this->once())->method('getContext')->will($this->returnValue($context));
77 $parentRequest = Request::create('/');
78 $parentRequest->setLocale('es');
80 $this->requestStack->expects($this->once())->method('getParentRequest')->will($this->returnValue($parentRequest));
82 $event = $this->getMockBuilder('Symfony\Component\HttpKernel\Event\FinishRequestEvent')->disableOriginalConstructor()->getMock();
84 $listener = new LocaleListener($this->requestStack, 'fr', $router);
85 $listener->onKernelFinishRequest($event);
88 public function testRequestLocaleIsNotOverridden()
90 $request = Request::create('/');
91 $request->setLocale('de');
92 $listener = new LocaleListener($this->requestStack, 'fr');
93 $event = $this->getEvent($request);
95 $listener->onKernelRequest($event);
96 $this->assertEquals('de', $request->getLocale());
99 private function getEvent(Request $request)
101 return new GetResponseEvent($this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock(), $request, HttpKernelInterface::MASTER_REQUEST);