. */ namespace App\Tests\EventSubscriber; use App\EventSubscriber\RedirectToHttpsSubscriber; use PHPUnit\Framework\TestCase; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpKernel\Event\RequestEvent; use Symfony\Component\HttpKernel\HttpKernelInterface; use Symfony\Component\Security\Http\HttpUtils; final class RedirectToHttpsSubscriberTest extends TestCase { private function makeEvent(string $url, bool $isMainRequest = true): RequestEvent { $kernel = $this->createMock(HttpKernelInterface::class); $request = Request::create($url); return new RequestEvent($kernel, $request, $isMainRequest ? HttpKernelInterface::MAIN_REQUEST : HttpKernelInterface::SUB_REQUEST); } public function testHttpRequestIsRedirectedToHttpsWhenEnabled(): void { $subscriber = new RedirectToHttpsSubscriber(true, new HttpUtils()); $event = $this->makeEvent('http://example.com/some/path'); $subscriber->onKernelRequest($event); $this->assertTrue($event->hasResponse()); $response = $event->getResponse(); $this->assertStringStartsWith('https://', $response->getTargetUrl()); } public function testHttpsRequestIsNotRedirectedWhenEnabled(): void { $subscriber = new RedirectToHttpsSubscriber(true, new HttpUtils()); $event = $this->makeEvent('https://example.com/some/path'); $subscriber->onKernelRequest($event); $this->assertFalse($event->hasResponse()); } public function testHttpRequestIsNotRedirectedWhenDisabled(): void { $subscriber = new RedirectToHttpsSubscriber(false, new HttpUtils()); $event = $this->makeEvent('http://example.com/some/path'); $subscriber->onKernelRequest($event); $this->assertFalse($event->hasResponse()); } public function testSubRequestIsNotRedirected(): void { $subscriber = new RedirectToHttpsSubscriber(true, new HttpUtils()); $event = $this->makeEvent('http://example.com/', false); $subscriber->onKernelRequest($event); $this->assertFalse($event->hasResponse()); } public function testRedirectUrlPreservesPath(): void { $subscriber = new RedirectToHttpsSubscriber(true, new HttpUtils()); $event = $this->makeEvent('http://example.com/admin/parts?q=test'); $subscriber->onKernelRequest($event); $this->assertTrue($event->hasResponse()); $this->assertStringContainsString('/admin/parts', $event->getResponse()->getTargetUrl()); $this->assertStringContainsString('q=test', $event->getResponse()->getTargetUrl()); } public function testSubscriberListensToKernelRequestEvent(): void { $events = RedirectToHttpsSubscriber::getSubscribedEvents(); $this->assertArrayHasKey('kernel.request', $events); } }