diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index c97998b454..c94a4b7b0e 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -2140,11 +2140,6 @@ parameters: count: 1 path: src/bundle/Core/EventListener/SessionInitByPostListener.php - - - message: "#^Method Ibexa\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListener\\:\\:onSiteAccessMatch\\(\\) has no return type specified\\.$#" - count: 1 - path: src/bundle/Core/EventListener/SessionSetDynamicNameListener.php - - message: "#^Method Ibexa\\\\Bundle\\\\Core\\\\EventListener\\\\SiteAccessListener\\:\\:generateViewParametersArray\\(\\) return type has no value type specified in iterable type array\\.$#" count: 1 @@ -24425,46 +24420,6 @@ parameters: count: 2 path: tests/bundle/Core/EventListener/RoutingListenerTest.php - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionInitByPostListenerTest\\:\\:testGetSubscribedEvents\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionInitByPostListenerTest\\:\\:testOnSiteAccessMatchNewSessionName\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionInitByPostListenerTest\\:\\:testOnSiteAccessMatchNoSessionService\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionInitByPostListenerTest\\:\\:testOnSiteAccessMatchRequestNoSessionName\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionInitByPostListenerTest\\:\\:testOnSiteAccessMatchSubRequest\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:onSiteAccessMatchProvider\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testGetSubscribedEvents\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testOnSiteAccessMatch\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testOnSiteAccessMatch\\(\\) has parameter \\$configuredSessionStorageOptions with no type specified\\.$#" count: 1 @@ -24475,36 +24430,6 @@ parameters: count: 1 path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testOnSiteAccessMatchNoConfiguredSessionName\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testOnSiteAccessMatchNoSession\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testOnSiteAccessMatchNonNativeSessionStorage\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListenerTest\\:\\:testOnSiteAccessMatchSubRequest\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Parameter \\#1 \\$configResolver of class Ibexa\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListener constructor expects Ibexa\\\\Contracts\\\\Core\\\\SiteAccess\\\\ConfigResolverInterface, PHPUnit\\\\Framework\\\\MockObject\\\\MockObject given\\.$#" - count: 6 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - - - message: "#^Parameter \\#2 \\$sessionStorageFactory of class Ibexa\\\\Bundle\\\\Core\\\\EventListener\\\\SessionSetDynamicNameListener constructor expects Symfony\\\\Component\\\\HttpFoundation\\\\Session\\\\Storage\\\\SessionStorageFactoryInterface, PHPUnit\\\\Framework\\\\MockObject\\\\MockObject given\\.$#" - count: 5 - path: tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php - - message: "#^Method Ibexa\\\\Tests\\\\Bundle\\\\Core\\\\EventListener\\\\SiteAccessListenerTest\\:\\:siteAccessMatchProvider\\(\\) has no return type specified\\.$#" count: 1 @@ -44685,16 +44610,6 @@ parameters: count: 1 path: tests/lib/Limitation/SubtreeLimitationTypeTest.php - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Component\\\\Serializer\\\\SimplifiedRequestNormalizerTest\\:\\:testNormalize\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Component/Serializer/SimplifiedRequestNormalizerTest.php - - - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Component\\\\Serializer\\\\SimplifiedRequestNormalizerTest\\:\\:testSupportsNormalization\\(\\) has no return type specified\\.$#" - count: 1 - path: tests/lib/MVC/Symfony/Component/Serializer/SimplifiedRequestNormalizerTest.php - - message: "#^Method Ibexa\\\\Tests\\\\Core\\\\MVC\\\\Symfony\\\\Component\\\\Serializer\\\\Stubs\\\\CompoundStub\\:\\:__construct\\(\\) has parameter \\$subMatchers with no value type specified in iterable type array\\.$#" count: 1 diff --git a/src/bundle/Core/DependencyInjection/Configuration/Parser/Common.php b/src/bundle/Core/DependencyInjection/Configuration/Parser/Common.php index 6eeaa1d927..1fd613b6f5 100644 --- a/src/bundle/Core/DependencyInjection/Configuration/Parser/Common.php +++ b/src/bundle/Core/DependencyInjection/Configuration/Parser/Common.php @@ -89,7 +89,7 @@ public function addSemanticConfig(NodeBuilder $nodeBuilder) ->children() ->scalarNode('name') ->info('The session name. If you want a session name per siteaccess, use "{siteaccess_hash}" token. Will override default session name from framework.session.name') - ->example('eZSESSID{siteaccess_hash}') + ->example('IBX_SESSION_ID{siteaccess_hash}') ->end() ->scalarNode('cookie_lifetime')->end() ->scalarNode('cookie_path')->end() diff --git a/src/bundle/Core/EventListener/SessionSetDynamicNameListener.php b/src/bundle/Core/EventListener/SessionSetDynamicNameListener.php index 156596c995..5b5d6b7134 100644 --- a/src/bundle/Core/EventListener/SessionSetDynamicNameListener.php +++ b/src/bundle/Core/EventListener/SessionSetDynamicNameListener.php @@ -4,6 +4,7 @@ * @copyright Copyright (C) Ibexa AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ +declare(strict_types=1); namespace Ibexa\Bundle\Core\EventListener; @@ -21,27 +22,16 @@ * * Allows to set a dynamic session name based on the siteaccess name. */ -class SessionSetDynamicNameListener implements EventSubscriberInterface +final readonly class SessionSetDynamicNameListener implements EventSubscriberInterface { - public const MARKER = '{siteaccess_hash}'; + public const string MARKER = '{siteaccess_hash}'; - /** - * Prefix for session name. - */ - public const SESSION_NAME_PREFIX = 'eZSESSID'; - - /** @var \Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface */ - private $configResolver; - - /** @var \Symfony\Component\HttpFoundation\Session\Storage\SessionStorageFactoryInterface */ - private $sessionStorageFactory; + public const string SESSION_NAME_PREFIX = 'IBX_SESSION_ID'; public function __construct( - ConfigResolverInterface $configResolver, - SessionStorageFactoryInterface $sessionStorageFactory + private ConfigResolverInterface $configResolver, + private SessionStorageFactoryInterface $sessionStorageFactory ) { - $this->configResolver = $configResolver; - $this->sessionStorageFactory = $sessionStorageFactory; } public static function getSubscribedEvents(): array @@ -51,7 +41,7 @@ public static function getSubscribedEvents(): array ]; } - public function onSiteAccessMatch(PostSiteAccessMatchEvent $event) + public function onSiteAccessMatch(PostSiteAccessMatchEvent $event): void { $request = $event->getRequest(); $session = $request->hasSession() ? $request->getSession() : null; @@ -69,26 +59,20 @@ public function onSiteAccessMatch(PostSiteAccessMatchEvent $event) } $sessionOptions = (array)$this->configResolver->getParameter('session'); - $sessionName = isset($sessionOptions['name']) ? $sessionOptions['name'] : $session->getName(); + $sessionName = $sessionOptions['name'] ?? $session->getName(); $sessionOptions['name'] = $this->getSessionName($sessionName, $event->getSiteAccess()); $sessionStorage->setOptions($sessionOptions); } - /** - * @param string $sessionName - * @param \Ibexa\Core\MVC\Symfony\SiteAccess $siteAccess - * - * @return string - */ - private function getSessionName($sessionName, SiteAccess $siteAccess) + private function getSessionName(string $sessionName, SiteAccess $siteAccess): string { // Add session prefix if needed. - if (strpos($sessionName, static::SESSION_NAME_PREFIX) !== 0) { - $sessionName = static::SESSION_NAME_PREFIX . '_' . $sessionName; + if (!str_starts_with($sessionName, self::SESSION_NAME_PREFIX)) { + $sessionName = self::SESSION_NAME_PREFIX . '_' . $sessionName; } // Check if uniqueness marker is present. If so, session name will be unique for current siteaccess. - if (strpos($sessionName, self::MARKER) !== false) { + if (str_contains($sessionName, self::MARKER)) { $sessionName = str_replace(self::MARKER, md5($siteAccess->name), $sessionName); } diff --git a/src/bundle/Core/Resources/config/default_settings.yml b/src/bundle/Core/Resources/config/default_settings.yml index 7f34d7fe3f..1e74eb3334 100644 --- a/src/bundle/Core/Resources/config/default_settings.yml +++ b/src/bundle/Core/Resources/config/default_settings.yml @@ -83,7 +83,7 @@ parameters: # Common settings ibexa.repositories: {} ibexa.site_access.config.default.repository: ~ - ibexa.session_name.default: "eZSESSID{siteaccess_hash}" + ibexa.session_name.default: "IBX_SESSION_ID{siteaccess_hash}" ibexa.site_access.config.default.session_name: '%ibexa.session_name.default%' # Using "{siteaccess_hash}" in session name makes it unique per siteaccess ibexa.site_access.config.default.session: { name: '%ibexa.session_name.default%' } # Session options that will override options from framework ibexa.site_access.config.default.url_alias_router: true # Use UrlAliasRouter by default diff --git a/tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php b/tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php index 9173ab69d1..0a377947dc 100644 --- a/tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php +++ b/tests/bundle/Core/EventListener/SessionInitByPostListenerTest.php @@ -4,6 +4,7 @@ * @copyright Copyright (C) Ibexa AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ +declare(strict_types=1); namespace Ibexa\Tests\Bundle\Core\EventListener; @@ -18,10 +19,9 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpKernel\HttpKernelInterface; -class SessionInitByPostListenerTest extends TestCase +final class SessionInitByPostListenerTest extends TestCase { - /** @var \Ibexa\Bundle\Core\EventListener\SessionInitByPostListener */ - private $listener; + private SessionInitByPostListener $listener; protected function setUp(): void { @@ -29,7 +29,7 @@ protected function setUp(): void $this->listener = new SessionInitByPostListener(); } - public function testGetSubscribedEvents() + public function testGetSubscribedEvents(): void { self::assertSame( [ @@ -39,7 +39,7 @@ public function testGetSubscribedEvents() ); } - public function testOnSiteAccessMatchNoSessionService() + public function testOnSiteAccessMatchNoSessionService(): void { $request = new Request(); $request->setSession(new Session(new MockArraySessionStorage())); @@ -49,7 +49,7 @@ public function testOnSiteAccessMatchNoSessionService() self::assertNull($listener->onSiteAccessMatch($event)); } - public function testOnSiteAccessMatchSubRequest() + public function testOnSiteAccessMatchSubRequest(): void { $session = $this->createMock(SessionInterface::class); $session @@ -63,9 +63,9 @@ public function testOnSiteAccessMatchSubRequest() $this->listener->onSiteAccessMatch($event); } - public function testOnSiteAccessMatchRequestNoSessionName() + public function testOnSiteAccessMatchRequestNoSessionName(): void { - $sessionName = 'eZSESSID'; + $sessionName = 'IBX_SESSION_ID'; $session = $this->createMock(SessionInterface::class); $session @@ -90,9 +90,9 @@ public function testOnSiteAccessMatchRequestNoSessionName() $this->listener->onSiteAccessMatch($event); } - public function testOnSiteAccessMatchNewSessionName() + public function testOnSiteAccessMatchNewSessionName(): void { - $sessionName = 'eZSESSID'; + $sessionName = 'IBX_SESSION_ID'; $sessionId = 'foobar123'; $session = $this->createMock(SessionInterface::class); diff --git a/tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php b/tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php index 1be3172bea..618a167d3c 100644 --- a/tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php +++ b/tests/bundle/Core/EventListener/SessionSetDynamicNameListenerTest.php @@ -4,6 +4,7 @@ * @copyright Copyright (C) Ibexa AS. All rights reserved. * @license For full copyright and license information view LICENSE file distributed with this source code. */ +declare(strict_types=1); namespace Ibexa\Tests\Bundle\Core\EventListener; @@ -18,37 +19,43 @@ use Symfony\Component\HttpFoundation\Session\Storage\MockArraySessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\NativeSessionStorage; use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageFactoryInterface; +use Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface; use Symfony\Component\HttpKernel\HttpKernelInterface; -class SessionSetDynamicNameListenerTest extends TestCase +final class SessionSetDynamicNameListenerTest extends TestCase { - /** @var \PHPUnit\Framework\MockObject\MockObject */ - private $configResolver; + /** @var \Ibexa\Contracts\Core\SiteAccess\ConfigResolverInterface&\PHPUnit\Framework\MockObject\MockObject */ + private ConfigResolverInterface $configResolver; - /** @var \PHPUnit\Framework\MockObject\MockObject */ - private $sessionStorageFactory; + /** @var \Symfony\Component\HttpFoundation\Session\Storage\SessionStorageFactoryInterface&\PHPUnit\Framework\MockObject\MockObject */ + private SessionStorageFactoryInterface $sessionStorageFactory; - /** @var \PHPUnit\Framework\MockObject\MockObject */ - private $sessionStorage; + /** @var \Symfony\Component\HttpFoundation\Session\Storage\SessionStorageInterface&\PHPUnit\Framework\MockObject\MockObject */ + private SessionStorageInterface $sessionStorage; protected function setUp(): void { parent::setUp(); + $this->configResolver = $this->getMockBuilder(ConfigResolverInterface::class) ->disableOriginalConstructor() ->getMock(); + $this->sessionStorage = $this->getMockBuilder(NativeSessionStorage::class) ->disableOriginalConstructor() ->getMock(); + $this->sessionStorageFactory = $this->getMockBuilder(SessionStorageFactoryInterface::class) ->getMock(); + $this->sessionStorageFactory->method('createStorage') ->willReturn($this->sessionStorage); } - public function testGetSubscribedEvents() + public function testGetSubscribedEvents(): void { $listener = new SessionSetDynamicNameListener($this->configResolver, $this->sessionStorageFactory); + self::assertSame( [ MVCEvents::SITEACCESS => ['onSiteAccessMatch', 250], @@ -57,18 +64,19 @@ public function testGetSubscribedEvents() ); } - public function testOnSiteAccessMatchNoSession() + public function testOnSiteAccessMatchNoSession(): void { $request = new Request(); $this->sessionStorage ->expects(self::never()) ->method('setOptions'); + $listener = new SessionSetDynamicNameListener($this->configResolver, $this->sessionStorageFactory); $listener->onSiteAccessMatch(new PostSiteAccessMatchEvent(new SiteAccess('test'), $request, HttpKernelInterface::MAIN_REQUEST)); } - public function testOnSiteAccessMatchSubRequest() + public function testOnSiteAccessMatchSubRequest(): void { $this->sessionStorage ->expects(self::never()) @@ -77,7 +85,7 @@ public function testOnSiteAccessMatchSubRequest() $listener->onSiteAccessMatch(new PostSiteAccessMatchEvent(new SiteAccess('test'), new Request(), HttpKernelInterface::SUB_REQUEST)); } - public function testOnSiteAccessMatchNonNativeSessionStorage() + public function testOnSiteAccessMatchNonNativeSessionStorage(): void { $this->configResolver ->expects(self::never()) @@ -92,7 +100,7 @@ public function testOnSiteAccessMatchNonNativeSessionStorage() /** * @dataProvider onSiteAccessMatchProvider */ - public function testOnSiteAccessMatch(SiteAccess $siteAccess, $configuredSessionStorageOptions, array $expectedSessionStorageOptions) + public function testOnSiteAccessMatch(SiteAccess $siteAccess, $configuredSessionStorageOptions, array $expectedSessionStorageOptions): void { $request = new Request(); $request->setSession(new Session(new MockArraySessionStorage())); @@ -111,14 +119,17 @@ public function testOnSiteAccessMatch(SiteAccess $siteAccess, $configuredSession $listener->onSiteAccessMatch(new PostSiteAccessMatchEvent($siteAccess, $request, HttpKernelInterface::MAIN_REQUEST)); } - public function onSiteAccessMatchProvider() + /** + * @return array{array{\Ibexa\Core\MVC\Symfony\SiteAccess, array, array}} + */ + public function onSiteAccessMatchProvider(): array { return [ - [new SiteAccess('foo'), ['name' => 'eZSESSID'], ['name' => 'eZSESSID']], - [new SiteAccess('foo'), ['name' => 'eZSESSID{siteaccess_hash}'], ['name' => 'eZSESSID' . md5('foo')]], - [new SiteAccess('foo'), ['name' => 'this_is_a_session_name'], ['name' => 'eZSESSID_this_is_a_session_name']], - [new SiteAccess('foo'), ['name' => 'something{siteaccess_hash}'], ['name' => 'eZSESSID_something' . md5('foo')]], - [new SiteAccess('bar_baz'), ['name' => '{siteaccess_hash}something'], ['name' => 'eZSESSID_' . md5('bar_baz') . 'something']], + [new SiteAccess('foo'), ['name' => 'IBX_SESSION_ID'], ['name' => 'IBX_SESSION_ID']], + [new SiteAccess('foo'), ['name' => 'IBX_SESSION_ID{siteaccess_hash}'], ['name' => 'IBX_SESSION_ID' . md5('foo')]], + [new SiteAccess('foo'), ['name' => 'this_is_a_session_name'], ['name' => 'IBX_SESSION_ID_this_is_a_session_name']], + [new SiteAccess('foo'), ['name' => 'something{siteaccess_hash}'], ['name' => 'IBX_SESSION_ID_something' . md5('foo')]], + [new SiteAccess('bar_baz'), ['name' => '{siteaccess_hash}something'], ['name' => 'IBX_SESSION_ID_' . md5('bar_baz') . 'something']], [ new SiteAccess('foo'), [ @@ -130,7 +141,7 @@ public function onSiteAccessMatchProvider() 'cookie_httponly' => true, ], [ - 'name' => 'eZSESSID_this_is_a_session_name', + 'name' => 'IBX_SESSION_ID_this_is_a_session_name', 'cookie_path' => '/foo', 'cookie_domain' => 'foo.com', 'cookie_lifetime' => 86400, @@ -141,14 +152,14 @@ public function onSiteAccessMatchProvider() ]; } - public function testOnSiteAccessMatchNoConfiguredSessionName() + public function testOnSiteAccessMatchNoConfiguredSessionName(): void { $request = new Request(); $request->setSession(new Session(new MockArraySessionStorage('some_default_name'))); $configuredSessionStorageOptions = ['cookie_path' => '/bar']; $sessionName = 'some_default_name'; - $sessionOptions = $configuredSessionStorageOptions + ['name' => "eZSESSID_$sessionName"]; + $sessionOptions = $configuredSessionStorageOptions + ['name' => "IBX_SESSION_ID_$sessionName"]; $this->sessionStorage ->expects(self::once()) diff --git a/tests/lib/MVC/Symfony/Component/Serializer/SimplifiedRequestNormalizerTest.php b/tests/lib/MVC/Symfony/Component/Serializer/SimplifiedRequestNormalizerTest.php index da1d9a3022..4e8491f9b0 100644 --- a/tests/lib/MVC/Symfony/Component/Serializer/SimplifiedRequestNormalizerTest.php +++ b/tests/lib/MVC/Symfony/Component/Serializer/SimplifiedRequestNormalizerTest.php @@ -14,7 +14,7 @@ final class SimplifiedRequestNormalizerTest extends TestCase { - public function testNormalize() + public function testNormalize(): void { $request = new SimplifiedRequest([ 'scheme' => 'http', @@ -27,7 +27,7 @@ public function testNormalize() 'Accept-Encoding' => 'gzip, deflate, br', 'Accept-Language' => 'pl-PL,pl;q=0.9,en-US;q=0.8,en;q=0.7', 'User-Agent' => 'Mozilla/5.0', - 'Cookie' => 'eZSESSID21232f297a57a5a743894a0e4a801fc3=mgbs2p6lv936hb5hmdd2cvq6bq', + 'Cookie' => 'IBX_SESSION_ID21232f297a57a5a743894a0e4a801fc3=mgbs2p6lv936hb5hmdd2cvq6bq', 'Connection' => 'keep-alive', ], 'languages' => ['pl-PL', 'en-US'], @@ -46,7 +46,7 @@ public function testNormalize() ], $normalizer->normalize($request)); } - public function testSupportsNormalization() + public function testSupportsNormalization(): void { $normalizer = new SimplifiedRequestNormalizer();