‪TYPO3CMS  ‪main
SiteBasedTestTrait.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 
24 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\Internal\AbstractInstruction;
25 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\Internal\ArrayValueInstruction;
26 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\Internal\TypoScriptInstruction;
27 use TYPO3\TestingFramework\Core\Functional\Framework\Frontend\InternalRequest;
28 
37 {
38  protected static function ‪failIfArrayIsNotEmpty(array $items): void
39  {
40  if (empty($items)) {
41  return;
42  }
43 
44  static::fail(
45  'Array was not empty as expected, but contained these items:' . LF
46  . '* ' . implode(LF . '* ', $items)
47  );
48  }
49 
50  protected function ‪writeSiteConfiguration(
51  string ‪$identifier,
52  array $site = [],
53  array ‪$languages = [],
54  array $errorHandling = []
55  ): void {
56  $configuration = $site;
57  if (!empty(‪$languages)) {
58  $configuration['languages'] = ‪$languages;
59  }
60  if (!empty($errorHandling)) {
61  $configuration['errorHandling'] = $errorHandling;
62  }
63  $siteWriter = $this->get(SiteWriter::class);
64  try {
65  // ensure no previous site configuration influences the test
66  ‪GeneralUtility::rmdir($this->instancePath . '/typo3conf/sites/' . ‪$identifier, true);
67  $siteWriter->write(‪$identifier, $configuration);
68  } catch (\‪Exception $exception) {
69  $this->markTestSkipped($exception->getMessage());
70  }
71  }
72 
73  protected function ‪mergeSiteConfiguration(
74  string ‪$identifier,
75  array $overrides
76  ): void {
77  $siteConfiguration = $this->get(SiteConfiguration::class);
78  $siteWriter = $this->get(SiteWriter::class);
79  $configuration = $siteConfiguration->load(‪$identifier);
80  $configuration = array_merge($configuration, $overrides);
81  try {
82  $siteWriter->write(‪$identifier, $configuration);
83  } catch (\‪Exception $exception) {
84  $this->markTestSkipped($exception->getMessage());
85  }
86  }
87 
88  protected function ‪buildSiteConfiguration(
89  int $rootPageId,
90  string $base = ''
91  ): array {
92  return [
93  'rootPageId' => $rootPageId,
94  'base' => $base,
95  ];
96  }
97 
99  string ‪$identifier,
100  string $base
101  ): array {
102  $configuration = $this->buildLanguageConfiguration(‪$identifier, $base);
103  $configuration['flag'] = 'global';
104  unset($configuration['fallbackType'], $configuration['fallbacks']);
105  return $configuration;
106  }
107 
108  protected function ‪buildLanguageConfiguration(
109  string ‪$identifier,
110  string $base,
111  array $fallbackIdentifiers = [],
112  string $fallbackType = null
113  ): array {
114  $preset = $this->resolveLanguagePreset(‪$identifier);
115 
116  $configuration = [
117  'languageId' => $preset['id'],
118  'title' => $preset['title'],
119  'navigationTitle' => $preset['title'],
120  'websiteTitle' => $preset['websiteTitle'] ?? '',
121  'base' => $base,
122  'locale' => $preset['locale'],
123  'flag' => $preset['iso'] ?? '',
124  'fallbackType' => $fallbackType ?? (empty($fallbackIdentifiers) ? 'strict' : 'fallback'),
125  ];
126 
127  if (!empty($fallbackIdentifiers)) {
128  $fallbackIds = array_map(
129  function (string $fallbackIdentifier) {
130  $preset = $this->resolveLanguagePreset($fallbackIdentifier);
131  return $preset['id'];
132  },
133  $fallbackIdentifiers
134  );
135  $configuration['fallbackType'] = $fallbackType ?? 'fallback';
136  $configuration['fallbacks'] = implode(',', $fallbackIds);
137  }
138 
139  return $configuration;
140  }
141 
143  string $handler,
144  array $codes
145  ): array {
146  if ($handler === 'Page') {
147  // This implies you cannot test both 404 and 403 in the same test.
148  // Fixing that requires much deeper changes to the testing harness,
149  // as the structure here is only a portion of the config array structure.
150  if (in_array(404, $codes, true)) {
151  $baseConfiguration = [
152  'errorContentSource' => 't3://page?uid=404',
153  ];
154  } elseif (in_array(403, $codes, true)) {
155  $baseConfiguration = [
156  'errorContentSource' => 't3://page?uid=403',
157  ];
158  }
159  } elseif ($handler === 'Fluid') {
160  $baseConfiguration = [
161  'errorFluidTemplate' => 'typo3/sysext/core/Tests/Functional/Fixtures/Frontend/FluidError.html',
162  'errorFluidTemplatesRootPath' => '',
163  'errorFluidLayoutsRootPath' => '',
164  'errorFluidPartialsRootPath' => '',
165  ];
166  } elseif ($handler === 'PHP') {
167  $baseConfiguration = [
168  'errorPhpClassFQCN' => PhpError::class,
169  ];
170  } else {
171  throw new \LogicException(
172  sprintf('Invalid handler "%s"', $handler),
173  1533894782
174  );
175  }
176 
177  $baseConfiguration['errorHandler'] = $handler;
178 
179  return array_map(
180  static function (int $code) use ($baseConfiguration) {
181  $baseConfiguration['errorCode'] = $code;
182  return $baseConfiguration;
183  },
184  $codes
185  );
186  }
187 
191  protected function ‪resolveLanguagePreset(string ‪$identifier)
192  {
193  if (!isset(static::LANGUAGE_PRESETS[‪$identifier])) {
194  throw new \LogicException(
195  sprintf('Undefined preset identifier "%s"', ‪$identifier),
196  1533893665
197  );
198  }
199  return static::LANGUAGE_PRESETS[‪$identifier];
200  }
201 
205  protected function ‪applyInstructions(InternalRequest $request, AbstractInstruction ...$instructions): InternalRequest
206  {
207  $modifiedInstructions = [];
208 
209  foreach ($instructions as $instruction) {
210  ‪$identifier = $instruction->getIdentifier();
211  if (isset($modifiedInstructions[‪$identifier]) || $request->getInstruction(‪$identifier) !== null) {
212  $modifiedInstructions[‪$identifier] = $this->mergeInstruction(
213  $modifiedInstructions[‪$identifier] ?? $request->getInstruction(‪$identifier),
214  $instruction
215  );
216  } else {
217  $modifiedInstructions[‪$identifier] = $instruction;
218  }
219  }
220 
221  return $request->withInstructions($modifiedInstructions);
222  }
223 
224  protected function ‪mergeInstruction(AbstractInstruction $current, AbstractInstruction $other): AbstractInstruction
225  {
226  if (get_class($current) !== get_class($other)) {
227  throw new \LogicException('Cannot merge different instruction types', 1565863174);
228  }
229 
230  if ($current instanceof TypoScriptInstruction) {
232  $typoScript = array_replace_recursive(
233  $current->getTypoScript() ?? [],
234  $other->getTypoScript() ?? []
235  );
236  $constants = array_replace_recursive(
237  $current->getConstants() ?? [],
238  $other->getConstants() ?? []
239  );
240  if ($typoScript !== []) {
241  $current = $current->withTypoScript($typoScript);
242  }
243  if ($constants !== []) {
244  $current = $current->withConstants($constants);
245  }
246  return $current;
247  }
248 
249  if ($current instanceof ArrayValueInstruction) {
251  $array = array_merge_recursive($current->getArray(), $other->getArray());
252  return $current->withArray($array);
253  }
254 
255  return $current;
256  }
257 }
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\failIfArrayIsNotEmpty
‪static failIfArrayIsNotEmpty(array $items)
Definition: SiteBasedTestTrait.php:38
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildLanguageConfiguration
‪buildLanguageConfiguration(string $identifier, string $base, array $fallbackIdentifiers=[], string $fallbackType=null)
Definition: SiteBasedTestTrait.php:108
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling
Definition: SiteBasedTestTrait.php:18
‪TYPO3\CMS\Core\Tests\Functional\Fixtures\Frontend\PhpError
Definition: PhpError.php:29
‪TYPO3\CMS\Core\Exception
Definition: Exception.php:21
‪$languages
‪$languages
Definition: updateIsoDatabase.php:104
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait
Definition: SiteBasedTestTrait.php:37
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\writeSiteConfiguration
‪writeSiteConfiguration(string $identifier, array $site=[], array $languages=[], array $errorHandling=[])
Definition: SiteBasedTestTrait.php:50
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildSiteConfiguration
‪buildSiteConfiguration(int $rootPageId, string $base='')
Definition: SiteBasedTestTrait.php:88
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\mergeInstruction
‪mergeInstruction(AbstractInstruction $current, AbstractInstruction $other)
Definition: SiteBasedTestTrait.php:224
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\applyInstructions
‪applyInstructions(InternalRequest $request, AbstractInstruction ... $instructions)
Definition: SiteBasedTestTrait.php:205
‪TYPO3\CMS\Core\Configuration\SiteConfiguration
Definition: SiteConfiguration.php:47
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildErrorHandlingConfiguration
‪buildErrorHandlingConfiguration(string $handler, array $codes)
Definition: SiteBasedTestTrait.php:142
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\resolveLanguagePreset
‪mixed resolveLanguagePreset(string $identifier)
Definition: SiteBasedTestTrait.php:191
‪TYPO3\CMS\Core\Utility\GeneralUtility\rmdir
‪static bool rmdir(string $path, bool $removeNonEmpty=false)
Definition: GeneralUtility.php:1702
‪TYPO3\CMS\Core\Configuration\SiteWriter
Definition: SiteWriter.php:39
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\buildDefaultLanguageConfiguration
‪buildDefaultLanguageConfiguration(string $identifier, string $base)
Definition: SiteBasedTestTrait.php:98
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Tests\Functional\SiteHandling\SiteBasedTestTrait\mergeSiteConfiguration
‪mergeSiteConfiguration(string $identifier, array $overrides)
Definition: SiteBasedTestTrait.php:73
‪TYPO3\CMS\Webhooks\Message\$identifier
‪identifier readonly string $identifier
Definition: FileAddedMessage.php:37