‪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 class ‪ConfigurationManagerTest extends UnitTestCase
28 {
32  protected ‪$subject;
33 
34  protected function ‪setUp(): void
35  {
36  parent::setUp();
38  [
39  'getDefaultConfigurationFileLocation',
40  'getSystemConfigurationFileLocation',
41  ]
42  );
43  }
44 
49  protected function ‪getTestDirectory(string $prefix = 'root_'): string
50  {
51  $path = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId($prefix);
53  $this->testFilesToDelete[] = $path;
54  return $path;
55  }
56 
57  protected function ‪createSubjectWithMockedMethods(array $methods): void
58  {
59  $this->subject = $this->getMockBuilder(ConfigurationManager::class)
60  ->onlyMethods($methods)
61  ->getMock();
62  }
63 
68  {
69  $this->expectException(\RuntimeException::class);
70  $this->expectExceptionCode(1310203814);
71 
72  $defaultConfigurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('defaultConfiguration');
73  file_put_contents(
74  $defaultConfigurationFile,
75  '<?php throw new \RuntimeException(\'foo\', 1310203814); ?>'
76  );
77 
78  $this->subject
79  ->expects(self::once())
80  ->method('getDefaultConfigurationFileLocation')
81  ->willReturn($defaultConfigurationFile);
82  $this->subject->getDefaultConfiguration();
83  }
84 
89  {
90  $this->expectException(\RuntimeException::class);
91 
92  $configurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('localConfiguration');
93  file_put_contents(
94  $configurationFile,
95  '<?php throw new \RuntimeException(\'foo\', 1310203815); ?>'
96  );
97 
98  $this->subject
99  ->expects(self::once())
100  ->method('getSystemConfigurationFileLocation')
101  ->willReturn($configurationFile);
102  $this->subject->getLocalConfiguration();
103  }
104 
109  {
110  $currentLocalConfiguration = [
111  'notChanged' => 23,
112  'changed' => 'unChanged',
113  ];
114  $overrideConfiguration = [
115  'changed' => 'changed',
116  'new' => 'new',
117  ];
118  $expectedConfiguration = [
119  'notChanged' => 23,
120  'changed' => 'changed',
121  'new' => 'new',
122  ];
123 
125  [
126  'getLocalConfiguration',
127  'writeLocalConfiguration',
128  ]
129  );
130  $this->subject->expects(self::once())
131  ->method('getLocalConfiguration')
132  ->willReturn($currentLocalConfiguration);
133  $this->subject->expects(self::once())
134  ->method('writeLocalConfiguration')
135  ->with($expectedConfiguration);
136 
137  $this->subject->updateLocalConfiguration($overrideConfiguration);
138  }
139 
144  {
146  [
147  'getDefaultConfiguration',
148  ]
149  );
150  $this->subject->expects(self::once())
151  ->method('getDefaultConfiguration')
152  ->willReturn(
153  [
154  'path' => 'value',
155  ]
156  );
157 
158  self::assertSame('value', $this->subject->getDefaultConfigurationValueByPath('path'));
159  }
160 
165  {
167  [
168  'getLocalConfiguration',
169  ]
170  );
171  $this->subject->expects(self::once())
172  ->method('getLocalConfiguration')
173  ->willReturn(
174  [
175  'path' => 'value',
176  ]
177  );
178 
179  self::assertSame('value', $this->subject->getLocalConfigurationValueByPath('path'));
180  }
181 
186  {
188  [
189  'getDefaultConfiguration',
190  'getLocalConfiguration',
191  ]
192  );
193  $this->subject->expects(self::once())
194  ->method('getDefaultConfiguration')
195  ->willReturn(
196  [
197  'path' => 'value',
198  ]
199  );
200  $this->subject->expects(self::once())
201  ->method('getLocalConfiguration')
202  ->willReturn(
203  [
204  'path' => 'valueOverride',
205  ]
206  );
207 
208  self::assertSame('valueOverride', $this->subject->getConfigurationValueByPath('path'));
209  }
210 
215  {
217  'isValidLocalConfigurationPath',
218  ]);
219  $this->subject->expects(self::once())
220  ->method('isValidLocalConfigurationPath')
221  ->willReturn(false);
222 
223  self::assertFalse($this->subject->setLocalConfigurationValueByPath('path', 'value'));
224  }
225 
230  {
231  $currentLocalConfiguration = [
232  'notChanged' => 23,
233  'toUpdate' => 'notUpdated',
234  ];
235  $expectedConfiguration = [
236  'notChanged' => 23,
237  'toUpdate' => 'updated',
238  ];
239 
241  [
242  'isValidLocalConfigurationPath',
243  'getLocalConfiguration',
244  'writeLocalConfiguration',
245  ]
246  );
247  $this->subject->expects(self::once())
248  ->method('isValidLocalConfigurationPath')
249  ->willReturn(true);
250  $this->subject->expects(self::once())
251  ->method('getLocalConfiguration')
252  ->willReturn($currentLocalConfiguration);
253  $this->subject->expects(self::once())
254  ->method('writeLocalConfiguration')
255  ->with($expectedConfiguration);
256 
257  $this->subject->setLocalConfigurationValueByPath('toUpdate', 'updated');
258  }
259 
264  {
265  $currentLocalConfiguration = [
266  'notChanged' => 23,
267  'toUpdate' => 'notUpdated',
268  ];
269  $expectedConfiguration = [
270  'notChanged' => 23,
271  'toUpdate' => 'updated',
272  'new' => 'new',
273  ];
274 
276  [
277  'isValidLocalConfigurationPath',
278  'getLocalConfiguration',
279  'writeLocalConfiguration',
280  ]
281  );
282  $this->subject
283  ->method('isValidLocalConfigurationPath')
284  ->willReturn(true);
285  $this->subject->expects(self::once())
286  ->method('getLocalConfiguration')
287  ->willReturn($currentLocalConfiguration);
288  $this->subject->expects(self::once())
289  ->method('writeLocalConfiguration')
290  ->with($expectedConfiguration);
291 
292  $pairs = [
293  'toUpdate' => 'updated',
294  'new' => 'new',
295  ];
296  $this->subject->setLocalConfigurationValuesByPathValuePairs($pairs);
297  }
298 
303  {
304  $currentLocalConfiguration = [
305  'toRemove1' => 'foo',
306  'notChanged' => 23,
307  'toRemove2' => 'bar',
308  ];
309  $expectedConfiguration = [
310  'notChanged' => 23,
311  ];
312 
314  [
315  'getLocalConfiguration',
316  'writeLocalConfiguration',
317  ]
318  );
319  $this->subject->expects(self::once())
320  ->method('getLocalConfiguration')
321  ->willReturn($currentLocalConfiguration);
322  $this->subject->expects(self::once())
323  ->method('writeLocalConfiguration')
324  ->with($expectedConfiguration);
325 
326  $removePaths = [
327  'toRemove1',
328  'toRemove2',
329  ];
330  self::assertTrue($this->subject->removeLocalConfigurationKeysByPath($removePaths));
331  }
332 
337  {
338  $currentLocalConfiguration = [
339  'notChanged' => 23,
340  ];
342  [
343  'getLocalConfiguration',
344  'writeLocalConfiguration',
345  ]
346  );
347  $this->subject->expects(self::once())
348  ->method('getLocalConfiguration')
349  ->willReturn($currentLocalConfiguration);
350  $this->subject->expects(self::never())
351  ->method('writeLocalConfiguration');
352 
353  $removeNothing = [];
354  self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNothing));
355  }
356 
361  {
362  $currentLocalConfiguration = [
363  'notChanged' => 23,
364  ];
366  [
367  'getLocalConfiguration',
368  'writeLocalConfiguration',
369  ]
370  );
371  $this->subject->expects(self::once())
372  ->method('getLocalConfiguration')
373  ->willReturn($currentLocalConfiguration);
374  $this->subject->expects(self::never())
375  ->method('writeLocalConfiguration');
376 
377  $removeNonExisting = ['notPresent'];
378  self::assertFalse($this->subject->removeLocalConfigurationKeysByPath($removeNonExisting));
379  }
380 
385  {
386  $directory = ‪StringUtility::getUniqueId('test_');
387  $absoluteDirectory = $this->‪getTestDirectory() . '/' . $directory;
388  mkdir($absoluteDirectory);
389 
390  $file = ‪StringUtility::getUniqueId('test_');
391  $absoluteFile1 = $absoluteDirectory . '/' . $file;
392  touch($absoluteFile1);
393  clearstatcache();
394  $this->subject
395  ->method('getSystemConfigurationFileLocation')
396  ->willReturn($absoluteFile1);
397 
398  $result = $this->subject->canWriteConfiguration();
399 
400  self::assertTrue($result);
401  }
402 
407  {
408  $configurationFile = $this->‪getTestDirectory() . '/' . ‪StringUtility::getUniqueId('localConfiguration');
409  if (!is_file($configurationFile)) {
410  if (!$fh = fopen($configurationFile, 'wb')) {
411  self::markTestSkipped('Can not create file ' . $configurationFile . '. Please check your write permissions.');
412  }
413  fclose($fh);
414  }
415 
416  if (!@is_file($configurationFile)) {
417  throw new \RuntimeException(
418  'File ' . $configurationFile . ' could not be found. Please check your write permissions',
419  1346364362
420  );
421  }
422 
423  $this->subject
424  ->method('getSystemConfigurationFileLocation')
425  ->willReturn($configurationFile);
426 
427  $pairs = [
428  'foo' => 42,
429  'bar' => 23,
430  ];
431  $expectedContent =
432  '<?php' . LF .
433  'return [' . LF .
434  ' \'bar\' => 23,' . LF .
435  ' \'foo\' => 42,' . LF .
436  '];' . LF;
437 
438  $this->subject->writeLocalConfiguration($pairs);
439  self::assertSame($expectedContent, file_get_contents($configurationFile));
440  }
441 
446  {
447  $this->expectException(\RuntimeException::class);
448 
449  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['getSystemConfigurationFileLocation']);
450 
451  $file = ‪StringUtility::getUniqueId('test_');
452  $absoluteFile = $this->‪getTestDirectory() . '/' . $file;
453  touch($absoluteFile);
454  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn($absoluteFile);
455  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
456  }
457 
462  {
463  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation']);
464  $localConfigurationFile = '/tests/' . ‪StringUtility::getUniqueId('dummy_');
465  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn(‪Environment::getVarPath() . '/' . $localConfigurationFile);
466 
467  $factoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
468  $factoryConfigurationAbsoluteFile = $this->‪getTestDirectory() . '/' . $factoryConfigurationFile;
469  ‪$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
470  $uniqueContentString = ‪StringUtility::getUniqueId('string_');
471  $validFactoryConfigurationFileContent =
472  '<?php' . LF .
473  'return [' . LF .
474  '\'' . $uniqueContentString . '\' => \'foo\',' . LF .
475  '];' . LF;
476  file_put_contents(
477  $factoryConfigurationAbsoluteFile,
478  $validFactoryConfigurationFileContent
479  );
480 
481  ‪$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);
482 
484  ->expects(self::once())
485  ->method('writeLocalConfiguration')
486  ->with(self::arrayHasKey($uniqueContentString));
487  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
488  }
489 
494  {
495  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, ['writeLocalConfiguration', 'getSystemConfigurationFileLocation', 'getFactoryConfigurationFileLocation', 'getAdditionalFactoryConfigurationFileLocation']);
496  $testDirectory = $this->‪getTestDirectory() . '/';
497  $localConfigurationFile = $testDirectory . ‪StringUtility::getUniqueId('dummy_');
498  ‪$subject->method('getSystemConfigurationFileLocation')->willReturn($localConfigurationFile);
499 
500  $factoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
501  $factoryConfigurationAbsoluteFile = $testDirectory . $factoryConfigurationFile;
502  ‪$subject->method('getFactoryConfigurationFileLocation')->willReturn($factoryConfigurationAbsoluteFile);
503  $validFactoryConfigurationFileContent =
504  '<?php' . LF .
505  'return [];' . LF;
506  file_put_contents(
507  $factoryConfigurationAbsoluteFile,
508  $validFactoryConfigurationFileContent
509  );
510  ‪$subject->_set('factoryConfigurationFile', $factoryConfigurationFile);
511 
512  $additionalFactoryConfigurationFile = ‪StringUtility::getUniqueId('test_') . '.php';
513  $additionalFactoryConfigurationAbsoluteFile = $testDirectory . $additionalFactoryConfigurationFile;
514  ‪$subject->method('getAdditionalFactoryConfigurationFileLocation')->willReturn($additionalFactoryConfigurationAbsoluteFile);
515  $uniqueContentString = ‪StringUtility::getUniqueId('string_');
516  $validAdditionalFactoryConfigurationFileContent =
517  '<?php' . LF .
518  'return [' . LF .
519  '\'' . $uniqueContentString . '\' => \'foo\',' . LF .
520  '];' . LF;
521  file_put_contents(
522  $additionalFactoryConfigurationAbsoluteFile,
523  $validAdditionalFactoryConfigurationFileContent
524  );
525  ‪$subject->_set('additionalFactoryConfigurationFile', $additionalFactoryConfigurationFile);
526 
528  ->expects(self::once())
529  ->method('writeLocalConfiguration')
530  ->with(self::arrayHasKey($uniqueContentString));
531  ‪$subject->createLocalConfigurationFromFactoryConfiguration();
532  }
533 
538  {
539  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, null);
540  ‪$subject->_set('allowedSettingsPaths', ['foo/bar']);
541  self::assertTrue(‪$subject->_call('isValidLocalConfigurationPath', 'foo/bar/baz'));
542  }
543 
548  {
549  ‪$subject = $this->getAccessibleMock(ConfigurationManager::class, null);
550  ‪$subject->_set('allowedSettingsPaths', ['foo/bar']);
551  self::assertFalse(‪$subject->_call('isValidLocalConfigurationPath', 'bar/baz'));
552  }
553 }
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createSubjectWithMockedMethods
‪createSubjectWithMockedMethods(array $methods)
Definition: ConfigurationManagerTest.php:56
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getSystemConfigurationExecutesDefinedConfigurationFile
‪getSystemConfigurationExecutesDefinedConfigurationFile()
Definition: ConfigurationManagerTest.php:87
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved
‪removeLocalConfigurationKeysByPathReturnsFalseIfNothingIsRemoved()
Definition: ConfigurationManagerTest.php:335
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs
‪setLocalConfigurationValuesByPathValuePairsSetsPathValuePairs()
Definition: ConfigurationManagerTest.php:262
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\writeLocalConfigurationWritesSortedContentToConfigurationFile
‪writeLocalConfigurationWritesSortedContentToConfigurationFile()
Definition: ConfigurationManagerTest.php:405
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable
‪canWriteConfigurationReturnsTrueIfDirectoryAndFilesAreWritable()
Definition: ConfigurationManagerTest.php:383
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getDefaultConfigurationExecutesDefinedDefaultConfigurationFile
‪getDefaultConfigurationExecutesDefinedDefaultConfigurationFile()
Definition: ConfigurationManagerTest.php:66
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists
‪createLocalConfigurationFromFactoryConfigurationThrowsExceptionIfFileExists()
Definition: ConfigurationManagerTest.php:444
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\updateLocalConfigurationWritesNewMergedLocalConfigurationArray
‪updateLocalConfigurationWritesNewMergedLocalConfigurationArray()
Definition: ConfigurationManagerTest.php:107
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved
‪removeLocalConfigurationKeysByPathReturnsFalseIfSomethingInexistentIsRemoved()
Definition: ConfigurationManagerTest.php:359
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1751
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getDefaultConfigurationValueByPathReturnsCorrectValue
‪getDefaultConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:142
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getConfigurationValueByPathReturnsCorrectValue
‪getConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:184
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile
‪createLocalConfigurationFromFactoryConfigurationWritesContentFromFactoryFile()
Definition: ConfigurationManagerTest.php:460
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid
‪setLocalConfigurationValueByPathReturnFalseIfPathIsNotValid()
Definition: ConfigurationManagerTest.php:213
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setLocalConfigurationValueByPathUpdatesValueDefinedByPath
‪setLocalConfigurationValueByPathUpdatesValueDefinedByPath()
Definition: ConfigurationManagerTest.php:228
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue
‪removeLocalConfigurationKeysByPathRemovesGivenPathsFromConfigurationAndReturnsTrue()
Definition: ConfigurationManagerTest.php:301
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\setUp
‪setUp()
Definition: ConfigurationManagerTest.php:33
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\$subject
‪ConfigurationManager MockObject $subject
Definition: ConfigurationManagerTest.php:31
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile
‪createLocalConfigurationFromFactoryConfigurationMergesConfigurationWithAdditionalFactoryFile()
Definition: ConfigurationManagerTest.php:492
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getTestDirectory
‪getTestDirectory(string $prefix='root_')
Definition: ConfigurationManagerTest.php:48
‪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:546
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\isValidLocalConfigurationPathAcceptsAllowedPath
‪isValidLocalConfigurationPathAcceptsAllowedPath()
Definition: ConfigurationManagerTest.php:536
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:29
‪TYPO3\CMS\Core\Tests\Unit\Configuration
Definition: ConfigurationManagerTest.php:18
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest\getLocalConfigurationValueByPathReturnsCorrectValue
‪getLocalConfigurationValueByPathReturnsCorrectValue()
Definition: ConfigurationManagerTest.php:163
‪TYPO3\CMS\Core\Tests\Unit\Configuration\ConfigurationManagerTest
Definition: ConfigurationManagerTest.php:28