‪TYPO3CMS  ‪main
SiteTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\DataProvider;
21 use PHPUnit\Framework\Attributes\Test;
22 use Psr\Http\Message\ResponseFactoryInterface;
23 use Symfony\Component\DependencyInjection\Container;
42 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
43 
44 final class ‪SiteTest extends UnitTestCase
45 {
46  public function ‪tearDown(): void
47  {
48  parent::tearDown();
49  GeneralUtility::purgeInstances();
50  }
51 
52  public static function ‪getBaseReturnsProperUriDataProvider(): array
53  {
54  return [
55  'URL with scheme and domain' => ['https://www.typo3.org', 'https://www.typo3.org'],
56  'URL with scheme and domain and path' => ['https://www.typo3.org/howdy', 'https://www.typo3.org/howdy'],
57  'URL with scheme and domain and path with trailing slash' => ['https://www.typo3.org/howdy/', 'https://www.typo3.org/howdy/'],
58  'URL without scheme, but with domain' => ['www.typo3.org', '//www.typo3.org'],
59  'URL without scheme, but with domain and path' => ['www.typo3.org/partner', '//www.typo3.org/partner'],
60  'URL without scheme, but with domain and path and trailing slash' => ['www.typo3.org/partner/', '//www.typo3.org/partner/'],
61  'URL without scheme and domain but with absolute path' => ['/partner', '/partner'],
62  'URL without scheme and domain but with absolute path and trailing slash' => ['/partner/', '/partner/'],
63  'URL without scheme, domain but with random path receives a scheme divider' => ['partner/', '/partner/'],
64  'URL with ID query parameter' => ['/partner/?id=nice-to-see-you', '/partner/?id=nice-to-see-you'],
65  'URL with unknown query parameter' => ['/partner/?in-crime=nice-to-see-you', '/partner/?in-crime=nice-to-see-you'],
66  ];
67  }
68 
69  #[DataProvider('getBaseReturnsProperUriDataProvider')]
70  #[Test]
71  public function ‪getBaseReturnsProperUri($input, $expected): void
72  {
73  $subject = new ‪Site('all-your-base-belongs-to-us', 13, [
74  'base' => $input,
75  'languages' => [],
76  ]);
77  self::assertEquals(new ‪Uri($expected), $subject->getBase());
78  }
79 
87  {
88  return [
89  'Language as a regular path segment' => [
90  'https://www.typo3.org',
91  'en',
92  'https://www.typo3.org/en',
93  ],
94  'Language with two path segments' => [
95  'https://www.typo3.org',
96  'us/en',
97  'https://www.typo3.org/us/en',
98  ],
99  'Site base is added to absolute path segment' => [
100  'https://www.typo3.com/microsites/',
101  '/onboarding/',
102  'https://www.typo3.com/microsites/onboarding/',
103  ],
104  'Site base is prefixed to absolute path segment' => [
105  'https://www.typo3.com/microsites/',
106  'onboarding/',
107  'https://www.typo3.com/microsites/onboarding/',
108  ],
109  'Language with domain and scheme, do not care about site base' => [
110  'https://www.typo3.org',
111  'https://www.typo3.it',
112  'https://www.typo3.it',
113  ],
114  'Language with domain but no scheme, do not care about site base' => [
115  'blabla.car',
116  'www.typo3.fr',
117  '//www.typo3.fr',
118  ],
119  ];
120  }
121 
126  #[DataProvider('getBaseForSiteLanguageReturnsProperUriDataProvider')]
127  #[Test]
128  public function ‪getBaseForSiteLanguageReturnsProperUri($siteBase, $languageBase, $expected): void
129  {
130  $subject = new ‪Site('all-of-base', 13, [
131  'base' => $siteBase,
132  'languages' => [
133  [
134  'languageId' => 0,
135  'base' => $languageBase,
136  'locale' => 'it_IT.UTF-8',
137  ],
138  ],
139  ]);
140  self::assertEquals(new ‪Uri($expected), $subject->getLanguageById(0)->getBase());
141  }
142 
143  #[Test]
145  {
146  $subject = new ‪Site('aint-misbehaving', 13, [
147  'languages' => [],
148  'errorHandling' => [
149  [
150  'errorCode' => 123,
151  'errorHandler' => 'Fluid',
152  ],
153  [
154  'errorCode' => 124,
155  'errorContentSource' => 123,
156  'errorHandler' => 'Page',
157  ],
158  [
159  'errorCode' => 125,
160  'errorHandler' => 'PHP',
161  'errorContentSource' => 123,
162  'errorPhpClassFQCN' => PageContentErrorHandler::class,
163  ],
164  ],
165  ]);
166 
167  GeneralUtility::addInstance(FluidPageErrorHandler::class, $this->createMock(FluidPageErrorHandler::class));
168 
169  $app = new class () extends ‪Application {
170  // This is ugly but php-cs-fixer insists.
171  public function __construct() {}
172  };
173  $link = new class () extends ‪LinkService {
174  // This is ugly but php-cs-fixer insists.
175  public function __construct() {}
176  };
177  $siteFinder = new class () extends ‪SiteFinder {
178  // This is ugly but php-cs-fixer insists.
179  public function __construct() {}
180  };
181  $cacheManager = new class () extends ‪CacheManager {
182  public function getCache(‪$identifier)
183  {
184  return new class () extends ‪PhpFrontend {
185  // This is ugly but php-cs-fixer insists.
186  public function __construct() {}
187  };
188  }
189  };
190  $container = new Container();
191  $container->set(Application::class, $app);
192  $container->set(Features::class, new ‪Features());
193  $container->set(RequestFactory::class, new ‪RequestFactory(new ‪GuzzleClientFactory()));
194  $container->set(ResponseFactoryInterface::class, new ‪ResponseFactory());
195  $container->set(LinkService::class, $link);
196  $container->set(SiteFinder::class, $siteFinder);
197  $container->set(CacheManager::class, $cacheManager);
198  GeneralUtility::setContainer($container);
199 
200  self::assertInstanceOf(FluidPageErrorHandler::class, $subject->getErrorHandler(123));
201  self::assertInstanceOf(PageContentErrorHandler::class, $subject->getErrorHandler(124));
202  self::assertInstanceOf(PageContentErrorHandler::class, $subject->getErrorHandler(125));
203  }
204 
205  #[Test]
207  {
208  $this->expectException(InvalidPageErrorHandlerException::class);
209  $this->expectExceptionCode(1527432330);
210  $this->expectExceptionMessage('The configured error handler "' . Random::class . '" for status code 404 must implement the PageErrorHandlerInterface.');
211  $subject = new ‪Site('aint-misbehaving', 13, [
212  'languages' => [],
213  'errorHandling' => [
214  [
215  'errorCode' => 404,
216  'errorHandler' => 'PHP',
217  'errorPhpClassFQCN' => Random::class,
218  ],
219  ],
220  ]);
221  $subject->getErrorHandler(404);
222  }
223 
224  #[Test]
226  {
227  $this->expectException(PageErrorHandlerNotConfiguredException::class);
228  $this->expectExceptionCode(1522495914);
229  $this->expectExceptionMessage('No error handler given for the status code "404".');
230  $subject = new ‪Site('aint-misbehaving', 13, ['languages' => []]);
231  $subject->getErrorHandler(404);
232  }
233 
234  #[Test]
236  {
237  $this->expectException(PageErrorHandlerNotConfiguredException::class);
238  $this->expectExceptionCode(1522495914);
239  $this->expectExceptionMessage('No error handler given for the status code "404".');
240  $subject = new ‪Site('aint-misbehaving', 13, [
241  'languages' => [],
242  'errorHandling' => [
243  [
244  'errorCode' => 403,
245  'errorHandler' => 'Does it really matter?',
246  ],
247  ],
248  ]);
249  $subject->getErrorHandler(404);
250  }
251 
252  #[Test]
254  {
255  $app = new class () extends ‪Application {
256  // This is ugly but php-cs-fixer insists.
257  public function __construct() {}
258  };
259  $link = new class () extends ‪LinkService {
260  // This is ugly but php-cs-fixer insists.
261  public function __construct() {}
262  };
263  $siteFinder = new class () extends ‪SiteFinder {
264  // This is ugly but php-cs-fixer insists.
265  public function __construct() {}
266  };
267  $container = new Container();
268  $container->set(Application::class, $app);
269  $container->set(Features::class, new ‪Features());
270  $container->set(RequestFactory::class, new ‪RequestFactory(new ‪GuzzleClientFactory()));
271  $container->set(ResponseFactoryInterface::class, new ‪ResponseFactory());
272  $container->set(LinkService::class, $link);
273  $container->set(SiteFinder::class, $siteFinder);
274  GeneralUtility::setContainer($container);
275 
276  $subject = new ‪Site('aint-misbehaving', 13, [
277  'languages' => [],
278  'errorHandling' => [
279  [
280  'errorCode' => 403,
281  'errorHandler' => 'Does it really matter?',
282  ],
283  [
284  'errorCode' => 0,
285  'errorContentSource' => 123,
286  'errorHandler' => 'Page',
287  ],
288  ],
289  ]);
290  self::assertInstanceOf(PageErrorHandlerInterface::class, $subject->getErrorHandler(404));
291  }
292 }
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getErrorHandlerThrowsExceptionOnInvalidErrorHandler
‪getErrorHandlerThrowsExceptionOnInvalidErrorHandler()
Definition: SiteTest.php:206
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getErrorHandlerReturnsConfiguredErrorHandler
‪getErrorHandlerReturnsConfiguredErrorHandler()
Definition: SiteTest.php:144
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity
Definition: SiteLanguageTest.php:18
‪TYPO3\CMS\Core\Cache\Frontend\PhpFrontend
Definition: PhpFrontend.php:25
‪TYPO3\CMS\Core\Site\SiteFinder
Definition: SiteFinder.php:31
‪TYPO3\CMS\Core\Error\PageErrorHandler\FluidPageErrorHandler
Definition: FluidPageErrorHandler.php:32
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\tearDown
‪tearDown()
Definition: SiteTest.php:46
‪TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerNotConfiguredException
Definition: PageErrorHandlerNotConfiguredException.php:26
‪TYPO3\CMS\Core\Http\Client\GuzzleClientFactory
Definition: GuzzleClientFactory.php:28
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getErrorHandlerThrowsExceptionWhenNoErrorHandlerForStatusCodeIsConfigured
‪getErrorHandlerThrowsExceptionWhenNoErrorHandlerForStatusCodeIsConfigured()
Definition: SiteTest.php:235
‪TYPO3\CMS\Core\Http\Uri
Definition: Uri.php:30
‪TYPO3\CMS\Core\Error\PageErrorHandler\InvalidPageErrorHandlerException
Definition: InvalidPageErrorHandlerException.php:26
‪TYPO3\CMS\Core\Site\Entity\Site
Definition: Site.php:42
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getBaseForSiteLanguageReturnsProperUri
‪getBaseForSiteLanguageReturnsProperUri($siteBase, $languageBase, $expected)
Definition: SiteTest.php:128
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getErrorHandlerUsesFallbackWhenNoErrorHandlerForStatusCodeIsConfigured
‪getErrorHandlerUsesFallbackWhenNoErrorHandlerForStatusCodeIsConfigured()
Definition: SiteTest.php:253
‪TYPO3\CMS\Core\Configuration\Features
Definition: Features.php:56
‪TYPO3\CMS\Core\Cache\CacheManager
Definition: CacheManager.php:36
‪TYPO3\CMS\Core\Error\PageErrorHandler\PageContentErrorHandler
Definition: PageContentErrorHandler.php:39
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest
Definition: SiteTest.php:45
‪TYPO3\CMS\Core\Http\RequestFactory
Definition: RequestFactory.php:30
‪TYPO3\CMS\Core\Error\PageErrorHandler\PageErrorHandlerInterface
Definition: PageErrorHandlerInterface.php:29
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getBaseReturnsProperUri
‪getBaseReturnsProperUri($input, $expected)
Definition: SiteTest.php:71
‪TYPO3\CMS\Core\Http\ResponseFactory
Definition: ResponseFactory.php:27
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getBaseReturnsProperUriDataProvider
‪static getBaseReturnsProperUriDataProvider()
Definition: SiteTest.php:52
‪TYPO3\CMS\Core\Crypto\Random
Definition: Random.php:27
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getErrorHandlerThrowsExceptionWhenNoErrorHandlerIsConfigured
‪getErrorHandlerThrowsExceptionWhenNoErrorHandlerIsConfigured()
Definition: SiteTest.php:225
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Frontend\Http\Application
Definition: Application.php:35
‪TYPO3\CMS\Core\Tests\Unit\Site\Entity\SiteTest\getBaseForSiteLanguageReturnsProperUriDataProvider
‪static getBaseForSiteLanguageReturnsProperUriDataProvider()
Definition: SiteTest.php:86
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37