‪TYPO3CMS  11.5
LocalizedSiteContentRenderingTest.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 
22 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
23 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\ResponseContent;
24 
100 {
102 
103  public const ‪VALUE_PageId = 89;
104  public const ‪TABLE_Content = 'tt_content';
105  public const ‪TABLE_Pages = 'pages';
106 
107  protected ‪$coreExtensionsToLoad = ['workspaces'];
108 
109  protected ‪$pathsToLinkInTestInstance = [
110  'typo3/sysext/frontend/Tests/Functional/Fixtures/Images' => 'fileadmin/user_upload',
111  ];
112 
116  protected const ‪LANGUAGE_PRESETS = [
117  'EN' => ['id' => 0, 'title' => 'English', 'locale' => 'en_US.UTF8'],
118  'DK' => ['id' => 1, 'title' => 'Dansk', 'locale' => 'dk_DA.UTF8'],
119  'DE' => ['id' => 2, 'title' => 'Deutsch', 'locale' => 'de_DE.UTF8'],
120  'PL' => ['id' => 3, 'title' => 'Polski', 'locale' => 'pl_PL.UTF8'],
121  ];
122 
123  protected function ‪setUp(): void
124  {
125  parent::setUp();
126 
127  $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/sys_file_storage.xml');
128  $this->importCSVDataSet(__DIR__ . '/DataSet/LiveDefaultPages.csv');
129  $this->importCSVDataSet(__DIR__ . '/DataSet/LiveDefaultElements.csv');
130 
131  $this->setUpFrontendRootPage(1, [
132  'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.typoscript',
133  ]);
134  }
135 
143  {
145  'test',
146  $this->‪buildSiteConfiguration(1, 'https://website.local/'),
147  [
148  $this->‪buildDefaultLanguageConfiguration('EN', '/en/'),
149  $this->‪buildLanguageConfiguration('DK', '/dk/'),
150  ],
151  $this->‪buildErrorHandlingConfiguration('Fluid', [404]),
152  );
153 
154  $response = $this->executeFrontendSubRequest(
155  new InternalRequest('https://website.local/en/?id=' . static::VALUE_PageId)
156  );
157  $responseStructure = ResponseContent::fromString((string)$response->getBody());
158 
159  $responseSections = $responseStructure->getSections();
160  $visibleHeaders = ['Regular Element #1', 'Regular Element #2', 'Regular Element #3'];
161  self::assertThat(
162  $responseSections,
164  ->setTable(self::TABLE_Content)
165  ->setField('header')
166  ->setValues(...$visibleHeaders)
167  );
168  self::assertThat(
169  $responseSections,
171  ->setTable(self::TABLE_Content)
172  ->setField('header')
173  ->setValues(...$this->‪getNonVisibleHeaders($visibleHeaders))
174  );
175 
176  //assert FAL relations
177  $visibleFiles = ['T3BOARD'];
178  self::assertThat($responseSections, $this->‪getRequestSectionStructureHasRecordConstraint()
179  ->setRecordIdentifier(self::TABLE_Content . ':297')->setRecordField('image')
180  ->setTable('sys_file_reference')->setField('title')->setValues(...$visibleFiles));
181 
182  self::assertThat($responseSections, $this->‪getRequestSectionStructureDoesNotHaveRecordConstraint()
183  ->setRecordIdentifier(self::TABLE_Content . ':297')->setRecordField('image')
184  ->setTable('sys_file_reference')->setField('title')->setValues(...$this->‪getNonVisibleFileTitles($visibleFiles)));
185 
186  $visibleFiles = ['Kasper2'];
187  self::assertThat($responseSections, $this->‪getRequestSectionStructureHasRecordConstraint()
188  ->setRecordIdentifier(self::TABLE_Content . ':298')->setRecordField('image')
189  ->setTable('sys_file_reference')->setField('title')->setValues(...$visibleFiles));
190 
191  self::assertThat($responseSections, $this->‪getRequestSectionStructureDoesNotHaveRecordConstraint()
192  ->setRecordIdentifier(self::TABLE_Content . ':298')->setRecordField('image')
193  ->setTable('sys_file_reference')->setField('title')->setValues(...$this->‪getNonVisibleFileTitles($visibleFiles)));
194 
195  // Assert language settings and page record title
196  self::assertEquals('Default language Page', $responseStructure->getScopePath('page/title'));
197  self::assertEquals(0, $responseStructure->getScopePath('languageInfo/id'), 'languageId does not match');
198  self::assertEquals(0, $responseStructure->getScopePath('languageInfo/contentId'), 'contentId does not match');
199  self::assertEquals('strict', $responseStructure->getScopePath('languageInfo/fallbackType'), 'fallbackType does not match');
200  self::assertEquals('pageNotFound', $responseStructure->getScopePath('languageInfo/fallbackChain'), 'fallbackChain does not match');
201  self::assertEquals('includeFloating', $responseStructure->getScopePath('languageInfo/overlayType'), 'language overlayType does not match');
202  }
203 
209  public function ‪dutchDataProvider(): array
210  {
211  return [
212  [
213  // Only records with language=1 are shown
214  'languageConfiguration' => [
215  'fallbackType' => 'free',
216  ],
217  'visibleRecords' => [
218  300 => [
219  'header' => '[Translate to Dansk:] Regular Element #3',
220  'image' => ['[Kasper] Image translated to Dansk', '[T3BOARD] Image added in Dansk (without parent)'],
221  ],
222  301 => [
223  'header' => '[Translate to Dansk:] Regular Element #1',
224  'image' => [],
225  ],
226  303 => [
227  'header' => '[DK] Without default language',
228  'image' => ['[T3BOARD] Image added to DK element without default language'],
229  ],
230  308 => [
231  'header' => '[DK] UnHidden Element #4',
232  'image' => [],
233  ],
234  ],
235  'fallbackType' => 'free',
236  'fallbackChain' => 'pageNotFound',
237  'overlayMode' => 'off',
238  ],
239  // Expected behaviour:
240  // Not translated element #2 is shown because "fallback" is enabled, which defaults to L=0 elements
241  [
242  'languageConfiguration' => [
243  'fallbackType' => 'fallback',
244  ],
245  'visibleRecords' => [
246  297 => [
247  'header' => '[Translate to Dansk:] Regular Element #1',
248  'image' => [],
249  ],
250  298 => [
251  'header' => 'Regular Element #2',
252  'image' => ['Kasper2'],
253  ],
254  299 => [
255  'header' => '[Translate to Dansk:] Regular Element #3',
256  'image' => ['[Kasper] Image translated to Dansk', '[T3BOARD] Image added in Dansk (without parent)'],
257  ],
258  ],
259  'fallbackType' => 'fallback',
260  'fallbackChain' => 'pageNotFound',
261  'overlayMode' => 'mixed',
262  ],
263  // Expected behaviour:
264  // Non translated default language elements are not shown, but the results include the records without default language as well
265  [
266  'languageConfiguration' => [
267  'fallbackType' => 'strict',
268  ],
269  'visibleRecords' => [
270  297 => [
271  'header' => '[Translate to Dansk:] Regular Element #1',
272  'image' => [],
273  ],
274  299 => [
275  'header' => '[Translate to Dansk:] Regular Element #3',
276  'image' => ['[Kasper] Image translated to Dansk', '[T3BOARD] Image added in Dansk (without parent)'],
277  ],
278  303 => [
279  'header' => '[DK] Without default language',
280  'image' => ['[T3BOARD] Image added to DK element without default language'],
281  ],
282  ],
283  'fallbackType' => 'strict',
284  'fallbackChain' => 'pageNotFound',
285  'overlayMode' => 'includeFloating',
286  ],
287  ];
288  }
289 
302  public function ‪renderingOfDutchLanguage(array $languageConfiguration, array $visibleRecords, string $fallbackType, string $fallbackChain, string $overlayType): void
303  {
305  'test',
306  $this->‪buildSiteConfiguration(1, 'https://website.local/'),
307  [
308  $this->‪buildDefaultLanguageConfiguration('EN', '/en/'),
309  $this->‪buildLanguageConfiguration('DK', '/dk/', $languageConfiguration['fallbackChain'] ?? [], $languageConfiguration['fallbackType']),
310  ],
311  $this->‪buildErrorHandlingConfiguration('Fluid', [404]),
312  );
313 
314  $response = $this->executeFrontendSubRequest(
315  new InternalRequest('https://website.local/dk/?id=' . static::VALUE_PageId)
316  );
317  $responseStructure = ResponseContent::fromString((string)$response->getBody());
318  $responseSections = $responseStructure->getSections();
319  $visibleHeaders = array_map(static function ($element) {
320  return $element['header'];
321  }, $visibleRecords);
322 
323  self::assertThat(
324  $responseSections,
326  ->setTable(self::TABLE_Content)
327  ->setField('header')
328  ->setValues(...$visibleHeaders)
329  );
330  self::assertThat(
331  $responseSections,
333  ->setTable(self::TABLE_Content)
334  ->setField('header')
335  ->setValues(...$this->‪getNonVisibleHeaders($visibleHeaders))
336  );
337 
338  foreach ($visibleRecords as $ttContentUid => $properties) {
339  $visibleFileTitles = $properties['image'];
340  if (!empty($visibleFileTitles)) {
341  self::assertThat($responseSections, $this->‪getRequestSectionStructureHasRecordConstraint()
342  ->setRecordIdentifier(self::TABLE_Content . ':' . $ttContentUid)->setRecordField('image')
343  ->setTable('sys_file_reference')->setField('title')->setValues(...$visibleFileTitles));
344  }
345  self::assertThat($responseSections, $this->‪getRequestSectionStructureDoesNotHaveRecordConstraint()
346  ->setRecordIdentifier(self::TABLE_Content . ':' . $ttContentUid)->setRecordField('image')
347  ->setTable('sys_file_reference')->setField('title')->setValues(...$this->‪getNonVisibleFileTitles($visibleFileTitles)));
348  }
349 
350  self::assertEquals('[DK]Page', $responseStructure->getScopePath('page/title'));
351  self::assertEquals(1, $responseStructure->getScopePath('languageInfo/id'), 'languageId does not match');
352  self::assertEquals(1, $responseStructure->getScopePath('languageInfo/contentId'), 'contentId does not match');
353  self::assertEquals($fallbackType, $responseStructure->getScopePath('languageInfo/fallbackType'), 'fallbackType does not match');
354  self::assertEquals($fallbackChain, $responseStructure->getScopePath('languageInfo/fallbackChain'), 'fallbackChain does not match');
355  self::assertEquals($overlayType, $responseStructure->getScopePath('languageInfo/overlayType'), 'language overlayType does not match');
356  }
357 
358  public function ‪contentOnNonTranslatedPageDataProvider(): array
359  {
360  //Expected behaviour:
361  //the page is NOT translated so setting sys_language_mode to different values changes the results
362  //- setting sys_language_mode to empty value makes TYPO3 return default language records
363  //- setting it to strict throws 404, independently from other settings
364  //Setting config.sys_language_overlay = 0
365  return [
366  [
367  'languageConfiguration' => [
368  'fallbackType' => 'free',
369  'fallbackChain' => ['EN'],
370  ],
371  'visibleRecords' => [
372  297 => [
373  'header' => 'Regular Element #1',
374  'image' => ['T3BOARD'],
375  ],
376  298 => [
377  'header' => 'Regular Element #2',
378  'image' => ['Kasper2'],
379  ],
380  299 => [
381  'header' => 'Regular Element #3',
382  'image' => ['Kasper'],
383  ],
384  ],
385  'pageTitle' => 'Default language Page',
386  'languageId' => 2,
387  'contentId' => 0,
388  'fallbackType' => 'free',
389  'fallbackChain' => '0,pageNotFound',
390  'overlayMode' => 'off',
391  ],
392  [
393  'languageConfiguration' => [
394  'fallbackType' => 'free',
395  'fallbackChain' => ['EN'],
396  ],
397  'visibleRecords' => [
398  297 => [
399  'header' => 'Regular Element #1',
400  'image' => ['T3BOARD'],
401  ],
402  298 => [
403  'header' => 'Regular Element #2',
404  'image' => ['Kasper2'],
405  ],
406  299 => [
407  'header' => 'Regular Element #3',
408  'image' => ['Kasper'],
409  ],
410  ],
411  'pageTitle' => 'Default language Page',
412  'languageId' => 2,
413  'contentId' => 0,
414  'fallbackType' => 'free',
415  'fallbackChain' => '0,pageNotFound',
416  'overlayMode' => 'off',
417  ],
418  [
419  'languageConfiguration' => [
420  'fallbackType' => 'free',
421  'fallbackChain' => ['DK', 'EN'],
422  ],
423  'visibleRecords' => [
424  300 => [
425  'header' => '[Translate to Dansk:] Regular Element #3',
426  'image' => ['[Kasper] Image translated to Dansk', '[T3BOARD] Image added in Dansk (without parent)'],
427  ],
428  301 => [
429  'header' => '[Translate to Dansk:] Regular Element #1',
430  'image' => [],
431  ],
432  303 => [
433  'header' => '[DK] Without default language',
434  'image' => ['[T3BOARD] Image added to DK element without default language'],
435  ],
436  308 => [
437  'header' => '[DK] UnHidden Element #4',
438  'image' => [],
439  ],
440  ],
441  'pageTitle' => '[DK]Page',
442  'languageId' => 2,
443  'contentId' => 1,
444  'fallbackType' => 'free',
445  'fallbackChain' => '1,0,pageNotFound',
446  'overlayMode' => 'off',
447  ],
448  [
449  'languageConfiguration' => [
450  'fallbackType' => 'free',
451  ],
452  'visibleRecords' => [],
453  'pageTitle' => '',
454  'languageId' => 2,
455  'contentId' => 2,
456  'fallbackType' => 'free',
457  'fallbackChain' => 'pageNotFound',
458  'overlayMode' => 'off',
459  'statusCode' => 404,
460  ],
461  [
462  'languageConfiguration' => [
463  'fallbackType' => 'fallback',
464  'fallbackChain' => ['EN'],
465  ],
466  'visibleRecords' => [
467  297 => [
468  'header' => 'Regular Element #1',
469  'image' => ['T3BOARD'],
470  ],
471  298 => [
472  'header' => 'Regular Element #2',
473  'image' => ['Kasper2'],
474  ],
475  299 => [
476  'header' => 'Regular Element #3',
477  'image' => ['Kasper'],
478  ],
479  ],
480  'pageTitle' => 'Default language Page',
481  'languageId' => 2,
482  'contentId' => 0,
483  'fallbackType' => 'fallback',
484  'fallbackChain' => '0,pageNotFound',
485  'overlayMode' => 'mixed',
486  ],
487  //falling back to default language
488  [
489  'languageConfiguration' => [
490  'fallbackType' => 'fallback',
491  'fallbackChain' => ['EN'],
492  ],
493  'visibleRecords' => [
494  297 => [
495  'header' => 'Regular Element #1',
496  'image' => ['T3BOARD'],
497  ],
498  298 => [
499  'header' => 'Regular Element #2',
500  'image' => ['Kasper2'],
501  ],
502  299 => [
503  'header' => 'Regular Element #3',
504  'image' => ['Kasper'],
505  ],
506  ],
507  'pageTitle' => 'Default language Page',
508  'languageId' => 2,
509  'contentId' => 0,
510  'fallbackType' => 'fallback',
511  'fallbackChain' => '0,pageNotFound',
512  'overlayMode' => 'mixed',
513  ],
514  //Dutch elements are shown because of the content fallback 1,0 - first Dutch, then default language
515  //note that '[DK] Without default language' is NOT shown - due to overlays (fetch default language and overlay it with translations)
516  [
517  'languageConfiguration' => [
518  'fallbackType' => 'fallback',
519  'fallbackChain' => ['DK', 'EN'],
520  ],
521  'visibleRecords' => [
522  297 => [
523  'header' => '[Translate to Dansk:] Regular Element #1',
524  'image' => [],
525  ],
526  298 => [
527  'header' => 'Regular Element #2',
528  'image' => ['Kasper2'],
529  ],
530  299 => [
531  'header' => '[Translate to Dansk:] Regular Element #3',
532  'image' => ['[Kasper] Image translated to Dansk', '[T3BOARD] Image added in Dansk (without parent)'],
533  ],
534  ],
535  'pageTitle' => '[DK]Page',
536  'languageId' => 2,
537  'contentId' => 1,
538  'fallbackType' => 'fallback',
539  'fallbackChain' => '1,0,pageNotFound',
540  'overlayMode' => 'mixed',
541  ],
542  [
543  'languageConfiguration' => [
544  'fallbackType' => 'fallback',
545  'fallbackChain' => [],
546  ],
547  'visibleRecords' => [],
548  'pageTitle' => '',
549  'languageId' => 2,
550  'contentId' => 0,
551  'fallbackType' => 'fallback',
552  'fallbackChain' => 'pageNotFound',
553  'overlayMode' => 'mixed',
554  'statusCode' => 404,
555  ],
556  [
557  'languageConfiguration' => [
558  'fallbackType' => 'strict',
559  'fallbackChain' => ['EN'],
560  ],
561  'visibleRecords' => [
562  297 => [
563  'header' => 'Regular Element #1',
564  'image' => ['T3BOARD'],
565  ],
566  298 => [
567  'header' => 'Regular Element #2',
568  'image' => ['Kasper2'],
569  ],
570  299 => [
571  'header' => 'Regular Element #3',
572  'image' => ['Kasper'],
573  ],
574  ],
575  'pageTitle' => 'Default language Page',
576  'languageId' => 2,
577  'contentId' => 0,
578  'fallbackType' => 'strict',
579  'fallbackChain' => '0,pageNotFound',
580  'overlayMode' => 'includeFloating',
581  ],
582  [
583  'languageConfiguration' => [
584  'fallbackType' => 'strict',
585  'fallbackChain' => ['DK', 'EN'],
586  ],
587  'visibleRecords' => [
588  297 => [
589  'header' => '[Translate to Dansk:] Regular Element #1',
590  'image' => [],
591  ],
592  299 => [
593  'header' => '[Translate to Dansk:] Regular Element #3',
594  'image' => ['[Kasper] Image translated to Dansk', '[T3BOARD] Image added in Dansk (without parent)'],
595  ],
596  303 => [
597  'header' => '[DK] Without default language',
598  'image' => ['[T3BOARD] Image added to DK element without default language'],
599  ],
600  ],
601  'pageTitle' => '[DK]Page',
602  'languageId' => 2,
603  'contentId' => 1,
604  'fallbackType' => 'strict',
605  'fallbackChain' => '1,0,pageNotFound',
606  'overlayMode' => 'includeFloating',
607  ],
608  [
609  'languageConfiguration' => [
610  'fallbackType' => 'strict',
611  'fallbackChain' => [],
612  ],
613  'visibleRecords' => [],
614  'pageTitle' => '',
615  'languageId' => 2,
616  'contentId' => 1,
617  'fallbackType' => 'strict',
618  'fallbackChain' => 'pageNotFound',
619  'overlayMode' => 'includeFloating',
620  'statusCode' => 404,
621  ],
622  ];
623  }
624 
641  public function ‪contentOnNonTranslatedPageGerman(array $languageConfiguration, array $visibleRecords, string $pageTitle, int $languageId, int $contentLanguageId, string $fallbackType, string $fallbackChain, string $overlayMode, int $statusCode = 200): void
642  {
644  'main',
645  $this->‪buildSiteConfiguration(1, 'https://website.local/'),
646  [
647  $this->‪buildDefaultLanguageConfiguration('EN', '/en/'),
648  $this->‪buildLanguageConfiguration('DK', '/dk/'),
649  $this->‪buildLanguageConfiguration('DE', '/de/', $languageConfiguration['fallbackChain'] ?? [], $languageConfiguration['fallbackType']),
650  ],
651  $this->‪buildErrorHandlingConfiguration('Fluid', [404]),
652  );
653 
654  $response = $this->executeFrontendSubRequest(
655  new InternalRequest('https://website.local/de/?id=' . static::VALUE_PageId)
656  );
657 
658  if ($statusCode === 200) {
659  $visibleHeaders = array_column($visibleRecords, 'header');
660  $responseStructure = ResponseContent::fromString((string)$response->getBody());
661  $responseSections = $responseStructure->getSections();
662 
663  self::assertThat(
664  $responseSections,
666  ->setTable(self::TABLE_Content)
667  ->setField('header')
668  ->setValues(...$visibleHeaders)
669  );
670  self::assertThat(
671  $responseSections,
673  ->setTable(self::TABLE_Content)
674  ->setField('header')
675  ->setValues(...$this->‪getNonVisibleHeaders($visibleHeaders))
676  );
677 
678  foreach ($visibleRecords as $ttContentUid => $properties) {
679  $visibleFileTitles = $properties['image'];
680  if (!empty($visibleFileTitles)) {
681  self::assertThat($responseSections, $this->‪getRequestSectionStructureHasRecordConstraint()
682  ->setRecordIdentifier(self::TABLE_Content . ':' . $ttContentUid)->setRecordField('image')
683  ->setTable('sys_file_reference')->setField('title')->setValues(...$visibleFileTitles));
684  }
685  self::assertThat($responseSections, $this->‪getRequestSectionStructureDoesNotHaveRecordConstraint()
686  ->setRecordIdentifier(self::TABLE_Content . ':' . $ttContentUid)->setRecordField('image')
687  ->setTable('sys_file_reference')->setField('title')->setValues(...$this->‪getNonVisibleFileTitles($visibleFileTitles)));
688  }
689 
690  self::assertEquals($pageTitle, $responseStructure->getScopePath('page/title'));
691  self::assertEquals($languageId, $responseStructure->getScopePath('languageInfo/id'), 'languageId does not match');
692  self::assertEquals($contentLanguageId, $responseStructure->getScopePath('languageInfo/contentId'), 'contentId does not match');
693  self::assertEquals($fallbackType, $responseStructure->getScopePath('languageInfo/fallbackType'), 'fallbackType does not match');
694  self::assertEquals($fallbackChain, $responseStructure->getScopePath('languageInfo/fallbackChain'), 'fallbackChain does not match');
695  self::assertEquals($overlayMode, $responseStructure->getScopePath('languageInfo/overlayType'), 'language overlayType does not match');
696  }
697  self::assertEquals($statusCode, $response->getStatusCode());
698  }
699 
700  public function ‪contentOnPartiallyTranslatedPageDataProvider(): array
701  {
702  //Expected behaviour:
703  //Setting sys_language_mode to different values doesn't influence the result as the requested page is translated to Polish,
704  //Page title is always [PL]Page, and both languageId/contentId are always 3
705  return [
706  [
707  'languageConfiguration' => [
708  'fallbackType' => 'free',
709  ],
710  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', '[PL] Without default language'],
711  'fallbackType' => 'free',
712  'fallbackChain' => 'pageNotFound',
713  'overlayMode' => 'off',
714  ],
715  [
716  'languageConfiguration' => [
717  'fallbackType' => 'free',
718  'fallbackChain' => ['EN'],
719  ],
720  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', '[PL] Without default language'],
721  'fallbackType' => 'free',
722  'fallbackChain' => '0,pageNotFound',
723  'overlayMode' => 'off',
724  ],
725  [
726  'languageConfiguration' => [
727  'fallbackType' => 'free',
728  'fallbackChain' => ['DK', 'EN'],
729  ],
730  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', '[PL] Without default language'],
731  'fallbackType' => 'free',
732  'fallbackChain' => '1,0,pageNotFound',
733  'overlayMode' => 'off',
734  ],
735  // Expected behaviour:
736  // Not translated element #2 is shown because sys_language_overlay = 1 (with sys_language_overlay = hideNonTranslated, it would be hidden)
737  [
738  'languageConfiguration' => [
739  'fallbackType' => 'fallback',
740  'fallbackChain' => ['EN'],
741  ],
742  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', 'Regular Element #2', 'Regular Element #3'],
743  'fallbackType' => 'fallback',
744  'fallbackChain' => '0,pageNotFound',
745  'overlayMode' => 'mixed',
746  ],
747  // Expected behaviour:
748  // Element #3 is not translated in PL and it is translated in DK. It's not shown as content_fallback is not related to single CE level
749  // but on page level - and this page is translated to Polish, so no fallback is happening
750  [
751  'languageConfiguration' => [
752  'fallbackType' => 'fallback',
753  'fallbackChain' => ['DK', 'EN'],
754  ],
755  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', 'Regular Element #2', 'Regular Element #3'],
756  'fallbackType' => 'fallback',
757  'fallbackChain' => '1,0,pageNotFound',
758  'overlayMode' => 'mixed',
759  ],
760  [
761  'languageConfiguration' => [
762  'fallbackType' => 'fallback',
763  'fallbackChain' => [],
764  ],
765  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', 'Regular Element #2', 'Regular Element #3'],
766  'fallbackType' => 'fallback',
767  'fallbackChain' => 'pageNotFound',
768  'overlayMode' => 'mixed',
769  ],
770  // Expected behaviour:
771  // Non translated default language elements are not shown, because of hideNonTranslated
772  [
773  'languageConfiguration' => [
774  'fallbackType' => 'strict',
775  'fallbackChain' => ['EN'],
776  ],
777  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', '[PL] Without default language'],
778  'fallbackType' => 'strict',
779  'fallbackChain' => '0,pageNotFound',
780  'overlayMode' => 'includeFloating',
781  ],
782  [
783  'languageConfiguration' => [
784  'fallbackType' => 'strict',
785  'fallbackChain' => ['DK', 'EN'],
786  ],
787  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', '[PL] Without default language'],
788  'fallbackType' => 'strict',
789  'fallbackChain' => '1,0,pageNotFound',
790  'overlayMode' => 'includeFloating',
791  ],
792  [
793  'languageConfiguration' => [
794  'fallbackType' => 'strict',
795  'fallbackChain' => [],
796  ],
797  'visibleRecordHeaders' => ['[Translate to Polski:] Regular Element #1', '[PL] Without default language'],
798  'fallbackType' => 'strict',
799  'fallbackChain' => 'pageNotFound',
800  'overlayMode' => 'includeFloating',
801  ],
802  ];
803  }
804 
817  public function ‪contentOnPartiallyTranslatedPage(array $languageConfiguration, array $visibleHeaders, string $fallbackType, string $fallbackChain, string $overlayType): void
818  {
820  'test',
821  $this->‪buildSiteConfiguration(1, 'https://website.local/'),
822  [
823  $this->‪buildDefaultLanguageConfiguration('EN', '/en/'),
824  $this->‪buildLanguageConfiguration('DK', '/dk/'),
825  $this->‪buildLanguageConfiguration('PL', '/pl/', $languageConfiguration['fallbackChain'] ?? [], $languageConfiguration['fallbackType']),
826  ],
827  $this->‪buildErrorHandlingConfiguration('Fluid', [404]),
828  );
829 
830  $response = $this->executeFrontendSubRequest(
831  new InternalRequest('https://website.local/pl/?id=' . static::VALUE_PageId)
832  );
833  $responseStructure = ResponseContent::fromString((string)$response->getBody());
834  $responseSections = $responseStructure->getSections();
835 
836  self::assertEquals(200, $response->getStatusCode());
837 
838  self::assertThat(
839  $responseSections,
841  ->setTable(self::TABLE_Content)
842  ->setField('header')
843  ->setValues(...$visibleHeaders)
844  );
845  self::assertThat(
846  $responseSections,
848  ->setTable(self::TABLE_Content)
849  ->setField('header')
850  ->setValues(...$this->‪getNonVisibleHeaders($visibleHeaders))
851  );
852 
853  self::assertEquals('[PL]Page', $responseStructure->getScopePath('page/title'));
854  self::assertEquals(3, $responseStructure->getScopePath('languageInfo/id'), 'languageId does not match');
855  self::assertEquals(3, $responseStructure->getScopePath('languageInfo/contentId'), 'contentId does not match');
856  self::assertEquals($fallbackType, $responseStructure->getScopePath('languageInfo/fallbackType'), 'fallbackType does not match');
857  self::assertEquals($fallbackChain, $responseStructure->getScopePath('languageInfo/fallbackChain'), 'fallbackChain does not match');
858  self::assertEquals($overlayType, $responseStructure->getScopePath('languageInfo/overlayType'), 'language overlayType does not match');
859  }
860 
867  protected function ‪getNonVisibleHeaders(array $visibleHeaders): array
868  {
869  $allElements = [
870  'Regular Element #1',
871  'Regular Element #2',
872  'Regular Element #3',
873  'Hidden Element #4',
874  '[Translate to Dansk:] Regular Element #1',
875  '[Translate to Dansk:] Regular Element #3',
876  '[DK] Without default language',
877  '[DK] UnHidden Element #4',
878  '[DE] Without default language',
879  '[Translate to Deutsch:] [Translate to Dansk:] Regular Element #1',
880  '[Translate to Polski:] Regular Element #1',
881  '[PL] Without default language',
882  '[PL] Hidden Regular Element #2',
883  ];
884  return array_diff($allElements, $visibleHeaders);
885  }
886 
893  protected function ‪getNonVisibleFileTitles(array $visibleTitles): array
894  {
895  $allElements = [
896  'T3BOARD',
897  'Kasper',
898  '[Kasper] Image translated to Dansk',
899  '[T3BOARD] Image added in Dansk (without parent)',
900  '[T3BOARD] Image added to DK element without default language',
901  '[T3BOARD] image translated to DE from DK',
902  'Kasper2',
903  ];
904  return array_diff($allElements, $visibleTitles);
905  }
906 }
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\TABLE_Pages
‪const TABLE_Pages
Definition: LocalizedSiteContentRenderingTest.php:104
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildErrorHandlingConfiguration
‪array buildErrorHandlingConfiguration(string $handler, array $codes)
Definition: SiteBasedTestTrait.php:186
‪TYPO3\CMS\Core\Tests\Functional\DataHandling\AbstractDataHandlerActionTestCase\getRequestSectionHasRecordConstraint
‪HasRecordConstraint getRequestSectionHasRecordConstraint()
Definition: AbstractDataHandlerActionTestCase.php:245
‪TYPO3\CMS\Core\Tests\Functional\DataHandling\AbstractDataHandlerActionTestCase\getRequestSectionStructureHasRecordConstraint
‪StructureHasRecordConstraint getRequestSectionStructureHasRecordConstraint()
Definition: AbstractDataHandlerActionTestCase.php:261
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait
Definition: SiteBasedTestTrait.php:36
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildLanguageConfiguration
‪array buildLanguageConfiguration(string $identifier, string $base, array $fallbackIdentifiers=[], string $fallbackType=null)
Definition: SiteBasedTestTrait.php:144
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\writeSiteConfiguration
‪writeSiteConfiguration(string $identifier, array $site=[], array $languages=[], array $errorHandling=[])
Definition: SiteBasedTestTrait.php:58
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest
Definition: LocalizedSiteContentRenderingTest.php:100
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\$coreExtensionsToLoad
‪$coreExtensionsToLoad
Definition: LocalizedSiteContentRenderingTest.php:106
‪TYPO3\CMS\Core\Tests\Functional\DataHandling\AbstractDataHandlerActionTestCase\getRequestSectionStructureDoesNotHaveRecordConstraint
‪StructureDoesNotHaveRecordConstraint getRequestSectionStructureDoesNotHaveRecordConstraint()
Definition: AbstractDataHandlerActionTestCase.php:269
‪TYPO3\CMS\Core\Tests\Functional\DataHandling\AbstractDataHandlerActionTestCase
Definition: AbstractDataHandlerActionTestCase.php:41
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\contentOnNonTranslatedPageDataProvider
‪contentOnNonTranslatedPageDataProvider()
Definition: LocalizedSiteContentRenderingTest.php:357
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildDefaultLanguageConfiguration
‪array buildDefaultLanguageConfiguration(string $identifier, string $base)
Definition: SiteBasedTestTrait.php:126
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\contentOnPartiallyTranslatedPageDataProvider
‪contentOnPartiallyTranslatedPageDataProvider()
Definition: LocalizedSiteContentRenderingTest.php:699
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\$pathsToLinkInTestInstance
‪$pathsToLinkInTestInstance
Definition: LocalizedSiteContentRenderingTest.php:108
‪TYPO3\CMS\Core\Tests\Functional\DataHandling\AbstractDataHandlerActionTestCase\getRequestSectionDoesNotHaveRecordConstraint
‪DoesNotHaveRecordConstraint getRequestSectionDoesNotHaveRecordConstraint()
Definition: AbstractDataHandlerActionTestCase.php:253
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\renderingOfDutchLanguage
‪renderingOfDutchLanguage(array $languageConfiguration, array $visibleRecords, string $fallbackType, string $fallbackChain, string $overlayType)
Definition: LocalizedSiteContentRenderingTest.php:301
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\contentOnPartiallyTranslatedPage
‪contentOnPartiallyTranslatedPage(array $languageConfiguration, array $visibleHeaders, string $fallbackType, string $fallbackChain, string $overlayType)
Definition: LocalizedSiteContentRenderingTest.php:816
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\getNonVisibleHeaders
‪array getNonVisibleHeaders(array $visibleHeaders)
Definition: LocalizedSiteContentRenderingTest.php:866
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\LANGUAGE_PRESETS
‪const LANGUAGE_PRESETS
Definition: LocalizedSiteContentRenderingTest.php:115
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\contentOnNonTranslatedPageGerman
‪contentOnNonTranslatedPageGerman(array $languageConfiguration, array $visibleRecords, string $pageTitle, int $languageId, int $contentLanguageId, string $fallbackType, string $fallbackChain, string $overlayMode, int $statusCode=200)
Definition: LocalizedSiteContentRenderingTest.php:640
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\getNonVisibleFileTitles
‪array getNonVisibleFileTitles(array $visibleTitles)
Definition: LocalizedSiteContentRenderingTest.php:892
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildSiteConfiguration
‪array buildSiteConfiguration(int $rootPageId, string $base='')
Definition: SiteBasedTestTrait.php:111
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\onlyEnglishContentIsRenderedForDefaultLanguage
‪onlyEnglishContentIsRenderedForDefaultLanguage()
Definition: LocalizedSiteContentRenderingTest.php:141
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\TABLE_Content
‪const TABLE_Content
Definition: LocalizedSiteContentRenderingTest.php:103
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\dutchDataProvider
‪array dutchDataProvider()
Definition: LocalizedSiteContentRenderingTest.php:208
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering
Definition: LocalizedSiteContentRenderingTest.php:18
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\setUp
‪setUp()
Definition: LocalizedSiteContentRenderingTest.php:122
‪TYPO3\CMS\Frontend\Tests\Functional\Rendering\LocalizedSiteContentRenderingTest\VALUE_PageId
‪const VALUE_PageId
Definition: LocalizedSiteContentRenderingTest.php:102