‪TYPO3CMS  11.5
FileHandlingUtilityTest.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 Prophecy\Argument;
21 use Prophecy\PhpUnit\ProphecyTrait;
29 use TYPO3\CMS\Extensionmanager\Utility\EmConfUtility;
31 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
32 
33 class ‪FileHandlingUtilityTest extends UnitTestCase
34 {
35  use ProphecyTrait;
36 
40  protected array ‪$fakedExtensions = [];
41 
49  protected function ‪createFakeExtension($extkeyOnly = false): string
50  {
51  $extKey = strtolower(‪StringUtility::getUniqueId('testing'));
52  $absExtPath = ‪Environment::getVarPath() . '/tests/ext-' . $extKey . '/';
53  $this->fakedExtensions[$extKey] = [
54  'packagePath' => $absExtPath,
55  ];
56  if ($extkeyOnly === true) {
57  return $extKey;
58  }
59  ‪GeneralUtility::mkdir($absExtPath);
60  $this->testFilesToDelete[] = ‪Environment::getVarPath() . '/tests/ext-' . $extKey;
61  return $extKey;
62  }
63 
68  {
69  $extKey = $this->‪createFakeExtension();
70  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory', 'getExtensionDir'], [], '', false);
71  $fileHandlerMock->expects(self::once())
72  ->method('removeDirectory')
73  ->with(‪Environment::getVarPath() . '/tests/ext-' . $extKey . '/');
74  $fileHandlerMock
75  ->method('getExtensionDir')
76  ->willReturn(‪Environment::getVarPath() . '/tests/ext-' . $extKey . '/');
77  $fileHandlerMock->_call('makeAndClearExtensionDir', $extKey);
78  }
79 
83  public function ‪makeAndClearExtensionDirAddsDir(): void
84  {
85  $extKey = $this->‪createFakeExtension();
86  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory', 'getExtensionDir']);
87  $fileHandlerMock->expects(self::once())
88  ->method('addDirectory')
89  ->with(‪Environment::getVarPath() . '/tests/ext-' . $extKey . '/');
90  $fileHandlerMock
91  ->method('getExtensionDir')
92  ->willReturn(‪Environment::getVarPath() . '/tests/ext-' . $extKey . '/');
93  $fileHandlerMock->_call('makeAndClearExtensionDir', $extKey);
94  }
95 
100  {
101  $this->expectException(ExtensionManagerException::class);
102  $this->expectExceptionCode(1337280417);
103  ‪$GLOBALS['BE_USER'] = $this->getMockBuilder(BackendUserAuthentication::class)->getMock();
104  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory']);
105  $languageServiceProphecy = $this->prophesize(LanguageService::class);
106  $languageServiceProphecy->includeLLFile(Argument::any())->willReturn('');
107  $languageServiceProphecy->getLL(Argument::any())->willReturn('');
108  $languageServiceProphecy->getLLL(Argument::any())->willReturn('');
109  $languageServiceFactoryProphecy = $this->prophesize(LanguageServiceFactory::class);
110  $languageServiceFactoryProphecy->createFromUserPreferences(Argument::cetera())->willReturn($languageServiceProphecy->reveal());
111  $fileHandlerMock->injectLanguageServiceFactory($languageServiceFactoryProphecy->reveal());
112  $fileHandlerMock->initializeObject();
113  $fileHandlerMock->_call('makeAndClearExtensionDir', 'testing123', 'fakepath');
114  }
115 
119  public function ‪addDirectoryAddsDirectory(): void
120  {
121  $extDirPath = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('test-extensions-');
122  $this->testFilesToDelete[] = $extDirPath;
123  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['dummy']);
124  $fileHandlerMock->_call('addDirectory', $extDirPath);
125  self::assertDirectoryExists($extDirPath);
126  }
127 
131  public function ‪removeDirectoryRemovesDirectory(): void
132  {
133  $extDirPath = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('test-extensions-');
134  @mkdir($extDirPath);
135  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['dummy']);
136  $fileHandlerMock->_call('removeDirectory', $extDirPath);
137  self::assertDirectoryDoesNotExist($extDirPath);
138  }
139 
143  public function ‪removeDirectoryRemovesSymlink(): void
144  {
145  $absoluteSymlinkPath = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('test_symlink_');
146  $absoluteFilePath = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('test_file_');
147  touch($absoluteFilePath);
148  $this->testFilesToDelete[] = $absoluteFilePath;
149  symlink($absoluteFilePath, $absoluteSymlinkPath);
150  $fileHandler = new ‪FileHandlingUtility();
151  $fileHandler->removeDirectory($absoluteSymlinkPath);
152  self::assertFalse(is_link($absoluteSymlinkPath));
153  }
154 
159  {
160  $absoluteSymlinkPath = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('test_symlink_');
161  $absoluteDirectoryPath = ‪Environment::getVarPath() . '/tests/' . ‪StringUtility::getUniqueId('test_dir_') . '/';
162  $relativeFilePath = ‪StringUtility::getUniqueId('test_file_');
163 
164  mkdir($absoluteDirectoryPath);
165  touch($absoluteDirectoryPath . $relativeFilePath);
166 
167  $this->testFilesToDelete[] = $absoluteDirectoryPath . $relativeFilePath;
168  $this->testFilesToDelete[] = $absoluteDirectoryPath;
169 
170  symlink($absoluteDirectoryPath, $absoluteSymlinkPath);
171 
172  $fileHandler = new ‪FileHandlingUtility();
173  $fileHandler->removeDirectory($absoluteSymlinkPath);
174  self::assertTrue(is_file($absoluteDirectoryPath . $relativeFilePath));
175  }
176 
181  {
182  $extensionKey = 'test';
183  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
184  'makeAndClearExtensionDir',
185  'writeEmConfToFile',
186  'extractDirectoriesFromExtensionData',
187  'createDirectoriesForExtensionFiles',
188  'writeExtensionFiles',
189  'reloadPackageInformation',
190  ]);
191  $fileHandlerMock->expects(self::once())->method('extractDirectoriesFromExtensionData')->willReturn([]);
192  $fileHandlerMock->expects(self::once())->method('makeAndClearExtensionDir')->with($extensionKey)->willReturn('my_path');
193  $fileHandlerMock->unpackExtensionFromExtensionDataArray($extensionKey, []);
194  }
195 
200  {
201  $extensionData = [
202  'extKey' => 'test',
203  'FILES' => [
204  'ChangeLog' => [
205  'name' => 'ChangeLog',
206  'size' => 4559,
207  'mtime' => 1219448527,
208  'is_executable' => false,
209  'content' => 'some content to write',
210  ],
211  'doc/' => [
212  'name' => 'doc/',
213  'size' => 0,
214  'mtime' => 1219448527,
215  'is_executable' => false,
216  'content' => '',
217  ],
218  'doc/ChangeLog' => [
219  'name' => 'ChangeLog',
220  'size' => 4559,
221  'mtime' => 1219448527,
222  'is_executable' => false,
223  'content' => 'some content to write',
224  ],
225  ],
226  ];
227  $cleanedFiles = [
228  'ChangeLog' => [
229  'name' => 'ChangeLog',
230  'size' => 4559,
231  'mtime' => 1219448527,
232  'is_executable' => false,
233  'content' => 'some content to write',
234  ],
235  'doc/ChangeLog' => [
236  'name' => 'ChangeLog',
237  'size' => 4559,
238  'mtime' => 1219448527,
239  'is_executable' => false,
240  'content' => 'some content to write',
241  ],
242  ];
243  $directories = [
244  'doc/',
245  'mod/doc/',
246  ];
247 
248  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
249  'makeAndClearExtensionDir',
250  'writeEmConfToFile',
251  'extractDirectoriesFromExtensionData',
252  'createDirectoriesForExtensionFiles',
253  'writeExtensionFiles',
254  'reloadPackageInformation',
255  ]);
256  $fileHandlerMock->expects(self::once())->method('extractDirectoriesFromExtensionData')->willReturn($directories);
257  $fileHandlerMock->expects(self::once())->method('createDirectoriesForExtensionFiles')->with($directories);
258  $fileHandlerMock->expects(self::once())->method('makeAndClearExtensionDir')->with($extensionData['extKey'])->willReturn('my_path');
259  $fileHandlerMock->expects(self::once())->method('writeExtensionFiles')->with($cleanedFiles);
260  $fileHandlerMock->expects(self::once())->method('reloadPackageInformation')->with('test');
261  $fileHandlerMock->unpackExtensionFromExtensionDataArray('test', $extensionData);
262  }
263 
267  public function ‪writeExtensionFilesWritesFiles(): void
268  {
269  $files = [
270  'ChangeLog' => [
271  'name' => 'ChangeLog',
272  'size' => 4559,
273  'mtime' => 1219448527,
274  'is_executable' => false,
275  'content' => 'some content to write',
276  ],
277  'README' => [
278  'name' => 'README',
279  'size' => 4566,
280  'mtime' => 1219448533,
281  'is_executable' => false,
282  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
283  ],
284  ];
285  $rootPath = $this->fakedExtensions[$this->‪createFakeExtension()]['packagePath'];
286  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir']);
287  $fileHandlerMock->_call('writeExtensionFiles', $files, $rootPath);
288  self::assertFileExists($rootPath . 'ChangeLog');
289  }
290 
295  {
296  $files = [
297  'ChangeLog' => [
298  'name' => 'ChangeLog',
299  'size' => 4559,
300  'mtime' => 1219448527,
301  'is_executable' => false,
302  'content' => 'some content to write',
303  ],
304  'doc/' => [
305  'name' => 'doc/',
306  'size' => 0,
307  'mtime' => 1219448527,
308  'is_executable' => false,
309  'content' => '',
310  ],
311  'doc/ChangeLog' => [
312  'name' => 'ChangeLog',
313  'size' => 4559,
314  'mtime' => 1219448527,
315  'is_executable' => false,
316  'content' => 'some content to write',
317  ],
318  'doc/README' => [
319  'name' => 'README',
320  'size' => 4566,
321  'mtime' => 1219448533,
322  'is_executable' => false,
323  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
324  ],
325  'mod/doc/README' => [
326  'name' => 'README',
327  'size' => 4566,
328  'mtime' => 1219448533,
329  'is_executable' => false,
330  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
331  ],
332  ];
333  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir']);
334  $extractedDirectories = $fileHandlerMock->_call('extractDirectoriesFromExtensionData', $files);
335  $expected = [
336  'doc/',
337  'mod/doc/',
338  ];
339  self::assertSame($expected, array_values($extractedDirectories));
340  }
341 
346  {
347  $rootPath = $this->fakedExtensions[$this->‪createFakeExtension()]['packagePath'];
348  $directories = [
349  'doc/',
350  'mod/doc/',
351  ];
352  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir']);
353  self::assertDirectoryDoesNotExist($rootPath . 'doc/');
354  self::assertDirectoryDoesNotExist($rootPath . 'mod/doc/');
355  $fileHandlerMock->_call('createDirectoriesForExtensionFiles', $directories, $rootPath);
356  self::assertDirectoryExists($rootPath . 'doc/');
357  self::assertDirectoryExists($rootPath . 'mod/doc/');
358  }
359 
363  public function ‪writeEmConfWritesEmConfFile(): void
364  {
365  $extKey = $this->‪createFakeExtension();
366  $emConfData = [
367  'title' => 'Plugin cache engine',
368  'description' => 'Provides an interface to cache plugin content elements based on 4.3 caching framework',
369  'category' => 'Frontend',
370  ];
371  $rootPath = $this->fakedExtensions[$extKey]['packagePath'];
372 
373  $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir']);
374  $fileHandlerMock->injectEmConfUtility(new EmConfUtility());
375  $fileHandlerMock->_call('writeEmConfToFile', $extKey, $emConfData, $rootPath);
376  self::assertFileExists($rootPath . 'ext_emconf.php');
377  }
378 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirThrowsExceptionOnInvalidPath
‪makeAndClearExtensionDirThrowsExceptionOnInvalidPath()
Definition: FileHandlingUtilityTest.php:98
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory
‪removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory()
Definition: FileHandlingUtilityTest.php:157
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility
Definition: DependencyUtilityTest.php:18
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirAddsDir
‪makeAndClearExtensionDirAddsDir()
Definition: FileHandlingUtilityTest.php:82
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryRemovesDirectory
‪removeDirectoryRemovesDirectory()
Definition: FileHandlingUtilityTest.php:130
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryRemovesSymlink
‪removeDirectoryRemovesSymlink()
Definition: FileHandlingUtilityTest.php:142
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility
Definition: FileHandlingUtility.php:36
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\extractDirectoriesFromExtensionDataExtractsDirectories
‪extractDirectoriesFromExtensionDataExtractsDirectories()
Definition: FileHandlingUtilityTest.php:293
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest
Definition: FileHandlingUtilityTest.php:34
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\addDirectoryAddsDirectory
‪addDirectoryAddsDirectory()
Definition: FileHandlingUtilityTest.php:118
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory
‪unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory()
Definition: FileHandlingUtilityTest.php:179
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\writeExtensionFilesWritesFiles
‪writeExtensionFilesWritesFiles()
Definition: FileHandlingUtilityTest.php:266
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:23
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray
‪unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray()
Definition: FileHandlingUtilityTest.php:198
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static string getUniqueId($prefix='')
Definition: StringUtility.php:128
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:43
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\writeEmConfWritesEmConfFile
‪writeEmConfWritesEmConfFile()
Definition: FileHandlingUtilityTest.php:362
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists
‪makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists()
Definition: FileHandlingUtilityTest.php:66
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\createDirectoriesForExtensionFilesCreatesDirectories
‪createDirectoriesForExtensionFilesCreatesDirectories()
Definition: FileHandlingUtilityTest.php:344
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:42
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\$fakedExtensions
‪array $fakedExtensions
Definition: FileHandlingUtilityTest.php:39
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:50
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:22
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir
‪static bool mkdir($newFolder)
Definition: GeneralUtility.php:1891
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static string getVarPath()
Definition: Environment.php:218
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\createFakeExtension
‪string createFakeExtension($extkeyOnly=false)
Definition: FileHandlingUtilityTest.php:48