‪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\MockObject\MockObject;
21 use TYPO3\CMS\Core\Configuration\ConfigurationManager;
25 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
26 
27 final class ‪ConfigurationManagerTest extends UnitTestCase
28 {
29  protected ConfigurationManager&MockObject ‪$subject;
30 
31  protected function ‪setUp(): void
32  {
33  parent::setUp();
35  [
36  'getDefaultConfigurationFileLocation',
37  'getSystemConfigurationFileLocation',
38  ]
39  );
40  }
41 
46  protected function ‪getTestDirectory(string $prefix = 'root_'): string
47  {
48  $path = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId($prefix);
50  $this->testFilesToDelete[] = $path;
51  return $path;
52  }
53 
54  protected function ‪createSubjectWithMockedMethods(array $methods): void
55  {
56  $this->subject = $this->getMockBuilder(ConfigurationManager::class)
57  ->onlyMethods($methods)
58  ->getMock();
59  }
60 
65  {
66  $this->expectException(\RuntimeException::class);
67  $this->expectExceptionCode(1310203814);
68 
69  $defaultConfigurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('defaultConfiguration');
70  file_put_contents(
71  $defaultConfigurationFile,
72  '<?php throw new \RuntimeException(\'foo\', 1310203814); ?>'
73  );
74 
75  $this->subject
76  ->expects(self::once())
77  ->method('getDefaultConfigurationFileLocation')
78  ->willReturn($defaultConfigurationFile);
79  $this->subject->getDefaultConfiguration();
80  }
81 
86  {
87  $this->expectException(\RuntimeException::class);
88 
89  $configurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('localConfiguration');
90  file_put_contents(
91  $configurationFile,
92  '<?php throw new \RuntimeException(\'foo\', 1310203815); ?>'
93  );
94 
95  $this->subject
96  ->expects(self::once())
97  ->method('getSystemConfigurationFileLocation')
98  ->willReturn($configurationFile);
99  $this->subject->getLocalConfiguration();
100  }
101 
106  {
107  $currentLocalConfiguration = [
108  'notChanged' => 23,
109  'changed' => 'unChanged',
110  ];
111  $overrideConfiguration = [
112  'changed' => 'changed',
113  'new' => 'new',
114  ];
115  $expectedConfiguration = [
116  'notChanged' => 23,
117  'changed' => 'changed',
118  'new' => 'new',
119  ];
120 
122  [
123  'getLocalConfiguration',
124  'writeLocalConfiguration',
125  ]
126  );
127  $this->subject->expects(self::once())
128  ->method('getLocalConfiguration')
129  ->willReturn($currentLocalConfiguration);
130  $this->subject->expects(self::once())
131  ->method('writeLocalConfiguration')
132  ->with($expectedConfiguration);
133 
134  $this->subject->updateLocalConfiguration($overrideConfiguration);
135  }
136 
141  {
143  [
144  'getDefaultConfiguration',
145  ]
146  );
147  $this->subject->expects(self::once())
148  ->method('getDefaultConfiguration')
149  ->willReturn(
150  [
151  'path' => 'value',
152  ]
153  );
154 
155  self::assertSame('value', $this->subject->getDefaultConfigurationValueByPath('path'));
156  }
157 
162  {
164  [
165  'getLocalConfiguration',
166  ]
167  );
168  $this->subject->expects(self::once())
169  ->method('getLocalConfiguration')
170  ->willReturn(
171  [
172  'path' => 'value',
173  ]
174  );
175 
176  self::assertSame('value', $this->subject->getLocalConfigurationValueByPath('path'));
177  }
178 
183  {
185  [
186  'getDefaultConfiguration',
187  'getLocalConfiguration',
188  ]
189  );
190  $this->subject->expects(self::once())
191  ->method('getDefaultConfiguration')
192  ->willReturn(
193  [
194  'path' => 'value',
195  ]
196  );
197  $this->subject->expects(self::once())
198  ->method('getLocalConfiguration')
199  ->willReturn(
200  [
201  'path' => 'valueOverride',
202  ]
203  );
204 
205  self::assertSame('valueOverride', $this->subject->getConfigurationValueByPath('path'));
206  }
207 
212  {
214  'isValidLocalConfigurationPath',
215  ]);
216  $this->subject->expects(self::once())
217  ->method('isValidLocalConfigurationPath')
218  ->willReturn(false);
219 
220  self::assertFalse($this->subject->setLocalConfigurationValueByPath('path', 'value'));
221  }
222 
227  {
228  $currentLocalConfiguration = [
229  'notChanged' => 23,
230  'toUpdate' => 'notUpdated',
231  ];
232  $expectedConfiguration = [
233  'notChanged' => 23,
234  'toUpdate' => 'updated',
235  ];
236 
238  [
239  'isValidLocalConfigurationPath',
240  'getLocalConfiguration',
241  'writeLocalConfiguration',
242  ]
243  );
244  $this->subject->expects(self::once())
245  ->method('isValidLocalConfigurationPath')
246  ->willReturn(true);
247  $this->subject->expects(self::once())
248  ->method('getLocalConfiguration')
249  ->willReturn($currentLocalConfiguration);
250  $this->subject->expects(self::once())
251  ->method('writeLocalConfiguration')
252  ->with($expectedConfiguration);
253 
254  $this->subject->setLocalConfigurationValueByPath('toUpdate', 'updated');
255  }
256 
261  {
262  $currentLocalConfiguration = [
263  'notChanged' => 23,
264  'toUpdate' => 'notUpdated',
265  ];
266  $expectedConfiguration = [
267  'notChanged' => 23,
268  'toUpdate' => 'updated',
269  'new' => 'new',
270  ];
271 
273  [
274  'isValidLocalConfigurationPath',
275  'getLocalConfiguration',
276  'writeLocalConfiguration',
277  ]
278  );
279  $this->subject
280  ->method('isValidLocalConfigurationPath')
281  ->willReturn(true);
282  $this->subject->expects(self::once())
283  ->method('getLocalConfiguration')
284  ->willReturn($currentLocalConfiguration);
285  $this->subject->expects(self::once())
286  ->method('writeLocalConfiguration')
287  ->with($expectedConfiguration);
288 
289  $pairs = [
290  'toUpdate' => 'updated',
291  'new' => 'new',
292  ];
293  $this->subject->setLocalConfigurationValuesByPathValuePairs($pairs);
294  }
295 
300  {
301  $currentLocalConfiguration = [
302  'toRemove1' => 'foo',
303  'notChanged' => 23,
304  'toRemove2' => 'bar',
305  ];
306  $expectedConfiguration = [
307  'notChanged' => 23,
308  ];
309 
311  [
312  'getLocalConfiguration',
313  'writeLocalConfiguration',
314  ]
315  );
316  $this->subject->expects(self::once())
317  ->method('getLocalConfiguration')
318  ->willReturn($currentLocalConfiguration);
319  $this->subject->expects(self::once())
320  ->method('writeLocalConfiguration')
321  ->with($expectedConfiguration);
322 
323  $removePaths = [
324  'toRemove1',
325  'toRemove2',
326  ];
327  self::assertTrue($this->subject->removeLocalConfigurationKeysByPath($removePaths));
328  }
329 
334  {
335  $currentLocalConfiguration = [
336  'notChanged' => 23,
337  ];
339  [
340  'getLocalConfiguration',
341  'writeLocalConfiguration',
342  ]
343  );
344  $this->subject->expects(self::once())
345  ->method('getLocalConfiguration')
346  ->willReturn($currentLocalConfiguration);
347  $this->subject->expects(self::never())
348  ->method('writeLocalConfiguration');
349 
350  $removeNothing = [];
351  self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNothing));
352  }
353 
358  {
359  $currentLocalConfiguration = [
360  'notChanged' => 23,
361  ];
363  [
364  'getLocalConfiguration',
365  'writeLocalConfiguration',
366  ]
367  );
368  $this->subject->expects(self::once())
369  ->method('getLocalConfiguration')
370  ->willReturn($currentLocalConfiguration);
371  $this->subject->expects(self::never())
372  ->method('writeLocalConfiguration');
373 
374  $removeNonExisting = ['notPresent'];
375  self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNonExisting));
376  }
377 
382  {
383  $directory = ‪StringUtility::getUniqueId('test_');
384  $absoluteDirectory = $this->‪getTestDirectory() . '/' . $directory;
385  mkdir($absoluteDirectory);
386 
387  $file = ‪StringUtility::getUniqueId('test_');
388  $absoluteFile1 = $absoluteDirectory . '/' . $file;
389  touch($absoluteFile1);
390  clearstatcache();
391  $this->subject
392  ->method('getSystemConfigurationFileLocation')
393  ->willReturn($absoluteFile1);
394 
395  $result = $this->subject->canWriteConfiguration();
396 
397  self::assertTrue($result);
398  }
399 
404  {
405  $configurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('localConfiguration');
406  if (!is_file($configurationFile)) {
407  if (!$fh = fopen($configurationFile, 'wb')) {
408  self::markTestSkipped('Can not create file ' . $configurationFile . '. Please check your write permissions.');
409  }
410  fclose($fh);
411  }
412 
413  if (!@is_file($configurationFile)) {
414  throw new \RuntimeException(
415  'File ' . $configurationFile . ' could not be found. Please check your write permissions',
416  1346364362
417  );
418  }
419 
420  $this->subject
421  ->method('getSystemConfigurationFileLocation')
422  ->willReturn($configurationFile);
423 
424  $pairs = [
425  'foo' => 42,
426  'bar' => 23,
427  ];
428  $expectedContent =
429  '<?php' . LF .
430  'return [' . LF .
431  ' \'bar\' => 23,' . LF .
432  ' \'foo\' => 42,' . LF .
433  '];' . LF;
434 
435  $this->subject->writeLocalConfiguration($pairs);
436  self::assertSame($expectedContent, file_get_contents($configurationFile));
437  }
438 
443  {
444  $this->expectException(\RuntimeException::class);
445 
446  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['getSystemConfigurationFileLocation']);
447 
448  $file = ‪StringUtility::getUniqueId('test_');
449  $absoluteFile = $this->‪getTestDirectory() . '/' . $file;
450  touch($absoluteFile);
451  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn($absoluteFile);
452  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
453  }
454 
459  {
460  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation']);
461  $localConfigurationFile = '/tests/' . ‪StringUtility::getUniqueId('dummy_');
462  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn(‪Environment::getVarPath() . '/' . $localConfigurationFile);
463 
464  $factoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
465  $factoryConfigurationAbsoluteFile = $this->‪getTestDirectory() . '/' . $factoryConfigurationFile;
466  ‪$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
467  $uniqueContentString = ‪StringUtility::getUniqueId('string_');
468  $validFactoryConfigurationFileContent =
469  '<?php' . LF .
470  'return [' . LF .
471  '\'' . $uniqueContentString . '\' => \'foo\',' . LF .
472  '];' . LF;
473  file_put_contents(
474  $factoryConfigurationAbsoluteFile,
475  $validFactoryConfigurationFileContent
476  );
477 
478  ‪$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);
479 
481  ->expects(self::once())
482  ->method('writeLocalConfiguration')
483  ->with(self::arrayHasKey($uniqueContentString));
484  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
485  }
486 
491  {
492  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation', 'getAdditionalFactoryConfigurationFileLocation']);
493  $testDirectory = $this->‪getTestDirectory() . '/';
494  $localConfigurationFile = $testDirectory . ‪StringUtility::getUniqueId('dummy_');
495  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn($localConfigurationFile);
496 
497  $factoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
498  $factoryConfigurationAbsoluteFile = $testDirectory . $factoryConfigurationFile;
499  ‪$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
500  $validFactoryConfigurationFileContent =
501  '<?php' . LF .
502  'return [];' . LF;
503  file_put_contents(
504  $factoryConfigurationAbsoluteFile,
505  $validFactoryConfigurationFileContent
506  );
507  ‪$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);
508 
509  $additionalFactoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
510  $additionalFactoryConfigurationAbsoluteFile = $testDirectory . $additionalFactoryConfigurationFile;
511  ‪$subject->method('getAdditionalFactoryConfigurationFileLocation')->willReturn($additionalFactoryConfigurationAbsoluteFile);
512  $uniqueContentString = ‪StringUtility::getUniqueId('string_');
513  $validAdditionalFactoryConfigurationFileContent =
514  '<?php' . LF .
515  'return [' . LF .
516  '\'' . $uniqueContentString . '\' => \'foo\',' . LF .
517  '];' . LF;
518  file_put_contents(
519  $additionalFactoryConfigurationAbsoluteFile,
520  $validAdditionalFactoryConfigurationFileContent
521  );
522  ‪$subject->_set('additionalFactoryConfigurationFile', $additionalFactoryConfigurationFile);
523 
525  ->expects(self::once())
526  ->method('writeLocalConfiguration')
527  ->with(self::arrayHasKey($uniqueContentString));
528  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
529  }
530 
535  {
536  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, null);
537  ‪$subject->_set('allowedSettingsPaths', ['foo/bar']);
538  self::assertTrue(‪$subject->_call('isValidLocalConfigurationPath', 'foo/bar/baz'));
539  }
540 
545  {
546  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, null);
547  ‪$subject->_set('allowedSettingsPaths', ['foo/bar']);
548  self::assertFalse(‪$subject->_call('isValidLocalConfigurationPath', 'bar/baz'));
549  }
550 }
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createSubjectWithMockedMethods
‪createSubjectWithMockedMethods(array $methods)
Definition: ConfigurationManagerTest.php:54
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getSystemConfigurationExecutesDefinedConfigurationFile
‪getSystemConfigurationExecutesDefinedConfigurationFile()
Definition: ConfigurationManagerTest.php:85
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved
‪removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved()
Definition: ConfigurationManagerTest.php:333
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs
‪setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs()
Definition: ConfigurationManagerTest.php:260
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\writeLocalConfigurationWritesSortedContentToConfigurationFile
‪writeLocalConfigurationWritesSortedContentToConfigurationFile()
Definition: ConfigurationManagerTest.php:403
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable
‪canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable()
Definition: ConfigurationManagerTest.php:381
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getDefaultConfigurationExecutesDefinedDefaultConfigurationFile
‪getDefaultConfigurationExecutesDefinedDefaultConfigurationFile()
Definition: ConfigurationManagerTest.php:64
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\$subject
‪ConfigurationManager &MockObject $subject
Definition: ConfigurationManagerTest.php:29
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists
‪createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists()
Definition: ConfigurationManagerTest.php:442
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\updateLocalConfigurationWritesNewMergedLocalConfigurationArray
‪updateLocalConfigurationWritesNewMergedLocalConfigurationArray()
Definition: ConfigurationManagerTest.php:105
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved
‪removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved()
Definition: ConfigurationManagerTest.php:357
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1638
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getDefaultConfigurationValueByPathReturnsCorrectValue
‪getDefaultConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:140
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getConfigurationValueByPathReturnsCorrectValue
‪getConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:182
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile
‪createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile()
Definition: ConfigurationManagerTest.php:458
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid
‪setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid()
Definition: ConfigurationManagerTest.php:211
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValueByPathUpdatesValueDefinedByPath
‪setLocalConfigurationValueByPathUpdatesValueDefinedByPath()
Definition: ConfigurationManagerTest.php:226
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue
‪removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue()
Definition: ConfigurationManagerTest.php:299
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setUp
‪setUp()
Definition: ConfigurationManagerTest.php:31
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile
‪createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile()
Definition: ConfigurationManagerTest.php:490
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getTestDirectory
‪getTestDirectory(string $prefix='root_')
Definition: ConfigurationManagerTest.php:46
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\isValidLocalConfigurationPathDeniesNotAllowedPath
‪isValidLocalConfigurationPathDeniesNotAllowedPath()
Definition: ConfigurationManagerTest.php:544
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\isValidLocalConfigurationPathAcceptsAllowedPath
‪isValidLocalConfigurationPathAcceptsAllowedPath()
Definition: ConfigurationManagerTest.php:534
‪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:161
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest
Definition: ConfigurationManagerTest.php:28