createProvider([ 'example.com' => [ 'theme' => 'custom', 'gtm_id' => 'GTM-123', 'cmp_url' => 'https://cmp.example.com', ], ], 'example.com'); $config = $provider->getConfig(); $this->assertSame('custom', $config->theme); $this->assertSame('GTM-123', $config->gtmId); $this->assertSame('https://cmp.example.com', $config->cmpUrl); } public function testReturnsConfigForSubdomainMatch(): void { $provider = $this->createProvider([ 'example.com' => [ 'theme' => 'custom', 'gtm_id' => 'GTM-456', 'cmp_url' => 'https://cmp.example.com', ], ], 'www.example.com'); $config = $provider->getConfig(); $this->assertSame('custom', $config->theme); $this->assertSame('GTM-456', $config->gtmId); } public function testReturnsDefaultConfigForUnknownDomain(): void { $provider = $this->createProvider([ 'example.com' => [ 'theme' => 'custom', 'gtm_id' => 'GTM-123', 'cmp_url' => 'https://cmp.example.com', ], ], 'unknown.com'); $config = $provider->getConfig(); $this->assertSame(DomainConfig::DEFAULT_THEME, $config->theme); $this->assertSame('', $config->gtmId); $this->assertSame('', $config->cmpUrl); } public function testReturnsDefaultConfigWhenNoRequest(): void { $requestStack = new RequestStack(); $provider = new DomainConfigProvider([], $requestStack); $config = $provider->getConfig(); $this->assertSame(DomainConfig::DEFAULT_THEME, $config->theme); } public function testHandlesMissingConfigValues(): void { $provider = $this->createProvider([ 'example.com' => [ 'theme' => 'custom', ], ], 'example.com'); $config = $provider->getConfig(); $this->assertSame('custom', $config->theme); $this->assertSame('', $config->gtmId); $this->assertSame('', $config->cmpUrl); } public function testCachesConfigForSameHost(): void { $provider = $this->createProvider([ 'example.com' => [ 'theme' => 'custom', 'gtm_id' => 'GTM-123', 'cmp_url' => 'https://cmp.example.com', ], ], 'example.com'); $config1 = $provider->getConfigForHost('example.com'); $config2 = $provider->getConfigForHost('example.com'); $this->assertSame($config1, $config2); } public function testFirstMatchWins(): void { // When a host matches multiple patterns, the first pattern in iteration order wins // Here 'deep.portal.example.com' matches both 'portal.example.com' (via subdomain) // and 'example.com' (via subdomain), but portal.example.com is checked first $provider = $this->createProvider([ 'portal.example.com' => ['theme' => 'portal'], 'example.com' => ['theme' => 'main'], ], 'deep.portal.example.com'); $config = $provider->getConfig(); $this->assertSame('portal', $config->theme); } public function testCaseInsensitiveMatching(): void { $provider = $this->createProvider([ 'Example.COM' => [ 'theme' => 'custom', ], ], 'EXAMPLE.com'); $config = $provider->getConfig(); $this->assertSame('custom', $config->theme); } /** * @param array $domainConfig */ private function createProvider(array $domainConfig, string $host): DomainConfigProvider { $request = Request::create('https://'.$host.'/'); $requestStack = new RequestStack(); $requestStack->push($request); return new DomainConfigProvider($domainConfig, $requestStack); } }