2 declare(strict_types = 1);
19 use Psr\Http\Message\ResponseInterface;
20 use Psr\Http\Message\ServerRequestInterface;
21 use Psr\Http\Server\RequestHandlerInterface;
32 use TYPO3\TestingFramework\Core\AccessibleObjectInterface;
33 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
55 protected function setUp():
void
57 $this->siteFinder = $this->getAccessibleMock(SiteFinder::class, [
'dummy'], [],
'',
false);
60 $this->siteFoundRequestHandler =
new class implements RequestHandlerInterface {
61 public function handle(ServerRequestInterface $request): ResponseInterface
65 $site = $request->getAttribute(
'site',
false);
66 $language = $request->getAttribute(
'language',
false);
67 if ($site && $language) {
70 'site' => $site->getIdentifier(),
71 'language-id' => $language->getLanguageId(),
72 'language-base' => (
string)$language->getBase(),
73 'rootpage' => $site->getRootPageId()
81 $cacheManagerProphecy = $this->prophesize(CacheManager::class);
82 GeneralUtility::setSingletonInstance(CacheManager::class, $cacheManagerProphecy->reveal());
95 $incomingUrl =
'https://a-random-domain.com/mysite/';
96 $siteIdentifier =
'full-site';
97 $this->siteFinder->_set(
'sites', [
98 $siteIdentifier =>
new Site($siteIdentifier, 13, [
103 'locale' =>
'fr_FR.UTF-8',
113 $response = $subject->process($request, $this->siteFoundRequestHandler);
116 $this->fail(
'No site configuration found in URL ' . $incomingUrl .
'.');
118 $result = $response->getBody()->getContents();
119 $result = json_decode($result,
true);
120 $this->assertEquals($siteIdentifier, $result[
'site']);
121 $this->assertEquals(0, $result[
'language-id']);
122 $this->assertEquals(
'/mysite/', $result[
'language-base']);
139 $incomingUrl =
'https://www.random-result.com/mysubsite/you-know-why/';
140 $this->siteFinder->_set(
'sites', [
141 'outside-site' =>
new Site(
'outside-site', 13, [
146 'locale' =>
'fr_FR.UTF-8',
151 'sub-site' =>
new Site(
'sub-site', 15, [
152 'base' =>
'/mysubsite/',
156 'locale' =>
'fr_FR.UTF-8',
166 $response = $subject->process($request, $this->siteFoundRequestHandler);
168 $this->fail(
'No site configuration found in URL ' . $incomingUrl .
'.');
170 $result = $response->getBody()->getContents();
171 $result = json_decode($result,
true);
172 $this->assertEquals(
'sub-site', $result[
'site']);
173 $this->assertEquals(0, $result[
'language-id']);
174 $this->assertEquals(
'/mysubsite/', $result[
'language-base']);
181 'matches second site' => [
182 'https://www.random-result.com/mysubsite/you-know-why/',
187 'matches third site' => [
188 'https://www.random-result.com/mysubsite/micro-site/oh-yes-you-do/',
191 '/mysubsite/micro-site/'
193 'matches a subsite in first site' => [
194 'https://www.random-result.com/products/pampers/',
220 $this->siteFinder->_set(
'sites', [
221 'outside-site' =>
new Site(
'outside-site', 13, [
226 'locale' =>
'fr_FR.UTF-8',
231 'sub-site' =>
new Site(
'sub-site', 14, [
232 'base' =>
'/mysubsite/',
236 'locale' =>
'fr_FR.UTF-8',
241 'subsub-site' =>
new Site(
'subsub-site', 15, [
242 'base' =>
'/mysubsite/micro-site/',
246 'locale' =>
'fr_FR.UTF-8',
253 $subject =
new SiteResolver(
new SiteMatcher($this->siteFinder));
255 $request =
new ServerRequest($incomingUrl,
'GET');
256 $response = $subject->process($request, $this->siteFoundRequestHandler);
258 if ($response instanceof NullResponse) {
259 $this->fail(
'No site configuration found in URL ' . $incomingUrl .
'.');
261 $result = $response->getBody()->getContents();
262 $result = json_decode($result,
true);
263 $this->assertEquals($expectedSiteIdentifier, $result[
'site']);
264 $this->assertEquals($expectedRootPageId, $result[
'rootpage']);
265 $this->assertEquals($expectedBase, $result[
'language-base']);
272 'matches second site' => [
273 'https://www.random-result.com/mysubsite/you-know-why/',
279 'matches second site in other language' => [
280 'https://www.random-result.com/mysubsite/it/you-know-why/',
286 'matches third site' => [
287 'https://www.random-result.com/mysubsite/micro-site/ru/oh-yes-you-do/',
291 '/mysubsite/micro-site/ru/'
293 'matches a subpage in first site' => [
294 'https://www.random-result.com/en/products/pampers/',
300 'matches a subpage with translation in first site' => [
301 'https://www.random-result.com/fr/products/pampers/',
325 $this->siteFinder->_set(
'sites', [
326 'outside-site' =>
new Site(
'outside-site', 13, [
331 'locale' =>
'en_US.UTF-8',
336 'locale' =>
'fr_CA.UTF-8',
341 'sub-site' =>
new Site(
'sub-site', 14, [
342 'base' =>
'/mysubsite/',
346 'locale' =>
'it_IT.UTF-8',
351 'subsub-site' =>
new Site(
'subsub-site', 15, [
352 'base' =>
'/mysubsite/micro-site/',
356 'locale' =>
'ru_RU.UTF-8',
363 $subject =
new SiteResolver(
new SiteMatcher($this->siteFinder));
365 $request =
new ServerRequest($incomingUrl,
'GET');
366 $response = $subject->process($request, $this->siteFoundRequestHandler);
368 if ($response instanceof NullResponse) {
369 $this->fail(
'No site configuration found in URL ' . $incomingUrl .
'.');
371 $result = $response->getBody()->getContents();
372 $result = json_decode($result,
true);
373 $this->assertEquals($expectedSiteIdentifier, $result[
'site']);
374 $this->assertEquals($expectedRootPageId, $result[
'rootpage']);
375 $this->assertEquals($expectedLanguageId, $result[
'language-id']);
376 $this->assertEquals($expectedBase, $result[
'language-base']);