feat: domain-based theme-detection

This commit is contained in:
Björn Fromme
2026-03-16 12:02:59 +01:00
parent e24403949c
commit 11ab98b3d8
9 changed files with 189 additions and 38 deletions
@@ -0,0 +1,119 @@
<?php
declare(strict_types=1);
namespace App\Tests\EventListener;
use App\EventListener\DomainThemeListener;
use PHPUnit\Framework\TestCase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\HttpKernelInterface;
class DomainThemeListenerTest extends TestCase
{
private HttpKernelInterface $kernel;
protected function setUp(): void
{
$this->kernel = $this->createMock(HttpKernelInterface::class);
}
public function testSetsThemeAttributeForMatchingDomain(): void
{
$listener = new DomainThemeListener([
'sbw-reisen' => 'sbw',
'ser-reisen' => 'ser',
]);
$request = Request::create('https://www.sbw-reisen.de/bookings/create');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST);
$listener($event);
$this->assertSame('sbw', $request->attributes->get(DomainThemeListener::THEME_ATTRIBUTE));
}
public function testSetsDefaultThemeForUnknownDomain(): void
{
$listener = new DomainThemeListener([
'sbw-reisen' => 'sbw',
]);
$request = Request::create('https://www.ep-reisen.de/bookings/create');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST);
$listener($event);
$this->assertSame('base', $request->attributes->get(DomainThemeListener::THEME_ATTRIBUTE));
}
public function testMatchesPartialDomain(): void
{
$listener = new DomainThemeListener([
'ser-reisen' => 'ser',
]);
$request = Request::create('https://portal.ser-reisen.de/bookings');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST);
$listener($event);
$this->assertSame('ser', $request->attributes->get(DomainThemeListener::THEME_ATTRIBUTE));
}
public function testIgnoresSubRequests(): void
{
$listener = new DomainThemeListener([
'sbw-reisen' => 'sbw',
]);
$request = Request::create('https://www.sbw-reisen.de/bookings/create');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::SUB_REQUEST);
$listener($event);
$this->assertFalse($request->attributes->has(DomainThemeListener::THEME_ATTRIBUTE));
}
public function testFirstMatchWins(): void
{
$listener = new DomainThemeListener([
'reisen' => 'generic',
'sbw-reisen' => 'sbw',
]);
$request = Request::create('https://www.sbw-reisen.de/bookings/create');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST);
$listener($event);
$this->assertSame('generic', $request->attributes->get(DomainThemeListener::THEME_ATTRIBUTE));
}
public function testEmptyMapReturnsDefaultTheme(): void
{
$listener = new DomainThemeListener([]);
$request = Request::create('https://www.sbw-reisen.de/bookings/create');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST);
$listener($event);
$this->assertSame('base', $request->attributes->get(DomainThemeListener::THEME_ATTRIBUTE));
}
public function testMatchesLocalhostForDevelopment(): void
{
$listener = new DomainThemeListener([
'localhost' => 'sbw',
]);
$request = Request::create('http://localhost/bookings/create');
$event = new RequestEvent($this->kernel, $request, HttpKernelInterface::MAIN_REQUEST);
$listener($event);
$this->assertSame('sbw', $request->attributes->get(DomainThemeListener::THEME_ATTRIBUTE));
}
}