--- /dev/null
+<?php
+
+/*
+ * This file is part of the Symfony package.
+ *
+ * (c) Fabien Potencier <fabien@symfony.com>
+ *
+ * For the full copyright and license information, please view the LICENSE
+ * file that was distributed with this source code.
+ */
+
+namespace Symfony\Component\HttpKernel\Tests\EventListener;
+
+use PHPUnit\Framework\TestCase;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
+use Symfony\Component\HttpFoundation\Session\SessionInterface;
+
+/**
+ * SessionListenerTest.
+ *
+ * Tests SessionListener.
+ *
+ * @author Bulat Shakirzyanov <mallluhuct@gmail.com>
+ */
+class TestSessionListenerTest extends TestCase
+{
+ /**
+ * @var TestSessionListener
+ */
+ private $listener;
+
+ /**
+ * @var SessionInterface
+ */
+ private $session;
+
+ protected function setUp()
+ {
+ $this->listener = $this->getMockForAbstractClass('Symfony\Component\HttpKernel\EventListener\TestSessionListener');
+ $this->session = $this->getSession();
+ }
+
+ public function testShouldSaveMasterRequestSession()
+ {
+ $this->sessionHasBeenStarted();
+ $this->sessionMustBeSaved();
+
+ $this->filterResponse(new Request());
+ }
+
+ public function testShouldNotSaveSubRequestSession()
+ {
+ $this->sessionMustNotBeSaved();
+
+ $this->filterResponse(new Request(), HttpKernelInterface::SUB_REQUEST);
+ }
+
+ public function testDoesNotDeleteCookieIfUsingSessionLifetime()
+ {
+ $this->sessionHasBeenStarted();
+
+ $params = session_get_cookie_params();
+ session_set_cookie_params(0, $params['path'], $params['domain'], $params['secure'], $params['httponly']);
+
+ $response = $this->filterResponse(new Request(), HttpKernelInterface::MASTER_REQUEST);
+ $cookies = $response->headers->getCookies();
+
+ $this->assertEquals(0, reset($cookies)->getExpiresTime());
+ }
+
+ public function testUnstartedSessionIsNotSave()
+ {
+ $this->sessionHasNotBeenStarted();
+ $this->sessionMustNotBeSaved();
+
+ $this->filterResponse(new Request());
+ }
+
+ private function filterResponse(Request $request, $type = HttpKernelInterface::MASTER_REQUEST)
+ {
+ $request->setSession($this->session);
+ $response = new Response();
+ $kernel = $this->getMockBuilder('Symfony\Component\HttpKernel\HttpKernelInterface')->getMock();
+ $event = new FilterResponseEvent($kernel, $request, $type, $response);
+
+ $this->listener->onKernelResponse($event);
+
+ $this->assertSame($response, $event->getResponse());
+
+ return $response;
+ }
+
+ private function sessionMustNotBeSaved()
+ {
+ $this->session->expects($this->never())
+ ->method('save');
+ }
+
+ private function sessionMustBeSaved()
+ {
+ $this->session->expects($this->once())
+ ->method('save');
+ }
+
+ private function sessionHasBeenStarted()
+ {
+ $this->session->expects($this->once())
+ ->method('isStarted')
+ ->will($this->returnValue(true));
+ }
+
+ private function sessionHasNotBeenStarted()
+ {
+ $this->session->expects($this->once())
+ ->method('isStarted')
+ ->will($this->returnValue(false));
+ }
+
+ private function getSession()
+ {
+ $mock = $this->getMockBuilder('Symfony\Component\HttpFoundation\Session\Session')
+ ->disableOriginalConstructor()
+ ->getMock();
+
+ // set return value for getName()
+ $mock->expects($this->any())->method('getName')->will($this->returnValue('MOCKSESSID'));
+
+ return $mock;
+ }
+}