|
22 | 22 | use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage;
|
23 | 23 | use Symfony\Component\HttpKernel\DataCollector\RequestDataCollector;
|
24 | 24 | use Symfony\Component\HttpKernel\Event\FinishRequestEvent;
|
| 25 | +use Symfony\Component\HttpKernel\Event\GetResponseEvent; |
25 | 26 | use Symfony\Component\HttpKernel\Event\RequestEvent;
|
26 | 27 | use Symfony\Component\HttpKernel\Event\ResponseEvent;
|
27 | 28 | use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener;
|
28 | 29 | use Symfony\Component\HttpKernel\EventListener\SessionListener;
|
29 | 30 | use Symfony\Component\HttpKernel\Exception\UnexpectedSessionUsageException;
|
30 | 31 | use Symfony\Component\HttpKernel\HttpKernelInterface;
|
| 32 | +use Symfony\Component\HttpKernel\KernelInterface; |
31 | 33 |
|
32 | 34 | class SessionListenerTest extends TestCase
|
33 | 35 | {
|
@@ -182,6 +184,38 @@ public function testSurrogateMasterRequestIsPublic()
|
182 | 184 | $this->assertLessThanOrEqual((new \DateTime('now', new \DateTimeZone('UTC'))), (new \DateTime($response->headers->get('Expires'))));
|
183 | 185 | }
|
184 | 186 |
|
| 187 | + public function testGetSessionIsCalledOnce() |
| 188 | + { |
| 189 | + $session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock(); |
| 190 | + $sessionStorage = $this->getMockBuilder(NativeSessionStorage::class)->getMock(); |
| 191 | + $kernel = $this->getMockBuilder(KernelInterface::class)->getMock(); |
| 192 | + |
| 193 | + $sessionStorage->expects($this->once()) |
| 194 | + ->method('setOptions') |
| 195 | + ->with(['cookie_secure' => true]); |
| 196 | + |
| 197 | + $requestStack = new RequestStack(); |
| 198 | + $requestStack->push($masterRequest = new Request([], [], [], [], [], ['HTTPS' => 'on'])); |
| 199 | + |
| 200 | + $container = new Container(); |
| 201 | + $container->set('session_storage', $sessionStorage); |
| 202 | + $container->set('session', $session); |
| 203 | + $container->set('request_stack', $requestStack); |
| 204 | + |
| 205 | + $event = new GetResponseEvent($kernel, $masterRequest, HttpKernelInterface::MASTER_REQUEST); |
| 206 | + |
| 207 | + $listener = new SessionListener($container); |
| 208 | + $listener->onKernelRequest($event); |
| 209 | + |
| 210 | + $subRequest = $masterRequest->duplicate(); |
| 211 | + // at this point both master and subrequest have a closure to build the session |
| 212 | + |
| 213 | + $masterRequest->getSession(); |
| 214 | + |
| 215 | + // calling the factory on the subRequest should not trigger a second call to storage->sesOptions() |
| 216 | + $subRequest->getSession(); |
| 217 | + } |
| 218 | + |
185 | 219 | public function testSessionUsageExceptionIfStatelessAndSessionUsed()
|
186 | 220 | {
|
187 | 221 | $session = $this->getMockBuilder(Session::class)->disableOriginalConstructor()->getMock();
|
|
0 commit comments