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\DependencyInjection\Container;
16 use Symfony\Component\HttpFoundation\Request;
17 use Symfony\Component\HttpFoundation\Response;
18 use Symfony\Component\HttpFoundation\Session\Session;
19 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
20 use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
21 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
22 use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;
23 use Symfony\Component\HttpKernel\EventListener\SessionListener;
24 use Symfony\Component\HttpKernel\HttpKernelInterface;
26 class SessionListenerTest extends TestCase
28 public function testOnlyTriggeredOnMasterRequest()
30 $listener = $this->getMockForAbstractClass(AbstractSessionListener::class);
31 $event = $this->getMockBuilder(GetResponseEvent::class)->disableOriginalConstructor()->getMock();
32 $event->expects($this->once())->method('isMasterRequest')->willReturn(false);
33 $event->expects($this->never())->method('getRequest');
36 $listener->onKernelRequest($event);
39 public function testSessionIsSet()
41 $session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();
43 $container = new Container();
44 $container->set('session', $session);
46 $request = new Request();
47 $listener = new SessionListener($container);
49 $event = $this->getMockBuilder(GetResponseEvent::class)->disableOriginalConstructor()->getMock();
50 $event->expects($this->once())->method('isMasterRequest')->willReturn(true);
51 $event->expects($this->once())->method('getRequest')->willReturn($request);
53 $listener->onKernelRequest($event);
55 $this->assertTrue($request->hasSession());
56 $this->assertSame($session, $request->getSession());
59 public function testResponseIsPrivate()
61 $session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();
62 $session->expects($this->exactly(2))->method('getUsageIndex')->will($this->onConsecutiveCalls(0, 1));
64 $container = new Container();
65 $container->set('session', $session);
67 $listener = new SessionListener($container);
68 $kernel = $this->getMockBuilder(HttpKernelInterface::class)->disableOriginalConstructor()->getMock();
70 $request = new Request();
71 $response = new Response();
72 $listener->onKernelRequest(new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST));
73 $listener->onKernelResponse(new FilterResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST, $response));
75 $this->assertTrue($response->headers->hasCacheControlDirective('private'));
76 $this->assertTrue($response->headers->hasCacheControlDirective('must-revalidate'));
77 $this->assertSame('0', $response->headers->getCacheControlDirective('max-age'));
80 public function testSurrogateMasterRequestIsPublic()
82 $session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();
83 $session->expects($this->exactly(4))->method('getUsageIndex')->will($this->onConsecutiveCalls(0, 1, 1, 1));
85 $container = new Container();
86 $container->set('session', $session);
88 $listener = new SessionListener($container);
89 $kernel = $this->getMockBuilder(HttpKernelInterface::class)->disableOriginalConstructor()->getMock();
91 $request = new Request();
92 $response = new Response();
93 $response->setCache(array('public' => true, 'max_age' => '30'));
94 $listener->onKernelRequest(new GetResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST));
95 $this->assertTrue($request->hasSession());
97 $subRequest = clone $request;
98 $this->assertSame($request->getSession(), $subRequest->getSession());
99 $listener->onKernelRequest(new GetResponseEvent($kernel, $subRequest, HttpKernelInterface::MASTER_REQUEST));
100 $listener->onKernelResponse(new FilterResponseEvent($kernel, $subRequest, HttpKernelInterface::MASTER_REQUEST, $response));
101 $listener->onFinishRequest(new FinishRequestEvent($kernel, $subRequest, HttpKernelInterface::MASTER_REQUEST));
103 $this->assertFalse($response->headers->hasCacheControlDirective('private'));
104 $this->assertFalse($response->headers->hasCacheControlDirective('must-revalidate'));
105 $this->assertSame('30', $response->headers->getCacheControlDirective('max-age'));
107 $listener->onKernelResponse(new FilterResponseEvent($kernel, $request, HttpKernelInterface::MASTER_REQUEST, $response));
109 $this->assertTrue($response->headers->hasCacheControlDirective('private'));
110 $this->assertTrue($response->headers->hasCacheControlDirective('must-revalidate'));
111 $this->assertSame('0', $response->headers->getCacheControlDirective('max-age'));