‪TYPO3CMS  ‪main
ConfigurationManagerTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
20 use PHPUnit\Framework\Attributes\Test;
21 use PHPUnit\Framework\MockObject\MockObject;
22 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
26 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
27 
28 final class ‪ConfigurationManagerTest extends UnitTestCase
29 {
30  protected ConfigurationManager&MockObject ‪$subject;
31 
32  protected function ‪setUp(): void
33  {
34  parent::setUp();
36  [
37  'getDefaultConfigurationFileLocation',
38  'getSystemConfigurationFileLocation',
39  ]
40  );
41  }
42 
47  protected function ‪getTestDirectory(string $prefix = 'root_'): string
48  {
49  $path = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId($prefix);
51  $this->testFilesToDelete[] = $path;
52  return $path;
53  }
54 
55  protected function ‪createSubjectWithMockedMethods(array $methods): void
56  {
57  $this->subject = $this->getMockBuilder(ConfigurationManager::class)
58  ->onlyMethods($methods)
59  ->getMock();
60  }
61 
62  #[Test]
64  {
65  $this->expectException(\RuntimeException::class);
66  $this->expectExceptionCode(1310203814);
67 
68  $defaultConfigurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('defaultConfiguration');
69  file_put_contents(
70  $defaultConfigurationFile,
71  '<?php throw new \RuntimeException(\'foo\', 1310203814); ?>'
72  );
73 
74  $this->subject
75  ->expects(self::once())
76  ->method('getDefaultConfigurationFileLocation')
77  ->willReturn($defaultConfigurationFile);
78  $this->subject->getDefaultConfiguration();
79  }
80 
81  #[Test]
83  {
84  $this->expectException(\RuntimeException::class);
85 
86  $configurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('localConfiguration');
87  file_put_contents(
88  $configurationFile,
89  '<?php throw new \RuntimeException(\'foo\', 1310203815); ?>'
90  );
91 
92  $this->subject
93  ->expects(self::once())
94  ->method('getSystemConfigurationFileLocation')
95  ->willReturn($configurationFile);
96  $this->subject->getLocalConfiguration();
97  }
98 
99  #[Test]
101  {
102  $currentLocalConfiguration = [
103  'notChanged' => 23,
104  'changed' => 'unChanged',
105  ];
106  $overrideConfiguration = [
107  'changed' => 'changed',
108  'new' => 'new',
109  ];
110  $expectedConfiguration = [
111  'notChanged' => 23,
112  'changed' => 'changed',
113  'new' => 'new',
114  ];
115 
117  [
118  'getLocalConfiguration',
119  'writeLocalConfiguration',
120  ]
121  );
122  $this->subject->expects(self::once())
123  ->method('getLocalConfiguration')
124  ->willReturn($currentLocalConfiguration);
125  $this->subject->expects(self::once())
126  ->method('writeLocalConfiguration')
127  ->with($expectedConfiguration);
128 
129  $this->subject->updateLocalConfiguration($overrideConfiguration);
130  }
131 
132  #[Test]
134  {
136  [
137  'getDefaultConfiguration',
138  ]
139  );
140  $this->subject->expects(self::once())
141  ->method('getDefaultConfiguration')
142  ->willReturn(
143  [
144  'path' => 'value',
145  ]
146  );
147 
148  self::assertSame('value', $this->subject->getDefaultConfigurationValueByPath('path'));
149  }
150 
151  #[Test]
153  {
155  [
156  'getLocalConfiguration',
157  ]
158  );
159  $this->subject->expects(self::once())
160  ->method('getLocalConfiguration')
161  ->willReturn(
162  [
163  'path' => 'value',
164  ]
165  );
166 
167  self::assertSame('value', $this->subject->getLocalConfigurationValueByPath('path'));
168  }
169 
170  #[Test]
172  {
174  [
175  'getDefaultConfiguration',
176  'getLocalConfiguration',
177  ]
178  );
179  $this->subject->expects(self::once())
180  ->method('getDefaultConfiguration')
181  ->willReturn(
182  [
183  'path' => 'value',
184  ]
185  );
186  $this->subject->expects(self::once())
187  ->method('getLocalConfiguration')
188  ->willReturn(
189  [
190  'path' => 'valueOverride',
191  ]
192  );
193 
194  self::assertSame('valueOverride', $this->subject->getConfigurationValueByPath('path'));
195  }
196 
197  #[Test]
199  {
201  'isValidLocalConfigurationPath',
202  ]);
203  $this->subject->expects(self::once())
204  ->method('isValidLocalConfigurationPath')
205  ->willReturn(false);
206 
207  self::assertFalse($this->subject->setLocalConfigurationValueByPath('path', 'value'));
208  }
209 
210  #[Test]
212  {
213  $currentLocalConfiguration = [
214  'notChanged' => 23,
215  'toUpdate' => 'notUpdated',
216  ];
217  $expectedConfiguration = [
218  'notChanged' => 23,
219  'toUpdate' => 'updated',
220  ];
221 
223  [
224  'isValidLocalConfigurationPath',
225  'getLocalConfiguration',
226  'writeLocalConfiguration',
227  ]
228  );
229  $this->subject->expects(self::once())
230  ->method('isValidLocalConfigurationPath')
231  ->willReturn(true);
232  $this->subject->expects(self::once())
233  ->method('getLocalConfiguration')
234  ->willReturn($currentLocalConfiguration);
235  $this->subject->expects(self::once())
236  ->method('writeLocalConfiguration')
237  ->with($expectedConfiguration);
238 
239  $this->subject->setLocalConfigurationValueByPath('toUpdate', 'updated');
240  }
241 
242  #[Test]
244  {
245  $currentLocalConfiguration = [
246  'notChanged' => 23,
247  'toUpdate' => 'notUpdated',
248  ];
249  $expectedConfiguration = [
250  'notChanged' => 23,
251  'toUpdate' => 'updated',
252  'new' => 'new',
253  ];
254 
256  [
257  'isValidLocalConfigurationPath',
258  'getLocalConfiguration',
259  'writeLocalConfiguration',
260  ]
261  );
262  $this->subject
263  ->method('isValidLocalConfigurationPath')
264  ->willReturn(true);
265  $this->subject->expects(self::once())
266  ->method('getLocalConfiguration')
267  ->willReturn($currentLocalConfiguration);
268  $this->subject->expects(self::once())
269  ->method('writeLocalConfiguration')
270  ->with($expectedConfiguration);
271 
272  $pairs = [
273  'toUpdate' => 'updated',
274  'new' => 'new',
275  ];
276  $this->subject->setLocalConfigurationValuesByPathValuePairs($pairs);
277  }
278 
279  #[Test]
281  {
282  $currentLocalConfiguration = [
283  'toRemove1' => 'foo',
284  'notChanged' => 23,
285  'toRemove2' => 'bar',
286  ];
287  $expectedConfiguration = [
288  'notChanged' => 23,
289  ];
290 
292  [
293  'getLocalConfiguration',
294  'writeLocalConfiguration',
295  ]
296  );
297  $this->subject->expects(self::once())
298  ->method('getLocalConfiguration')
299  ->willReturn($currentLocalConfiguration);
300  $this->subject->expects(self::once())
301  ->method('writeLocalConfiguration')
302  ->with($expectedConfiguration);
303 
304  $removePaths = [
305  'toRemove1',
306  'toRemove2',
307  ];
308  self::assertTrue($this->subject->removeLocalConfigurationKeysByPath($removePaths));
309  }
310 
311  #[Test]
313  {
314  $currentLocalConfiguration = [
315  'notChanged' => 23,
316  ];
318  [
319  'getLocalConfiguration',
320  'writeLocalConfiguration',
321  ]
322  );
323  $this->subject->expects(self::once())
324  ->method('getLocalConfiguration')
325  ->willReturn($currentLocalConfiguration);
326  $this->subject->expects(self::never())
327  ->method('writeLocalConfiguration');
328 
329  $removeNothing = [];
330  self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNothing));
331  }
332 
333  #[Test]
335  {
336  $currentLocalConfiguration = [
337  'notChanged' => 23,
338  ];
340  [
341  'getLocalConfiguration',
342  'writeLocalConfiguration',
343  ]
344  );
345  $this->subject->expects(self::once())
346  ->method('getLocalConfiguration')
347  ->willReturn($currentLocalConfiguration);
348  $this->subject->expects(self::never())
349  ->method('writeLocalConfiguration');
350 
351  $removeNonExisting = ['notPresent'];
352  self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNonExisting));
353  }
354 
355  #[Test]
357  {
358  $directory = ‪StringUtility::getUniqueId('test_');
359  $absoluteDirectory = $this->‪getTestDirectory() . '/' . $directory;
360  mkdir($absoluteDirectory);
361 
362  $file = ‪StringUtility::getUniqueId('test_');
363  $absoluteFile1 = $absoluteDirectory . '/' . $file;
364  touch($absoluteFile1);
365  clearstatcache();
366  $this->subject
367  ->method('getSystemConfigurationFileLocation')
368  ->willReturn($absoluteFile1);
369 
370  $result = $this->subject->canWriteConfiguration();
371 
372  self::assertTrue($result);
373  }
374 
375  #[Test]
377  {
378  $configurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('localConfiguration');
379  if (!is_file($configurationFile)) {
380  if (!$fh = fopen($configurationFile, 'wb')) {
381  self::markTestSkipped('Can not create file ' . $configurationFile . '. Please check your write permissions.');
382  }
383  fclose($fh);
384  }
385 
386  if (!@is_file($configurationFile)) {
387  throw new \RuntimeException(
388  'File ' . $configurationFile . ' could not be found. Please check your write permissions',
389  1346364362
390  );
391  }
392 
393  $this->subject
394  ->method('getSystemConfigurationFileLocation')
395  ->willReturn($configurationFile);
396 
397  $pairs = [
398  'foo' => 42,
399  'bar' => 23,
400  ];
401  $expectedContent =
402  '<?php' . LF .
403  'return [' . LF .
404  ' \'bar\' => 23,' . LF .
405  ' \'foo\' => 42,' . LF .
406  '];' . LF;
407 
408  $this->subject->writeLocalConfiguration($pairs);
409  self::assertSame($expectedContent, file_get_contents($configurationFile));
410  }
411 
412  #[Test]
414  {
415  $this->expectException(\RuntimeException::class);
416 
417  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['getSystemConfigurationFileLocation']);
418 
419  $file = ‪StringUtility::getUniqueId('test_');
420  $absoluteFile = $this->‪getTestDirectory() . '/' . $file;
421  touch($absoluteFile);
422  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn($absoluteFile);
423  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
424  }
425 
426  #[Test]
428  {
429  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation']);
430  $localConfigurationFile = '/tests/' . ‪StringUtility::getUniqueId('dummy_');
431  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn(‪Environment::getVarPath() . '/' . $localConfigurationFile);
432 
433  $factoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
434  $factoryConfigurationAbsoluteFile = $this->‪getTestDirectory() . '/' . $factoryConfigurationFile;
435  ‪$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
436  $uniqueContentString = ‪StringUtility::getUniqueId('string_');
437  $validFactoryConfigurationFileContent =
438  '<?php' . LF .
439  'return [' . LF .
440  '\'' . $uniqueContentString . '\' => \'foo\',' . LF .
441  '];' . LF;
442  file_put_contents(
443  $factoryConfigurationAbsoluteFile,
444  $validFactoryConfigurationFileContent
445  );
446 
447  ‪$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);
448 
450  ->expects(self::once())
451  ->method('writeLocalConfiguration')
452  ->with(self::arrayHasKey($uniqueContentString));
453  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
454  }
455 
456  #[Test]
458  {
459  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation', 'getAdditionalFactoryConfigurationFileLocation']);
460  $testDirectory = $this->‪getTestDirectory() . '/';
461  $localConfigurationFile = $testDirectory . ‪StringUtility::getUniqueId('dummy_');
462  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn($localConfigurationFile);
463 
464  $factoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
465  $factoryConfigurationAbsoluteFile = $testDirectory . $factoryConfigurationFile;
466  ‪$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
467  $validFactoryConfigurationFileContent =
468  '<?php' . LF .
469  'return [];' . LF;
470  file_put_contents(
471  $factoryConfigurationAbsoluteFile,
472  $validFactoryConfigurationFileContent
473  );
474  ‪$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);
475 
476  $additionalFactoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
477  $additionalFactoryConfigurationAbsoluteFile = $testDirectory . $additionalFactoryConfigurationFile;
478  ‪$subject->method('getAdditionalFactoryConfigurationFileLocation')->willReturn($additionalFactoryConfigurationAbsoluteFile);
479  $uniqueContentString = ‪StringUtility::getUniqueId('string_');
480  $validAdditionalFactoryConfigurationFileContent =
481  '<?php' . LF .
482  'return [' . LF .
483  '\'' . $uniqueContentString . '\' => \'foo\',' . LF .
484  '];' . LF;
485  file_put_contents(
486  $additionalFactoryConfigurationAbsoluteFile,
487  $validAdditionalFactoryConfigurationFileContent
488  );
489  ‪$subject->_set('additionalFactoryConfigurationFile', $additionalFactoryConfigurationFile);
490 
492  ->expects(self::once())
493  ->method('writeLocalConfiguration')
494  ->with(self::arrayHasKey($uniqueContentString));
495  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
496  }
497 
498  #[Test]
500  {
501  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, null);
502  ‪$subject->_set('allowedSettingsPaths', ['foo/bar']);
503  self::assertTrue(‪$subject->_call('isValidLocalConfigurationPath', 'foo/bar/baz'));
504  }
505 
506  #[Test]
508  {
509  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, null);
510  ‪$subject->_set('allowedSettingsPaths', ['foo/bar']);
511  self::assertFalse(‪$subject->_call('isValidLocalConfigurationPath', 'bar/baz'));
512  }
513 }
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createSubjectWithMockedMethods
‪createSubjectWithMockedMethods(array $methods)
Definition: ConfigurationManagerTest.php:55
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getSystemConfigurationExecutesDefinedConfigurationFile
‪getSystemConfigurationExecutesDefinedConfigurationFile()
Definition: ConfigurationManagerTest.php:82
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved
‪removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved()
Definition: ConfigurationManagerTest.php:312
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs
‪setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs()
Definition: ConfigurationManagerTest.php:243
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\writeLocalConfigurationWritesSortedContentToConfigurationFile
‪writeLocalConfigurationWritesSortedContentToConfigurationFile()
Definition: ConfigurationManagerTest.php:376
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable
‪canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable()
Definition: ConfigurationManagerTest.php:356
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getDefaultConfigurationExecutesDefinedDefaultConfigurationFile
‪getDefaultConfigurationExecutesDefinedDefaultConfigurationFile()
Definition: ConfigurationManagerTest.php:63
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\$subject
‪ConfigurationManager &MockObject $subject
Definition: ConfigurationManagerTest.php:30
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep(string $directory)
Definition: GeneralUtility.php:1654
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists
‪createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists()
Definition: ConfigurationManagerTest.php:413
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\updateLocalConfigurationWritesNewMergedLocalConfigurationArray
‪updateLocalConfigurationWritesNewMergedLocalConfigurationArray()
Definition: ConfigurationManagerTest.php:100
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved
‪removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved()
Definition: ConfigurationManagerTest.php:334
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getDefaultConfigurationValueByPathReturnsCorrectValue
‪getDefaultConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:133
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getConfigurationValueByPathReturnsCorrectValue
‪getConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:171
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile
‪createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile()
Definition: ConfigurationManagerTest.php:427
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid
‪setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid()
Definition: ConfigurationManagerTest.php:198
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValueByPathUpdatesValueDefinedByPath
‪setLocalConfigurationValueByPathUpdatesValueDefinedByPath()
Definition: ConfigurationManagerTest.php:211
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue
‪removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue()
Definition: ConfigurationManagerTest.php:280
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setUp
‪setUp()
Definition: ConfigurationManagerTest.php:32
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile
‪createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile()
Definition: ConfigurationManagerTest.php:457
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getTestDirectory
‪getTestDirectory(string $prefix='root_')
Definition: ConfigurationManagerTest.php:47
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\isValidLocalConfigurationPathDeniesNotAllowedPath
‪isValidLocalConfigurationPathDeniesNotAllowedPath()
Definition: ConfigurationManagerTest.php:507
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\isValidLocalConfigurationPathAcceptsAllowedPath
‪isValidLocalConfigurationPathAcceptsAllowedPath()
Definition: ConfigurationManagerTest.php:499
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57
‪TYPO3\CMS\Core\Tests\Unit\Configuration
Definition: CKEditor5MigratorTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getLocalConfigurationValueByPathReturnsCorrectValue
‪getLocalConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:152
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest
Definition: ConfigurationManagerTest.php:29