2 declare(strict_types = 1);
21 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
22 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\ResponseContent;
120 'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/AdditionalConfiguration.php' =>
'typo3conf/AdditionalConfiguration.php',
121 'typo3/sysext/frontend/Tests/Functional/Fixtures/Images' =>
'fileadmin/user_upload'
136 'EN' => [
'id' => 0,
'title' =>
'English',
'locale' =>
'en_US.UTF8'],
137 'DK' => [
'id' => 1,
'title' =>
'Dansk',
'locale' =>
'dk_DA.UTF8'],
138 'DE' => [
'id' => 2,
'title' =>
'Deutsch',
'locale' =>
'de_DE.UTF8'],
139 'PL' => [
'id' => 3,
'title' =>
'Polski',
'locale' =>
'pl_PL.UTF8'],
142 protected function setUp()
146 $this->importDataSet(
'PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/sys_file_storage.xml');
150 $this->setUpFrontendRootPage(1, [
151 'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.typoscript',
175 $response = $this->executeFrontendRequest(
176 new InternalRequest(
'https://website.local/en/?id=' . static::VALUE_PageId)
178 $responseStructure = ResponseContent::fromString((
string)$response->getBody());
180 $responseSections = $responseStructure->getSections();
181 $visibleHeaders = [
'Regular Element #1',
'Regular Element #2',
'Regular Element #3'];
185 ->setTable(self::TABLE_Content)
187 ->setValues(...$visibleHeaders)
192 ->setTable(self::TABLE_Content)
198 $visibleFiles = [
'T3BOARD'];
200 ->setRecordIdentifier(self::TABLE_Content .
':297')->setRecordField(
'image')
201 ->setTable(
'sys_file_reference')->setField(
'title')->setValues(...$visibleFiles));
204 ->setRecordIdentifier(self::TABLE_Content .
':297')->setRecordField(
'image')
207 $visibleFiles = [
'Kasper2'];
209 ->setRecordIdentifier(self::TABLE_Content .
':298')->setRecordField(
'image')
210 ->setTable(
'sys_file_reference')->setField(
'title')->setValues(...$visibleFiles));
213 ->setRecordIdentifier(self::TABLE_Content .
':298')->setRecordField(
'image')
217 $this->assertEquals(
'Default language Page', $responseStructure->getScopePath(
'page/title'));
218 $this->assertEquals(0, $responseStructure->getScopePath(
'languageInfo/id'),
'languageId does not match');
219 $this->assertEquals(0, $responseStructure->getScopePath(
'languageInfo/contentId'),
'contentId does not match');
220 $this->assertEquals(
'strict', $responseStructure->getScopePath(
'languageInfo/fallbackType'),
'fallbackType does not match');
221 $this->assertEquals(
'pageNotFound', $responseStructure->getScopePath(
'languageInfo/fallbackChain'),
'fallbackChain does not match');
222 $this->assertEquals(
'includeFloating', $responseStructure->getScopePath(
'languageInfo/overlayType'),
'language overlayType does not match');
235 'languageConfiguration' => [
236 'fallbackType' =>
'free'
238 'visibleRecords' => [
240 'header' =>
'[Translate to Dansk:] Regular Element #3',
241 'image' => [
'[Kasper] Image translated to Dansk',
'[T3BOARD] Image added in Dansk (without parent)'],
244 'header' =>
'[Translate to Dansk:] Regular Element #1',
248 'header' =>
'[DK] Without default language',
249 'image' => [
'[T3BOARD] Image added to DK element without default language']
252 'header' =>
'[DK] UnHidden Element #4',
256 'fallbackType' =>
'free',
257 'fallbackChain' =>
'pageNotFound',
258 'overlayMode' =>
'off',
263 'languageConfiguration' => [
264 'fallbackType' =>
'fallback'
266 'visibleRecords' => [
268 'header' =>
'[Translate to Dansk:] Regular Element #1',
272 'header' =>
'Regular Element #2',
273 'image' => [
'Kasper2'],
276 'header' =>
'[Translate to Dansk:] Regular Element #3',
277 'image' => [
'[Kasper] Image translated to Dansk',
'[T3BOARD] Image added in Dansk (without parent)'],
280 'fallbackType' =>
'fallback',
281 'fallbackChain' =>
'pageNotFound',
282 'overlayMode' =>
'mixed',
287 'languageConfiguration' => [
288 'fallbackType' =>
'strict'
290 'visibleRecords' => [
292 'header' =>
'[Translate to Dansk:] Regular Element #1',
296 'header' =>
'[Translate to Dansk:] Regular Element #3',
297 'image' => [
'[Kasper] Image translated to Dansk',
'[T3BOARD] Image added in Dansk (without parent)'],
300 'header' =>
'[DK] Without default language',
301 'image' => [
'[T3BOARD] Image added to DK element without default language'],
304 'fallbackType' =>
'strict',
305 'fallbackChain' =>
'pageNotFound',
306 'overlayMode' =>
'includeFloating',
323 public function renderingOfDutchLanguage(array $languageConfiguration, array $visibleRecords,
string $fallbackType,
string $fallbackChain,
string $overlayType)
330 $this->
buildLanguageConfiguration(
'DK',
'/dk/', $languageConfiguration[
'fallbackChain'] ?? [], $languageConfiguration[
'fallbackType'])
337 $response = $this->executeFrontendRequest(
338 new InternalRequest(
'https://website.local/dk/?id=' . static::VALUE_PageId)
340 $responseStructure = ResponseContent::fromString((
string)$response->getBody());
341 $responseSections = $responseStructure->getSections();
342 $visibleHeaders = array_map(
function ($element) {
343 return $element[
'header'];
349 ->setTable(self::TABLE_Content)
351 ->setValues(...$visibleHeaders)
356 ->setTable(self::TABLE_Content)
361 foreach ($visibleRecords as $ttContentUid => $properties) {
362 $visibleFileTitles = $properties[
'image'];
363 if (!empty($visibleFileTitles)) {
365 ->setRecordIdentifier(self::TABLE_Content .
':' . $ttContentUid)->setRecordField(
'image')
366 ->setTable(
'sys_file_reference')->setField(
'title')->setValues(...$visibleFileTitles));
369 ->setRecordIdentifier(self::TABLE_Content .
':' . $ttContentUid)->setRecordField(
'image')
370 ->setTable(
'sys_file_reference')->setField(
'title')->setValues(...$this->
getNonVisibleFileTitles($visibleFileTitles)));
373 $this->assertEquals(
'[DK]Page', $responseStructure->getScopePath(
'page/title'));
374 $this->assertEquals(1, $responseStructure->getScopePath(
'languageInfo/id'),
'languageId does not match');
375 $this->assertEquals(1, $responseStructure->getScopePath(
'languageInfo/contentId'),
'contentId does not match');
376 $this->assertEquals($fallbackType, $responseStructure->getScopePath(
'languageInfo/fallbackType'),
'fallbackType does not match');
377 $this->assertEquals($fallbackChain, $responseStructure->getScopePath(
'languageInfo/fallbackChain'),
'fallbackChain does not match');
378 $this->assertEquals($overlayType, $responseStructure->getScopePath(
'languageInfo/overlayType'),
'language overlayType does not match');
390 'languageConfiguration' => [
391 'fallbackType' =>
'free',
392 'fallbackChain' => [
'EN']
394 'visibleRecords' => [
396 'header' =>
'Regular Element #1',
397 'image' => [
'T3BOARD'],
400 'header' =>
'Regular Element #2',
401 'image' => [
'Kasper2'],
404 'header' =>
'Regular Element #3',
405 'image' => [
'Kasper'],
408 'pageTitle' =>
'Default language Page',
411 'fallbackType' =>
'free',
412 'fallbackChain' =>
'0,pageNotFound',
413 'overlayMode' =>
'off',
416 'languageConfiguration' => [
417 'fallbackType' =>
'free',
418 'fallbackChain' => [
'EN']
420 'visibleRecords' => [
422 'header' =>
'Regular Element #1',
423 'image' => [
'T3BOARD'],
426 'header' =>
'Regular Element #2',
427 'image' => [
'Kasper2'],
430 'header' =>
'Regular Element #3',
431 'image' => [
'Kasper'],
434 'pageTitle' =>
'Default language Page',
437 'fallbackType' =>
'free',
438 'fallbackChain' =>
'0,pageNotFound',
439 'overlayMode' =>
'off',
442 'languageConfiguration' => [
443 'fallbackType' =>
'free',
444 'fallbackChain' => [
'DK',
'EN']
446 'visibleRecords' => [
448 'header' =>
'[Translate to Dansk:] Regular Element #3',
449 'image' => [
'[Kasper] Image translated to Dansk',
'[T3BOARD] Image added in Dansk (without parent)'],
452 'header' =>
'[Translate to Dansk:] Regular Element #1',
456 'header' =>
'[DK] Without default language',
457 'image' => [
'[T3BOARD] Image added to DK element without default language'],
460 'header' =>
'[DK] UnHidden Element #4',
464 'pageTitle' =>
'[DK]Page',
467 'fallbackType' =>
'free',
468 'fallbackChain' =>
'1,0,pageNotFound',
469 'overlayMode' =>
'off',
472 'languageConfiguration' => [
473 'fallbackType' =>
'free'
475 'visibleRecords' => [],
479 'fallbackType' =>
'free',
480 'fallbackChain' =>
'pageNotFound',
481 'overlayMode' =>
'off',
485 'languageConfiguration' => [
486 'fallbackType' =>
'fallback',
487 'fallbackChain' => [
'EN']
489 'visibleRecords' => [
491 'header' =>
'Regular Element #1',
492 'image' => [
'T3BOARD'],
495 'header' =>
'Regular Element #2',
496 'image' => [
'Kasper2'],
499 'header' =>
'Regular Element #3',
500 'image' => [
'Kasper'],
503 'pageTitle' =>
'Default language Page',
506 'fallbackType' =>
'fallback',
507 'fallbackChain' =>
'0,pageNotFound',
508 'overlayMode' =>
'mixed',
512 'languageConfiguration' => [
513 'fallbackType' =>
'fallback',
514 'fallbackChain' => [
'EN']
516 'visibleRecords' => [
518 'header' =>
'Regular Element #1',
519 'image' => [
'T3BOARD'],
522 'header' =>
'Regular Element #2',
523 'image' => [
'Kasper2'],
526 'header' =>
'Regular Element #3',
527 'image' => [
'Kasper'],
530 'pageTitle' =>
'Default language Page',
533 'fallbackType' =>
'fallback',
534 'fallbackChain' =>
'0,pageNotFound',
535 'overlayMode' =>
'mixed',
540 'languageConfiguration' => [
541 'fallbackType' =>
'fallback',
542 'fallbackChain' => [
'DK',
'EN']
544 'visibleRecords' => [
546 'header' =>
'[Translate to Dansk:] Regular Element #1',
550 'header' =>
'Regular Element #2',
551 'image' => [
'Kasper2'],
554 'header' =>
'[Translate to Dansk:] Regular Element #3',
555 'image' => [
'[Kasper] Image translated to Dansk',
'[T3BOARD] Image added in Dansk (without parent)'],
558 'pageTitle' =>
'[DK]Page',
561 'fallbackType' =>
'fallback',
562 'fallbackChain' =>
'1,0,pageNotFound',
563 'overlayMode' =>
'mixed',
566 'languageConfiguration' => [
567 'fallbackType' =>
'fallback',
568 'fallbackChain' => []
570 'visibleRecords' => [],
574 'fallbackType' =>
'fallback',
575 'fallbackChain' =>
'pageNotFound',
576 'overlayMode' =>
'mixed',
580 'languageConfiguration' => [
581 'fallbackType' =>
'strict',
582 'fallbackChain' => [
'EN']
584 'visibleRecords' => [
586 'header' =>
'Regular Element #1',
587 'image' => [
'T3BOARD'],
590 'header' =>
'Regular Element #2',
591 'image' => [
'Kasper2'],
594 'header' =>
'Regular Element #3',
595 'image' => [
'Kasper'],
598 'pageTitle' =>
'Default language Page',
601 'fallbackType' =>
'strict',
602 'fallbackChain' =>
'0,pageNotFound',
603 'overlayMode' =>
'includeFloating',
606 'languageConfiguration' => [
607 'fallbackType' =>
'strict',
608 'fallbackChain' => [
'DK',
'EN']
610 'visibleRecords' => [
612 'header' =>
'[Translate to Dansk:] Regular Element #1',
616 'header' =>
'[Translate to Dansk:] Regular Element #3',
617 'image' => [
'[Kasper] Image translated to Dansk',
'[T3BOARD] Image added in Dansk (without parent)'],
620 'header' =>
'[DK] Without default language',
621 'image' => [
'[T3BOARD] Image added to DK element without default language']
624 'pageTitle' =>
'[DK]Page',
627 'fallbackType' =>
'strict',
628 'fallbackChain' =>
'1,0,pageNotFound',
629 'overlayMode' =>
'includeFloating',
632 'languageConfiguration' => [
633 'fallbackType' =>
'strict',
634 'fallbackChain' => []
636 'visibleRecords' => [],
640 'fallbackType' =>
'strict',
641 'fallbackChain' =>
'pageNotFound',
642 'overlayMode' =>
'includeFloating',
664 public function contentOnNonTranslatedPageGerman(array $languageConfiguration, array $visibleRecords,
string $pageTitle,
int $languageId,
int $contentLanguageId,
string $fallbackType,
string $fallbackChain,
string $overlayMode,
int $statusCode = 200)
672 $this->
buildLanguageConfiguration(
'DE',
'/de/', $languageConfiguration[
'fallbackChain'] ?? [], $languageConfiguration[
'fallbackType'])
679 if ($statusCode === 404) {
680 $this->expectExceptionCode(1518472189);
681 $this->expectException(PageNotFoundException::class);
683 $response = $this->executeFrontendRequest(
684 new InternalRequest(
'https://website.local/de/?id=' . static::VALUE_PageId)
687 if ($statusCode === 200) {
688 $visibleHeaders = array_column($visibleRecords,
'header');
689 $responseStructure = ResponseContent::fromString((
string)$response->getBody());
690 $responseSections = $responseStructure->getSections();
695 ->setTable(self::TABLE_Content)
697 ->setValues(...$visibleHeaders)
702 ->setTable(self::TABLE_Content)
707 foreach ($visibleRecords as $ttContentUid => $properties) {
708 $visibleFileTitles = $properties[
'image'];
709 if (!empty($visibleFileTitles)) {
711 ->setRecordIdentifier(self::TABLE_Content .
':' . $ttContentUid)->setRecordField(
'image')
712 ->setTable(
'sys_file_reference')->setField(
'title')->setValues(...$visibleFileTitles));
715 ->setRecordIdentifier(self::TABLE_Content .
':' . $ttContentUid)->setRecordField(
'image')
716 ->setTable(
'sys_file_reference')->setField(
'title')->setValues(...$this->
getNonVisibleFileTitles($visibleFileTitles)));
719 $this->assertEquals($pageTitle, $responseStructure->getScopePath(
'page/title'));
720 $this->assertEquals($languageId, $responseStructure->getScopePath(
'languageInfo/id'),
'languageId does not match');
721 $this->assertEquals($contentLanguageId, $responseStructure->getScopePath(
'languageInfo/contentId'),
'contentId does not match');
722 $this->assertEquals($fallbackType, $responseStructure->getScopePath(
'languageInfo/fallbackType'),
'fallbackType does not match');
723 $this->assertEquals($fallbackChain, $responseStructure->getScopePath(
'languageInfo/fallbackChain'),
'fallbackChain does not match');
724 $this->assertEquals($overlayMode, $responseStructure->getScopePath(
'languageInfo/overlayType'),
'language overlayType does not match');
736 'languageConfiguration' => [
737 'fallbackType' =>
'free'
739 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'[PL] Without default language'],
740 'fallbackType' =>
'free',
741 'fallbackChain' =>
'pageNotFound',
742 'overlayMode' =>
'off',
745 'languageConfiguration' => [
746 'fallbackType' =>
'free',
747 'fallbackChain' => [
'EN']
749 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'[PL] Without default language'],
750 'fallbackType' =>
'free',
751 'fallbackChain' =>
'0,pageNotFound',
752 'overlayMode' =>
'off',
755 'languageConfiguration' => [
756 'fallbackType' =>
'free',
757 'fallbackChain' => [
'DK',
'EN']
759 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'[PL] Without default language'],
760 'fallbackType' =>
'free',
761 'fallbackChain' =>
'1,0,pageNotFound',
762 'overlayMode' =>
'off',
767 'languageConfiguration' => [
768 'fallbackType' =>
'fallback',
769 'fallbackChain' => [
'EN']
771 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'Regular Element #2',
'Regular Element #3'],
772 'fallbackType' =>
'fallback',
773 'fallbackChain' =>
'0,pageNotFound',
774 'overlayMode' =>
'mixed',
780 'languageConfiguration' => [
781 'fallbackType' =>
'fallback',
782 'fallbackChain' => [
'DK',
'EN']
784 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'Regular Element #2',
'Regular Element #3'],
785 'fallbackType' =>
'fallback',
786 'fallbackChain' =>
'1,0,pageNotFound',
787 'overlayMode' =>
'mixed',
790 'languageConfiguration' => [
791 'fallbackType' =>
'fallback',
792 'fallbackChain' => []
794 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'Regular Element #2',
'Regular Element #3'],
795 'fallbackType' =>
'fallback',
796 'fallbackChain' =>
'pageNotFound',
797 'overlayMode' =>
'mixed',
802 'languageConfiguration' => [
803 'fallbackType' =>
'strict',
804 'fallbackChain' => [
'EN']
806 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'[PL] Without default language'],
807 'fallbackType' =>
'strict',
808 'fallbackChain' =>
'0,pageNotFound',
809 'overlayMode' =>
'includeFloating',
812 'languageConfiguration' => [
813 'fallbackType' =>
'strict',
814 'fallbackChain' => [
'DK',
'EN']
816 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'[PL] Without default language'],
817 'fallbackType' =>
'strict',
818 'fallbackChain' =>
'1,0,pageNotFound',
819 'overlayMode' =>
'includeFloating',
822 'languageConfiguration' => [
823 'fallbackType' =>
'strict',
824 'fallbackChain' => []
826 'visibleRecordHeaders' => [
'[Translate to Polski:] Regular Element #1',
'[PL] Without default language'],
827 'fallbackType' =>
'strict',
828 'fallbackChain' =>
'pageNotFound',
829 'overlayMode' =>
'includeFloating',
846 public function contentOnPartiallyTranslatedPage(array $languageConfiguration, array $visibleHeaders,
string $fallbackType,
string $fallbackChain,
string $overlayType)
854 $this->
buildLanguageConfiguration(
'PL',
'/pl/', $languageConfiguration[
'fallbackChain'] ?? [], $languageConfiguration[
'fallbackType'])
861 $response = $this->executeFrontendRequest(
862 new InternalRequest(
'https://website.local/pl/?id=' . static::VALUE_PageId)
864 $responseStructure = ResponseContent::fromString((
string)$response->getBody());
865 $responseSections = $responseStructure->getSections();
867 $this->assertEquals(200, $response->getStatusCode());
872 ->setTable(self::TABLE_Content)
874 ->setValues(...$visibleHeaders)
879 ->setTable(self::TABLE_Content)
884 $this->assertEquals(
'[PL]Page', $responseStructure->getScopePath(
'page/title'));
885 $this->assertEquals(3, $responseStructure->getScopePath(
'languageInfo/id'),
'languageId does not match');
886 $this->assertEquals(3, $responseStructure->getScopePath(
'languageInfo/contentId'),
'contentId does not match');
887 $this->assertEquals($fallbackType, $responseStructure->getScopePath(
'languageInfo/fallbackType'),
'fallbackType does not match');
888 $this->assertEquals($fallbackChain, $responseStructure->getScopePath(
'languageInfo/fallbackChain'),
'fallbackChain does not match');
889 $this->assertEquals($overlayType, $responseStructure->getScopePath(
'languageInfo/overlayType'),
'language overlayType does not match');
901 'Regular Element #1',
902 'Regular Element #2',
903 'Regular Element #3',
905 '[Translate to Dansk:] Regular Element #1',
906 '[Translate to Dansk:] Regular Element #3',
907 '[DK] Without default language',
908 '[DK] UnHidden Element #4',
909 '[DE] Without default language',
910 '[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1',
911 '[Translate to Polski:] Regular Element #1',
912 '[PL] Without default language',
913 '[PL] Hidden Regular Element #2'
915 return array_diff($allElements, $visibleHeaders);
929 '[Kasper] Image translated to Dansk',
930 '[T3BOARD] Image added in Dansk (without parent)',
931 '[T3BOARD] Image added to DK element without default language',
932 '[T3BOARD] image translated to DE from DK',
935 return array_diff($allElements, $visibleTitles);