‪TYPO3CMS  10.4
SlugSiteRequestTest.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\DataHandling\Scenario\DataHandlerFactory;
23 use TYPO3\TestingFramework\Core\Functional\Framework\DataHandling\Scenario\DataHandlerWriter;
24 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
25 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequestContext;
26 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\ResponseContent;
27 
32 {
36  private ‪$siteTitle = 'A Company that Manufactures Everything Inc';
37 
42 
43  public static function ‪setUpBeforeClass(): void
44  {
45  parent::setUpBeforeClass();
46  static::initializeDatabaseSnapshot();
47  }
48 
49  public static function ‪tearDownAfterClass(): void
50  {
51  static::destroyDatabaseSnapshot();
52  parent::tearDownAfterClass();
53  }
54 
55  protected function ‪setUp(): void
56  {
57  parent::setUp();
58 
59  $typo3ConfVars = array_merge_recursive(static::TYPO3_CONF_VARS, [
60  'FE' => [
61  'cacheHash' => [
62  'enforceValidation' => true,
63  ],
64  ],
65  ]);
66  // these settings are forwarded to the frontend sub-request as well
67  $this->internalRequestContext = (new InternalRequestContext())
68  ->withGlobalSettings(['TYPO3_CONF_VARS' => $typo3ConfVars]);
69 
70  $this->withDatabaseSnapshot(function () {
71  $this->‪setUpDatabase();
72  });
73  }
74 
75  protected function ‪setUpDatabase()
76  {
77  $backendUser = $this->setUpBackendUserFromFixture(1);
79 
80  $scenarioFile = __DIR__ . '/Fixtures/SlugScenario.yaml';
81  $factory = DataHandlerFactory::fromYamlFile($scenarioFile);
82  $writer = DataHandlerWriter::withBackendUser($backendUser);
83  $writer->invokeFactory($factory);
84  static::failIfArrayIsNotEmpty(
85  $writer->getErrors()
86  );
87 
88  $this->setUpFrontendRootPage(
89  1000,
90  [
91  'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/JsonRenderer.typoscript',
92  'typo3/sysext/frontend/Tests/Functional/SiteHandling/Fixtures/JsonRenderer.typoscript',
93  ],
94  [
95  'title' => 'ACME Root',
96  'sitetitle' => $this->siteTitle,
97  ]
98  );
99  }
100 
101  protected function ‪tearDown(): void
102  {
103  unset($this->internalRequestContext);
104  parent::tearDown();
105  }
106 
111  {
112  $domainPaths = [
113  'https://website.local/',
114  'https://website.local/?',
115  'https://website.local//',
116  ];
117 
118  return $this->wrapInArray(
119  $this->keysFromValues($domainPaths)
120  );
121  }
122 
130  {
132  'website-local',
133  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
134  );
135 
136  $expectedStatusCode = 307;
137  $expectedHeaders = ['location' => ['https://website.local/welcome']];
138 
139  $response = $this->executeFrontendRequest(
140  new InternalRequest($uri),
141  $this->internalRequestContext
142  );
143  self::assertSame($expectedStatusCode, $response->getStatusCode());
144  self::assertSame($expectedHeaders, $response->getHeaders());
145  }
146 
150  public function ‪shortcutsAreRedirectedDataProvider(): array
151  {
152  $domainPaths = [
153  'https://website.local/',
154  'https://website.local/?',
155  'https://website.local//',
156  ];
157 
158  return $this->wrapInArray(
159  $this->keysFromValues($domainPaths)
160  );
161  }
162 
169  public function ‪shortcutsAreRedirectedToDefaultSiteLanguage(string $uri)
170  {
172  'website-local',
173  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
174  [
175  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/'),
176  ]
177  );
178 
179  $expectedStatusCode = 307;
180  $expectedHeaders = [
181  'location' => ['https://website.local/en-en/'],
182  ];
183 
184  $response = $this->executeFrontendRequest(
185  new InternalRequest($uri),
186  $this->internalRequestContext
187  );
188  self::assertSame($expectedStatusCode, $response->getStatusCode());
189  self::assertSame($expectedHeaders, $response->getHeaders());
190  }
191 
198  public function ‪shortcutsAreRedirectedAndRenderFirstSubPage(string $uri)
199  {
201  'website-local',
202  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
203  [
204  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/'),
205  ]
206  );
207 
208  $expectedStatusCode = 200;
209  $expectedPageTitle = 'EN: Welcome';
210 
211  $response = $this->executeFrontendRequest(
212  new InternalRequest($uri),
213  $this->internalRequestContext,
214  true
215  );
216  $responseStructure = ResponseContent::fromString(
217  (string)$response->getBody()
218  );
219 
220  self::assertSame(
221  $expectedStatusCode,
222  $response->getStatusCode()
223  );
224  self::assertSame(
225  $this->siteTitle,
226  $responseStructure->getScopePath('template/sitetitle')
227  );
228  self::assertSame(
229  $expectedPageTitle,
230  $responseStructure->getScopePath('page/title')
231  );
232  }
233 
238  {
239  $domainPaths = [
240  'https://website.local/简',
241  'https://website.local/简?',
242  'https://website.local/简/',
243  'https://website.local/简/?',
244  ];
245 
246  return $this->wrapInArray(
247  $this->keysFromValues($domainPaths)
248  );
249  }
250 
258  {
260  'website-local',
261  $this->‪buildSiteConfiguration(1000, 'https://website.local/简/'),
262  [
263  $this->‪buildDefaultLanguageConfiguration('ZH-CN', '/'),
264  ]
265  );
266 
267  $expectedStatusCode = 307;
268  $expectedHeaders = [
269  // We cannot expect 简 here directly, as they are rawurlencoded() in the used Symfony UrlGenerator.
270  'location' => ['https://website.local/%E7%AE%80/welcome'],
271  ];
272 
273  $response = $this->executeFrontendRequest(
274  new InternalRequest($uri),
275  $this->internalRequestContext
276  );
277  self::assertSame($expectedStatusCode, $response->getStatusCode());
278  self::assertSame($expectedHeaders, $response->getHeaders());
279  }
280 
288  {
290  'website-local',
291  $this->‪buildSiteConfiguration(1000, 'https://website.local/简/'),
292  [
293  $this->‪buildDefaultLanguageConfiguration('ZH-CN', '/'),
294  ]
295  );
296 
297  $expectedStatusCode = 200;
298  $expectedPageTitle = 'EN: Welcome';
299 
300  $response = $this->executeFrontendRequest(
301  new InternalRequest($uri),
302  $this->internalRequestContext,
303  true
304  );
305  $responseStructure = ResponseContent::fromString(
306  (string)$response->getBody()
307  );
308 
309  self::assertSame(
310  $expectedStatusCode,
311  $response->getStatusCode()
312  );
313  self::assertSame(
314  $expectedPageTitle,
315  $responseStructure->getScopePath('page/title')
316  );
317  }
318 
323  {
325  'website-local',
326  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
327  [
328  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/'),
329  ],
330  $this->‪buildErrorHandlingConfiguration('Fluid', [404])
331  );
332 
333  $uri = 'https://website.other/any/invalid/slug';
334  $response = $this->executeFrontendRequest(new InternalRequest($uri));
335  self::assertSame(404, $response->getStatusCode());
336  }
337 
342  {
344  'website-local',
345  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
346  [
347  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/')
348  ],
349  $this->‪buildErrorHandlingConfiguration('Fluid', [404])
350  );
351 
352  $uri = 'https://website.local/any/invalid/slug';
353  $response = $this->executeFrontendRequest(
354  new InternalRequest($uri),
355  $this->internalRequestContext
356  );
357 
358  self::assertSame(
359  404,
360  $response->getStatusCode()
361  );
362  self::assertStringContainsString(
363  'message: The requested page does not exist',
364  (string)$response->getBody()
365  );
366  }
367 
372  {
374  'website-local',
375  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
376  [
377  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/')
378  ],
379  $this->‪buildErrorHandlingConfiguration('Fluid', [404])
380  );
381 
382  $uri = 'https://website.local/en-en/any/invalid/slug';
383  $response = $this->executeFrontendRequest(
384  new InternalRequest($uri),
385  $this->internalRequestContext
386  );
387 
388  self::assertSame(
389  404,
390  $response->getStatusCode()
391  );
392  self::assertStringContainsString(
393  'message: The requested page does not exist',
394  (string)$response->getBody()
395  );
396  }
397 
402  {
404  'website-local',
405  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
406  [
407  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/')
408  ],
409  $this->‪buildErrorHandlingConfiguration('Fluid', [500])
410  );
411 
412  $uri = 'https://website.local/en-en/?type=13';
413 
414  $settings = ['TYPO3_CONF_VARS' => static::TYPO3_CONF_VARS];
415  $settings['TYPO3_CONF_VARS']['SYS']['devIPmask'] = '';
416  $response = $this->executeFrontendRequest(
417  new InternalRequest($uri),
418  (new InternalRequestContext())->withGlobalSettings($settings)
419  );
420 
421  self::assertSame(
422  500,
423  $response->getStatusCode()
424  );
425  self::assertStringContainsString(
426  'message: The page is not configured',
427  (string)$response->getBody()
428  );
429  }
430 
434  public function ‪pageIsRenderedWithPathsDataProvider(): array
435  {
436  $domainPaths = [
437  'https://website.local/en-en/welcome',
438  'https://website.local/fr-fr/bienvenue',
439  'https://website.local/fr-ca/bienvenue',
440  'https://website.local/简/简-bienvenue',
441  ];
442 
443  return array_map(
444  function (string $uri) {
445  if (strpos($uri, '/fr-fr/') !== false) {
446  $expectedPageTitle = 'FR: Welcome';
447  } elseif (strpos($uri, '/fr-ca/') !== false) {
448  $expectedPageTitle = 'FR-CA: Welcome';
449  } elseif (strpos($uri, '/简/') !== false) {
450  $expectedPageTitle = 'ZH-CN: Welcome';
451  } else {
452  $expectedPageTitle = 'EN: Welcome';
453  }
454  return [$uri, $expectedPageTitle];
455  },
456  $this->keysFromValues($domainPaths)
457  );
458  }
459 
467  public function ‪pageIsRenderedWithPaths(string $uri, string $expectedPageTitle)
468  {
470  'website-local',
471  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
472  [
473  $this->‪buildDefaultLanguageConfiguration('EN', '/en-en/'),
474  $this->‪buildLanguageConfiguration('FR', '/fr-fr/', ['EN']),
475  $this->‪buildLanguageConfiguration('FR-CA', '/fr-ca/', ['FR', 'EN']),
476  $this->‪buildLanguageConfiguration('ZH', '/简/', ['EN']),
477  ]
478  );
479 
480  $response = $this->executeFrontendRequest(
481  new InternalRequest($uri),
482  $this->internalRequestContext
483  );
484  $responseStructure = ResponseContent::fromString(
485  (string)$response->getBody()
486  );
487 
488  self::assertSame(
489  200,
490  $response->getStatusCode()
491  );
492  self::assertSame(
493  $expectedPageTitle,
494  $responseStructure->getScopePath('page/title')
495  );
496  }
497 
499  {
500  $domainPaths = [
501  'https://website.local/简/简-bienvenue',
502  'https://website.local/fr-fr/zh-bienvenue',
503  'https://website.local/fr-ca/zh-bienvenue',
504  ];
505 
506  return array_map(
507  static function (string $uri) {
508  if (strpos($uri, '/fr-fr/') !== false) {
509  $expectedPageTitle = 'FR: Welcome ZH Default';
510  } elseif (strpos($uri, '/fr-ca/') !== false) {
511  $expectedPageTitle = 'FR-CA: Welcome ZH Default';
512  } else {
513  $expectedPageTitle = 'ZH-CN: Welcome Default';
514  }
515  return [$uri, $expectedPageTitle];
516  },
517  $this->keysFromValues($domainPaths)
518  );
519  }
520 
525  public function ‪pageIsRenderedWithPathsAndChineseDefaultLanguage(string $uri, string $expectedPageTitle): void
526  {
528  'website-local',
529  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
530  [
531  $this->‪buildDefaultLanguageConfiguration('ZH-CN', '/简/'),
532  $this->‪buildLanguageConfiguration('FR', '/fr-fr/', ['EN']),
533  $this->‪buildLanguageConfiguration('FR-CA', '/fr-ca/', ['FR', 'EN']),
534  ]
535  );
536 
537  $response = $this->executeFrontendRequest(
538  new InternalRequest($uri),
539  $this->internalRequestContext
540  );
541  $responseStructure = ResponseContent::fromString(
542  (string)$response->getBody()
543  );
544 
545  self::assertSame(
546  200,
547  $response->getStatusCode()
548  );
549  self::assertSame(
550  $this->siteTitle,
551  $responseStructure->getScopePath('template/sitetitle')
552  );
553  self::assertSame(
554  $expectedPageTitle,
555  $responseStructure->getScopePath('page/title')
556  );
557  }
558 
562  public function ‪pageIsRenderedWithDomainsDataProvider(): array
563  {
564  $domainPaths = [
565  'https://website.us/welcome',
566  'https://website.fr/bienvenue',
567  'https://website.ca/bienvenue',
568  // Explicitly testing chinese character domains
569  'https://website.简/简-bienvenue',
570  ];
571 
572  return array_map(
573  function (string $uri) {
574  if (strpos($uri, '.fr/') !== false) {
575  $expectedPageTitle = 'FR: Welcome';
576  } elseif (strpos($uri, '.ca/') !== false) {
577  $expectedPageTitle = 'FR-CA: Welcome';
578  } elseif (strpos($uri, '.简/') !== false) {
579  $expectedPageTitle = 'ZH-CN: Welcome';
580  } else {
581  $expectedPageTitle = 'EN: Welcome';
582  }
583  return [$uri, $expectedPageTitle];
584  },
585  $this->keysFromValues($domainPaths)
586  );
587  }
588 
596  public function ‪pageIsRenderedWithDomains(string $uri, string $expectedPageTitle)
597  {
599  'website-local',
600  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
601  [
602  $this->‪buildDefaultLanguageConfiguration('EN', 'https://website.us/'),
603  $this->‪buildLanguageConfiguration('FR', 'https://website.fr/', ['EN']),
604  $this->‪buildLanguageConfiguration('FR-CA', 'https://website.ca/', ['FR', 'EN']),
605  $this->‪buildLanguageConfiguration('ZH', 'https://website.简/', ['EN']),
606  ]
607  );
608 
609  $response = $this->executeFrontendRequest(
610  new InternalRequest($uri),
611  $this->internalRequestContext
612  );
613  $responseStructure = ResponseContent::fromString(
614  (string)$response->getBody()
615  );
616 
617  self::assertSame(
618  200,
619  $response->getStatusCode()
620  );
621  self::assertSame(
622  $this->siteTitle,
623  $responseStructure->getScopePath('template/sitetitle')
624  );
625  self::assertSame(
626  $expectedPageTitle,
627  $responseStructure->getScopePath('page/title')
628  );
629  }
630 
634  public function ‪pageIsRenderedWithTrailingSlash()
635  {
636  $uri = 'https://website.us/features/frontend-editing/';
637 
639  'website-local',
640  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
641  [
642  $this->‪buildDefaultLanguageConfiguration('EN', 'https://website.us/'),
643  $this->‪buildLanguageConfiguration('FR', 'https://website.fr/', ['EN']),
644  $this->‪buildLanguageConfiguration('FR-CA', 'https://website.ca/', ['FR', 'EN']),
645  ]
646  );
647 
648  $response = $this->executeFrontendRequest(
649  new InternalRequest($uri),
650  $this->internalRequestContext
651  );
652 
653  $responseStructure = ResponseContent::fromString((string)$response->getBody());
654  self::assertSame(200, $response->getStatusCode());
655  self::assertSame('EN: Frontend Editing', $responseStructure->getScopePath('page/title'));
656  }
657 
661  public function ‪restrictedPageIsRenderedDataProvider(): array
662  {
663  $instructions = [
664  // frontend user 1
665  ['https://website.local/my-acme/whitepapers', 1, 'Whitepapers'],
666  ['https://website.local/my-acme/whitepapers/products', 1, 'Products'],
667  ['https://website.local/my-acme/whitepapers/solutions', 1, 'Solutions'],
668  // frontend user 2
669  ['https://website.local/my-acme/whitepapers', 2, 'Whitepapers'],
670  ['https://website.local/my-acme/whitepapers/products', 2, 'Products'],
671  ['https://website.local/my-acme/whitepapers/research', 2, 'Research'],
672  ['https://website.local/my-acme/forecasts', 2, 'Forecasts'],
673  ['https://website.local/my-acme/forecasts/current-year', 2, 'Current Year'],
674  // frontend user 3
675  ['https://website.local/my-acme/whitepapers', 3, 'Whitepapers'],
676  ['https://website.local/my-acme/whitepapers/products', 3, 'Products'],
677  ['https://website.local/my-acme/whitepapers/solutions', 3, 'Solutions'],
678  ['https://website.local/my-acme/whitepapers/research', 3, 'Research'],
679  ['https://website.local/my-acme/forecasts', 3, 'Forecasts'],
680  ['https://website.local/my-acme/forecasts/current-year', 3, 'Current Year'],
681  ];
682 
683  return $this->keysFromTemplate($instructions, '%1$s (user:%2$s)');
684  }
685 
694  public function ‪restrictedPageIsRendered(string $uri, int $frontendUserId, string $expectedPageTitle)
695  {
697  'website-local',
698  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
699  );
700 
701  $response = $this->executeFrontendRequest(
702  new InternalRequest($uri),
703  $this->internalRequestContext
704  ->withFrontendUserId($frontendUserId)
705  );
706  $responseStructure = ResponseContent::fromString(
707  (string)$response->getBody()
708  );
709 
710  self::assertSame(
711  200,
712  $response->getStatusCode()
713  );
714  self::assertSame(
715  $this->siteTitle,
716  $responseStructure->getScopePath('template/sitetitle')
717  );
718  self::assertSame(
719  $expectedPageTitle,
720  $responseStructure->getScopePath('page/title')
721  );
722  }
723 
728  {
729  $instructions = [
730  // frontend user 4
731  ['https://website.local/sysfolder-restricted', 4, 'FEGroups Restricted'],
732  ];
733 
734  return $this->keysFromTemplate($instructions, '%1$s (user:%2$s)');
735  }
736 
745  public function ‪restrictedPageWithParentSysFolderIsRendered(string $uri, int $frontendUserId, string $expectedPageTitle): void
746  {
748  'website-local',
749  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
750  );
751 
752  $response = $this->executeFrontendRequest(
753  new InternalRequest($uri),
754  $this->internalRequestContext
755  ->withFrontendUserId($frontendUserId)
756  );
757  $responseStructure = ResponseContent::fromString(
758  (string)$response->getBody()
759  );
760 
761  self::assertSame(
762  200,
763  $response->getStatusCode()
764  );
765  self::assertSame(
766  $expectedPageTitle,
767  $responseStructure->getScopePath('page/title')
768  );
769  }
770 
775  {
776  $instructions = [
777  // no frontend user given
778  ['https://website.local/my-acme/whitepapers', 0],
779  // ['https://website.local/my-acme/whitepapers/products', 0], // @todo extendToSubpages currently missing
780  ['https://website.local/my-acme/whitepapers/solutions', 0],
781  ['https://website.local/my-acme/whitepapers/research', 0],
782  ['https://website.local/my-acme/forecasts', 0],
783  // ['https://website.local/my-acme/forecasts/current-year', 0], // @todo extendToSubpages currently missing
784  // frontend user 1
785  ['https://website.local/my-acme/whitepapers/research', 1],
786  ['https://website.local/my-acme/forecasts', 1],
787  // ['https://website.local/my-acme/forecasts/current-year', 1], // @todo extendToSubpages currently missing
788  // frontend user 2
789  ['https://website.local/my-acme/whitepapers/solutions', 2],
790  ];
791 
792  return $this->keysFromTemplate($instructions, '%1$s (user:%2$s)');
793  }
794 
803  {
805  'website-local',
806  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
807  );
808 
809  $response = $this->executeFrontendRequest(
810  new InternalRequest($uri),
811  $this->internalRequestContext
812  ->withFrontendUserId($frontendUserId)
813  );
814 
815  self::assertSame(
816  403,
817  $response->getStatusCode()
818  );
819  self::assertThat(
820  (string)$response->getBody(),
821  self::logicalOr(
822  self::stringContains('Reason: ID was not an accessible page'),
823  self::stringContains('Reason: Subsection was found and not accessible')
824  )
825  );
826  }
827 
836  {
838  'website-local',
839  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
840  [],
841  $this->‪buildErrorHandlingConfiguration('Fluid', [403])
842  );
843 
844  $response = $this->executeFrontendRequest(
845  new InternalRequest($uri),
846  $this->internalRequestContext
847  ->withFrontendUserId($frontendUserId)
848  );
849 
850  self::assertSame(
851  403,
852  $response->getStatusCode()
853  );
854  self::assertStringContainsString(
855  'reasons: code,fe_group',
856  (string)$response->getBody()
857  );
858  self::assertThat(
859  (string)$response->getBody(),
860  self::logicalOr(
861  self::stringContains('message: ID was not an accessible page'),
862  self::stringContains('message: Subsection was found and not accessible')
863  )
864  );
865  }
866 
876  {
877  self::markTestSkipped('Skipped until PageContentErrorHandler::handlePageError does not use HTTP anymore');
878 
880  'website-local',
881  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
882  [],
883  $this->‪buildErrorHandlingConfiguration('Page', [403])
884  );
885 
886  $response = $this->executeFrontendRequest(
887  new InternalRequest($uri),
888  $this->internalRequestContext
889  ->withFrontendUserId($frontendUserId)
890  );
891 
892  self::assertSame(
893  403,
894  $response->getStatusCode()
895  );
896  }
897 
906  {
908  'website-local',
909  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
910  [],
911  $this->‪buildErrorHandlingConfiguration('PHP', [403])
912  );
913 
914  $response = $this->executeFrontendRequest(
915  new InternalRequest($uri),
916  $this->internalRequestContext
917  ->withFrontendUserId($frontendUserId)
918  );
919  $json = json_decode((string)$response->getBody(), true);
920 
921  self::assertSame(
922  403,
923  $response->getStatusCode()
924  );
925  self::assertThat(
926  $json['message'] ?? null,
927  self::logicalOr(
928  self::identicalTo('ID was not an accessible page'),
929  self::identicalTo('Subsection was found and not accessible')
930  )
931  );
932  }
933 
938  {
939  $instructions = [
940  // no frontend user given
941  ['https://website.local/sysfolder-restricted', 0],
942  // frontend user 1
943  ['https://website.local/sysfolder-restricted', 1],
944  // frontend user 2
945  ['https://website.local/sysfolder-restricted', 2],
946  // frontend user 3
947  ['https://website.local/sysfolder-restricted', 3],
948  ];
949 
950  return $this->keysFromTemplate($instructions, '%1$s (user:%2$s)');
951  }
952 
961  {
963  'website-local',
964  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
965  );
966 
967  $response = $this->executeFrontendRequest(
968  new InternalRequest($uri),
969  $this->internalRequestContext
970  ->withFrontendUserId($frontendUserId)
971  );
972 
973  self::assertSame(
974  403,
975  $response->getStatusCode()
976  );
977  self::assertThat(
978  (string)$response->getBody(),
979  self::logicalOr(
980  self::stringContains('Reason: ID was not an accessible page'),
981  self::stringContains('Reason: Subsection was found and not accessible')
982  )
983  );
984  }
985 
994  {
996  'website-local',
997  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
998  [],
999  $this->‪buildErrorHandlingConfiguration('Fluid', [403])
1000  );
1001 
1002  $response = $this->executeFrontendRequest(
1003  new InternalRequest($uri),
1004  $this->internalRequestContext
1005  ->withFrontendUserId($frontendUserId)
1006  );
1007 
1008  self::assertSame(
1009  403,
1010  $response->getStatusCode()
1011  );
1012  self::assertStringContainsString(
1013  'reasons: code,fe_group',
1014  (string)$response->getBody()
1015  );
1016  self::assertThat(
1017  (string)$response->getBody(),
1018  self::logicalOr(
1019  self::stringContains('message: ID was not an accessible page'),
1020  self::stringContains('message: Subsection was found and not accessible')
1021  )
1022  );
1023  }
1024 
1033  {
1034  self::markTestSkipped('Skipped until PageContentErrorHandler::handlePageError does not use HTTP anymore');
1036  'website-local',
1037  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
1038  [],
1039  $this->‪buildErrorHandlingConfiguration('Page', [403])
1040  );
1041 
1042  $response = $this->executeFrontendRequest(
1043  new InternalRequest($uri),
1044  $this->internalRequestContext
1045  ->withFrontendUserId($frontendUserId)
1046  );
1047  $json = json_decode((string)$response->getBody(), true);
1048 
1049  self::assertSame(
1050  403,
1051  $response->getStatusCode()
1052  );
1053  self::assertThat(
1054  $json['body'] ?? null,
1055  self::logicalOr(
1056  self::stringContains('That page is forbidden to you'),
1057  self::stringContains('ID was not an accessible page'),
1058  self::stringContains('Subsection was found and not accessible')
1059  )
1060  );
1061  }
1062 
1071  {
1073  'website-local',
1074  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
1075  [],
1076  $this->‪buildErrorHandlingConfiguration('PHP', [403])
1077  );
1078 
1079  $response = $this->executeFrontendRequest(
1080  new InternalRequest($uri),
1081  $this->internalRequestContext
1082  ->withFrontendUserId($frontendUserId)
1083  );
1084  $json = json_decode((string)$response->getBody(), true);
1085 
1086  self::assertSame(
1087  403,
1088  $response->getStatusCode()
1089  );
1090  self::assertThat(
1091  $json['message'] ?? null,
1092  self::logicalOr(
1093  self::identicalTo('ID was not an accessible page'),
1094  self::identicalTo('Subsection was found and not accessible')
1095  )
1096  );
1097  }
1098 
1103  {
1104  $instructions = [
1105  // hidden page, always 404
1106  ['https://website.local/never-visible-working-on-it', 0],
1107  ['https://website.local/never-visible-working-on-it', 1],
1108  // hidden fe group restricted and fegroup generally okay
1109  ['https://website.local/sysfolder-restricted-hidden', 4],
1110  ];
1111 
1112  return $this->keysFromTemplate($instructions, '%1$s (user:%2$s)');
1113  }
1114 
1119  public function ‪hiddenPageSends404ResponseRegardlessOfVisitorGroup(string $uri, int $frontendUserId)
1120  {
1122  'website-local',
1123  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
1124  [],
1125  $this->‪buildErrorHandlingConfiguration('PHP', [404])
1126  );
1127 
1128  $response = $this->executeFrontendRequest(
1129  new InternalRequest($uri),
1130  $this->internalRequestContext
1131  ->withFrontendUserId($frontendUserId)
1132  );
1133  $json = json_decode((string)$response->getBody(), true);
1134 
1135  self::assertSame(
1136  404,
1137  $response->getStatusCode()
1138  );
1139  self::assertThat(
1140  $json['message'] ?? null,
1141  self::identicalTo('The requested page does not exist!')
1142  );
1143  }
1144 
1149  {
1150  $domainPaths = [
1151  'https://website.local/',
1152  ];
1153 
1154  $queries = [
1155  '',
1156  'welcome',
1157  ];
1158 
1159  $customQueries = [
1160  '?testing[value]=1',
1161  '?testing[value]=1&cHash=',
1162  '?testing[value]=1&cHash=WRONG',
1163  ];
1164 
1165  return $this->wrapInArray(
1166  $this->keysFromValues(
1167  ‪PermutationUtility::meltStringItems([$domainPaths, $queries, $customQueries])
1168  )
1169  );
1170  }
1171 
1179  {
1181  'website-local',
1182  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
1183  );
1184 
1185  $response = $this->executeFrontendRequest(
1186  new InternalRequest($uri),
1187  $this->internalRequestContext
1188  );
1189  self::assertSame(404, $response->getStatusCode());
1190  }
1191 
1199  {
1201  'website-local',
1202  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
1203  [],
1204  $this->‪buildErrorHandlingConfiguration('Fluid', [404])
1205  );
1206 
1207  $response = $this->executeFrontendRequest(
1208  new InternalRequest($uri),
1209  $this->internalRequestContext
1210  );
1211 
1212  self::assertSame(
1213  404,
1214  $response->getStatusCode()
1215  );
1216  self::assertThat(
1217  (string)$response->getBody(),
1218  self::logicalOr(
1219  self::stringContains('message: Request parameters could not be validated (&amp;cHash empty)'),
1220  self::stringContains('message: Request parameters could not be validated (&amp;cHash comparison failed)')
1221  )
1222  );
1223  }
1224 
1233  {
1234  self::markTestSkipped('Skipped until PageContentErrorHandler::handlePageError does not use HTTP anymore');
1235 
1237  'website-local',
1238  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
1239  [],
1240  $this->‪buildErrorHandlingConfiguration('Page', [404])
1241  );
1242 
1243  $response = $this->executeFrontendRequest(
1244  new InternalRequest($uri),
1245  $this->internalRequestContext
1246  );
1247 
1248  self::assertSame(
1249  404,
1250  $response->getStatusCode()
1251  );
1252  }
1253 
1261  {
1263  'website-local',
1264  $this->‪buildSiteConfiguration(1000, 'https://website.local/'),
1265  [],
1266  $this->‪buildErrorHandlingConfiguration('PHP', [404])
1267  );
1268 
1269  $response = $this->executeFrontendRequest(
1270  new InternalRequest($uri),
1271  $this->internalRequestContext
1272  );
1273  $json = json_decode((string)$response->getBody(), true);
1274 
1275  self::assertSame(
1276  404,
1277  $response->getStatusCode()
1278  );
1279  self::assertThat(
1280  $json['message'] ?? null,
1281  self::logicalOr(
1282  self::identicalTo('Request parameters could not be validated (&cHash empty)'),
1283  self::identicalTo('Request parameters could not be validated (&cHash comparison failed)')
1284  )
1285  );
1286  }
1287 
1291  public function ‪pageIsRenderedWithValidCacheHashDataProvider(): array
1292  {
1293  $domainPaths = [
1294  'https://website.local/',
1295  ];
1296 
1297  // cHash has been calculated with encryption key set to
1298  // '4408d27a916d51e624b69af3554f516dbab61037a9f7b9fd6f81b4d3bedeccb6'
1299  $queries = [
1300  // @todo Currently fails since cHash is verified after(!) redirect to page 1100
1301  // '?cHash=7d1f13fa91159dac7feb3c824936b39d',
1302  // '?cHash=7d1f13fa91159dac7feb3c824936b39d',
1303  'welcome?cHash=f42b850e435f0cedd366f5db749fc1af',
1304  ];
1305 
1306  $customQueries = [
1307  '&testing[value]=1',
1308  ];
1309 
1310  $dataSet = $this->wrapInArray(
1311  $this->keysFromValues(
1312  ‪PermutationUtility::meltStringItems([$domainPaths, $queries, $customQueries])
1313  )
1314  );
1315 
1316  return $dataSet;
1317  }
1318 
1325  public function ‪pageIsRenderedWithValidCacheHash($uri)
1326  {
1328  'website-local',
1329  $this->‪buildSiteConfiguration(1000, 'https://website.local/')
1330  );
1331 
1332  $response = $this->executeFrontendRequest(
1333  new InternalRequest($uri),
1334  $this->internalRequestContext
1335  );
1336  $responseStructure = ResponseContent::fromString(
1337  (string)$response->getBody()
1338  );
1339  self::assertSame(
1340  '1',
1341  $responseStructure->getScopePath('getpost/testing.value')
1342  );
1343  }
1344 }
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithoutHavingErrorHandling
‪restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithoutHavingErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:958
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithTrailingSlash
‪pageIsRenderedWithTrailingSlash()
Definition: SlugSiteRequestTest.php:632
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest
Definition: SlugSiteRequestTest.php:32
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderIsRendered
‪restrictedPageWithParentSysFolderIsRendered(string $uri, int $frontendUserId, string $expectedPageTitle)
Definition: SlugSiteRequestTest.php:743
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildErrorHandlingConfiguration
‪array buildErrorHandlingConfiguration(string $handler, array $codes)
Definition: SiteBasedTestTrait.php:184
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPageErrorHandling
‪restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPageErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:1030
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageRequestNotFoundInvalidCacheHashWithoutHavingErrorHandling
‪pageRequestNotFoundInvalidCacheHashWithoutHavingErrorHandling(string $uri)
Definition: SlugSiteRequestTest.php:1176
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\invalidSlugInsideSiteLanguageResultsInNotFoundResponse
‪invalidSlugInsideSiteLanguageResultsInNotFoundResponse()
Definition: SlugSiteRequestTest.php:369
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageRequestSendsNotFoundResponseWithInvalidCacheHashWithHavingPageErrorHandling
‪pageRequestSendsNotFoundResponseWithInvalidCacheHashWithHavingPageErrorHandling(string $uri)
Definition: SlugSiteRequestTest.php:1230
‪TYPO3\CMS\Core\Utility\PermutationUtility\meltStringItems
‪static array meltStringItems(array $payload, string $previousResult='')
Definition: PermutationUtility.php:36
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageIsRendered
‪restrictedPageIsRendered(string $uri, int $frontendUserId, string $expectedPageTitle)
Definition: SlugSiteRequestTest.php:692
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\setUp
‪setUp()
Definition: SlugSiteRequestTest.php:53
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithHavingFluidErrorHandling
‪restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithHavingFluidErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:833
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildLanguageConfiguration
‪array buildLanguageConfiguration(string $identifier, string $base, array $fallbackIdentifiers=[], string $fallbackType=null)
Definition: SiteBasedTestTrait.php:142
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\setUpDatabase
‪setUpDatabase()
Definition: SlugSiteRequestTest.php:73
‪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\SiteHandling\SlugSiteRequestTest\pageRenderingStopsWithInvalidCacheHashDataProvider
‪array pageRenderingStopsWithInvalidCacheHashDataProvider()
Definition: SlugSiteRequestTest.php:1146
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\AbstractTestCase
Definition: AbstractTestCase.php:29
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\requestsAreRedirectedWithoutHavingDefaultSiteLanguageDataProvider
‪array requestsAreRedirectedWithoutHavingDefaultSiteLanguageDataProvider()
Definition: SlugSiteRequestTest.php:108
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPhpErrorHandling
‪restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPhpErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:1068
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\unconfiguredTypeNumResultsIn500Error
‪unconfiguredTypeNumResultsIn500Error()
Definition: SlugSiteRequestTest.php:399
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\$internalRequestContext
‪InternalRequestContext $internalRequestContext
Definition: SlugSiteRequestTest.php:39
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithValidCacheHashDataProvider
‪array pageIsRenderedWithValidCacheHashDataProvider()
Definition: SlugSiteRequestTest.php:1289
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithPathsDataProvider
‪array pageIsRenderedWithPathsDataProvider()
Definition: SlugSiteRequestTest.php:432
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\requestsAreRedirectedWithoutHavingDefaultSiteLanguage
‪requestsAreRedirectedWithoutHavingDefaultSiteLanguage(string $uri)
Definition: SlugSiteRequestTest.php:127
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPhpErrorHandling
‪restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPhpErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:903
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildDefaultLanguageConfiguration
‪array buildDefaultLanguageConfiguration(string $identifier, string $base)
Definition: SiteBasedTestTrait.php:124
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\shortcutsAreRedirectedToDefaultSiteLanguage
‪shortcutsAreRedirectedToDefaultSiteLanguage(string $uri)
Definition: SlugSiteRequestTest.php:167
‪TYPO3\CMS\Core\Core\Bootstrap\initializeLanguageObject
‪static initializeLanguageObject()
Definition: Bootstrap.php:617
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\tearDown
‪tearDown()
Definition: SlugSiteRequestTest.php:99
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\shortcutsAreRedirectedAndRenderFirstSubPage
‪shortcutsAreRedirectedAndRenderFirstSubPage(string $uri)
Definition: SlugSiteRequestTest.php:196
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageIsRenderedDataProvider
‪array restrictedPageIsRenderedDataProvider()
Definition: SlugSiteRequestTest.php:659
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\shortcutsAreRedirectedDataProvider
‪array shortcutsAreRedirectedDataProvider()
Definition: SlugSiteRequestTest.php:148
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\shortcutsAreRedirectedToDefaultSiteLanguageWithChineseCharacterInBase
‪shortcutsAreRedirectedToDefaultSiteLanguageWithChineseCharacterInBase(string $uri)
Definition: SlugSiteRequestTest.php:255
‪TYPO3\CMS\Core\Utility\PermutationUtility
Definition: PermutationUtility.php:24
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorDataProvider
‪array restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorDataProvider()
Definition: SlugSiteRequestTest.php:935
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\tearDownAfterClass
‪static tearDownAfterClass()
Definition: SlugSiteRequestTest.php:47
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\hiddenPageSends404ResponseRegardlessOfVisitorGroup
‪hiddenPageSends404ResponseRegardlessOfVisitorGroup(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:1117
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\shortcutsAreRedirectedAndRenderFirstSubPageWithChineseCharacterInBase
‪shortcutsAreRedirectedAndRenderFirstSubPageWithChineseCharacterInBase(string $uri)
Definition: SlugSiteRequestTest.php:285
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\shortcutsAreRedirectedDataProviderWithChineseCharacterInBase
‪array shortcutsAreRedirectedDataProviderWithChineseCharacterInBase()
Definition: SlugSiteRequestTest.php:235
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithPaths
‪pageIsRenderedWithPaths(string $uri, string $expectedPageTitle)
Definition: SlugSiteRequestTest.php:465
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\invalidSiteResultsInNotFoundResponse
‪invalidSiteResultsInNotFoundResponse()
Definition: SlugSiteRequestTest.php:320
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithPathsAndChineseDefaultLanguageDataProvider
‪pageIsRenderedWithPathsAndChineseDefaultLanguageDataProvider()
Definition: SlugSiteRequestTest.php:496
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithPathsAndChineseDefaultLanguage
‪pageIsRenderedWithPathsAndChineseDefaultLanguage(string $uri, string $expectedPageTitle)
Definition: SlugSiteRequestTest.php:523
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling
Definition: AbstractTestCase.php:18
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithoutHavingErrorHandling
‪restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithoutHavingErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:800
‪TYPO3\CMS\Core\Core\Bootstrap
Definition: Bootstrap.php:66
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageRequestSendsNotFoundResponseWithInvalidCacheHashWithHavingFluidErrorHandling
‪pageRequestSendsNotFoundResponseWithInvalidCacheHashWithHavingFluidErrorHandling(string $uri)
Definition: SlugSiteRequestTest.php:1196
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildSiteConfiguration
‪array buildSiteConfiguration(int $rootPageId, string $base='')
Definition: SiteBasedTestTrait.php:109
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderIsRenderedDataProvider
‪array restrictedPageWithParentSysFolderIsRenderedDataProvider()
Definition: SlugSiteRequestTest.php:725
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorDataProvider
‪array restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorDataProvider()
Definition: SlugSiteRequestTest.php:772
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPageErrorHandling
‪restrictedPageSendsForbiddenResponseWithUnauthorizedVisitorWithHavingPageErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:873
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithValidCacheHash
‪pageIsRenderedWithValidCacheHash($uri)
Definition: SlugSiteRequestTest.php:1323
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\hiddenPageSends404ResponseRegardlessOfVisitorGroupDataProvider
‪array hiddenPageSends404ResponseRegardlessOfVisitorGroupDataProvider()
Definition: SlugSiteRequestTest.php:1100
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageRequestSendsNotFoundResponseWithInvalidCacheHashWithHavingPhpErrorHandling
‪pageRequestSendsNotFoundResponseWithInvalidCacheHashWithHavingPhpErrorHandling(string $uri)
Definition: SlugSiteRequestTest.php:1258
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\$siteTitle
‪string $siteTitle
Definition: SlugSiteRequestTest.php:35
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\invalidSlugOutsideSiteLanguageResultsInNotFoundResponse
‪invalidSlugOutsideSiteLanguageResultsInNotFoundResponse()
Definition: SlugSiteRequestTest.php:339
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\setUpBeforeClass
‪static setUpBeforeClass()
Definition: SlugSiteRequestTest.php:41
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithHavingFluidErrorHandling
‪restrictedPageWithParentSysFolderSendsForbiddenResponseWithUnauthorizedVisitorWithHavingFluidErrorHandling(string $uri, int $frontendUserId)
Definition: SlugSiteRequestTest.php:991
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithDomains
‪pageIsRenderedWithDomains(string $uri, string $expectedPageTitle)
Definition: SlugSiteRequestTest.php:594
‪TYPO3\CMS\Frontend\Tests\Functional\SiteHandling\SlugSiteRequestTest\pageIsRenderedWithDomainsDataProvider
‪array pageIsRenderedWithDomainsDataProvider()
Definition: SlugSiteRequestTest.php:560