‪TYPO3CMS  ‪main
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 
24 use TYPO3\CMS\Core\Package\PackageManager;
30 use TYPO3\CMS\Extensionmanager\Utility\EmConfUtility;
32 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
33 
34 final class ‪FileHandlingUtilityTest extends UnitTestCase
35 {
39  private array ‪$fakedExtensions = [];
40 
41  private string ‪$testRoot;
42 
43  protected function ‪setUp(): void
44  {
45  $this->testRoot = ‪Environment::getVarPath() . '/tests/';
46  ‪GeneralUtility::mkdir_deep($this->testRoot);
47  $this->testFilesToDelete[] = ‪$this->testRoot;
48  parent::setUp();
49  }
50 
57  private function ‪createFakeExtension(): string
58  {
59  $extKey = strtolower(‪StringUtility::getUniqueId('testing'));
60  $absExtPath = $this->testRoot . 'ext-' . $extKey . '/';
61  ‪GeneralUtility::mkdir_deep($absExtPath);
62  $this->fakedExtensions[$extKey] = [
63  'packagePath' => $absExtPath,
64  ];
65  return $extKey;
66  }
67 
72  {
73  $extKey = $this->‪createFakeExtension();
74  $path = $this->fakedExtensions[$extKey]['packagePath'];
75  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory', 'getExtensionDir'], [], '', false);
76  $subject->expects(self::once())->method('removeDirectory')->with($path);
77  $subject->method('getExtensionDir')->willReturn($path);
78  $subject->_call('makeAndClearExtensionDir', $extKey);
79  }
80 
84  public function ‪makeAndClearExtensionDirAddsDir(): void
85  {
86  $extKey = $this->‪createFakeExtension();
87  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory', 'getExtensionDir'], [], '', false);
88  $subject->expects(self::once())->method('addDirectory')->with($this->testRoot . 'ext-' . $extKey . '/');
89  $subject->method('getExtensionDir')->willReturn($this->testRoot . 'ext-' . $extKey . '/');
90  $subject->_call('makeAndClearExtensionDir', $extKey);
91  }
92 
97  {
98  $this->expectException(ExtensionManagerException::class);
99  $this->expectExceptionCode(1337280417);
100  ‪$GLOBALS['BE_USER'] = $this->createMock(BackendUserAuthentication::class);
101  $languageServiceMock = $this->createMock(LanguageService::class);
102  $languageServiceFactoryMock = $this->createMock(LanguageServiceFactory::class);
103  $languageServiceFactoryMock->method('createFromUserPreferences')->with(self::anything())->willReturn($languageServiceMock);
104  $subject = $this->getAccessibleMock(
105  FileHandlingUtility::class,
106  ['removeDirectory', 'addDirectory'],
107  [
108  $this->createMock(PackageManager::class),
109  $this->createMock(EmConfUtility::class),
110  $this->createMock(OpcodeCacheService::class),
111  $this->createMock(ZipService::class),
112  $languageServiceFactoryMock,
113  ]
114  );
115  $subject->_call('makeAndClearExtensionDir', 'testing123', 'fakepath');
116  }
117 
121  public function ‪addDirectoryAddsDirectory(): void
122  {
123  $extDirPath = $this->testRoot . ‪StringUtility::getUniqueId('test-extensions-');
124  $subject = $this->getAccessibleMock(FileHandlingUtility::class, null, [], '', false);
125  $subject->_call('addDirectory', $extDirPath);
126  self::assertDirectoryExists($extDirPath);
127  }
128 
132  public function ‪removeDirectoryRemovesDirectory(): void
133  {
134  $extDirPath = $this->testRoot . ‪StringUtility::getUniqueId('test-extensions-');
135  @mkdir($extDirPath);
136  $subject = $this->getAccessibleMock(FileHandlingUtility::class, null, [], '', false);
137  $subject->_call('removeDirectory', $extDirPath);
138  self::assertDirectoryDoesNotExist($extDirPath);
139  }
140 
144  public function ‪removeDirectoryRemovesSymlink(): void
145  {
146  $absoluteSymlinkPath = $this->testRoot . ‪StringUtility::getUniqueId('test_symlink_');
147  $absoluteFilePath = $this->testRoot . ‪StringUtility::getUniqueId('test_file_');
148  touch($absoluteFilePath);
149  symlink($absoluteFilePath, $absoluteSymlinkPath);
150  $subject = new ‪FileHandlingUtility(
151  $this->createMock(PackageManager::class),
152  $this->createMock(EmConfUtility::class),
153  $this->createMock(OpcodeCacheService::class),
154  $this->createMock(ZipService::class),
155  $this->createMock(LanguageServiceFactory::class)
156  );
157  $subject->removeDirectory($absoluteSymlinkPath);
158  self::assertFalse(is_link($absoluteSymlinkPath));
159  }
160 
165  {
166  $absoluteSymlinkPath = $this->testRoot . ‪StringUtility::getUniqueId('test_symlink_');
167  $absoluteDirectoryPath = $this->testRoot . ‪StringUtility::getUniqueId('test_dir_') . '/';
168  $relativeFilePath = ‪StringUtility::getUniqueId('test_file_');
169  ‪GeneralUtility::mkdir_deep($absoluteDirectoryPath);
170  touch($absoluteDirectoryPath . $relativeFilePath);
171  symlink($absoluteDirectoryPath, $absoluteSymlinkPath);
172  $subject = new ‪FileHandlingUtility(
173  $this->createMock(PackageManager::class),
174  $this->createMock(EmConfUtility::class),
175  $this->createMock(OpcodeCacheService::class),
176  $this->createMock(ZipService::class),
177  $this->createMock(LanguageServiceFactory::class)
178  );
179  $subject->removeDirectory($absoluteSymlinkPath);
180  self::assertTrue(is_file($absoluteDirectoryPath . $relativeFilePath));
181  }
182 
187  {
188  $extensionKey = 'test';
189  $subject = $this->getAccessibleMock(
190  FileHandlingUtility::class,
191  [
192  'makeAndClearExtensionDir',
193  'writeEmConfToFile',
194  'extractDirectoriesFromExtensionData',
195  'createDirectoriesForExtensionFiles',
196  'writeExtensionFiles',
197  'reloadPackageInformation',
198  ],
199  [],
200  '',
201  false
202  );
203  $subject->expects(self::once())->method('extractDirectoriesFromExtensionData')->willReturn([]);
204  $subject->expects(self::once())->method('makeAndClearExtensionDir')->with($extensionKey)->willReturn('my_path');
205  $subject->unpackExtensionFromExtensionDataArray($extensionKey, []);
206  }
207 
212  {
213  $extensionData = [
214  'extKey' => 'test',
215  'FILES' => [
216  'ChangeLog' => [
217  'name' => 'ChangeLog',
218  'size' => 4559,
219  'mtime' => 1219448527,
220  'is_executable' => false,
221  'content' => 'some content to write',
222  ],
223  'doc/' => [
224  'name' => 'doc/',
225  'size' => 0,
226  'mtime' => 1219448527,
227  'is_executable' => false,
228  'content' => '',
229  ],
230  'doc/ChangeLog' => [
231  'name' => 'ChangeLog',
232  'size' => 4559,
233  'mtime' => 1219448527,
234  'is_executable' => false,
235  'content' => 'some content to write',
236  ],
237  ],
238  ];
239  $cleanedFiles = [
240  'ChangeLog' => [
241  'name' => 'ChangeLog',
242  'size' => 4559,
243  'mtime' => 1219448527,
244  'is_executable' => false,
245  'content' => 'some content to write',
246  ],
247  'doc/ChangeLog' => [
248  'name' => 'ChangeLog',
249  'size' => 4559,
250  'mtime' => 1219448527,
251  'is_executable' => false,
252  'content' => 'some content to write',
253  ],
254  ];
255  $directories = [
256  'doc/',
257  'mod/doc/',
258  ];
259 
260  $subject = $this->getAccessibleMock(
261  FileHandlingUtility::class,
262  [
263  'makeAndClearExtensionDir',
264  'writeEmConfToFile',
265  'extractDirectoriesFromExtensionData',
266  'createDirectoriesForExtensionFiles',
267  'writeExtensionFiles',
268  'reloadPackageInformation',
269  ],
270  [],
271  '',
272  false
273  );
274  $subject->expects(self::once())->method('extractDirectoriesFromExtensionData')->willReturn($directories);
275  $subject->expects(self::once())->method('createDirectoriesForExtensionFiles')->with($directories);
276  $subject->expects(self::once())->method('makeAndClearExtensionDir')->with($extensionData['extKey'])->willReturn('my_path');
277  $subject->expects(self::once())->method('writeExtensionFiles')->with($cleanedFiles);
278  $subject->expects(self::once())->method('reloadPackageInformation')->with('test');
279  $subject->unpackExtensionFromExtensionDataArray('test', $extensionData);
280  }
281 
285  public function ‪writeExtensionFilesWritesFiles(): void
286  {
287  $files = [
288  'ChangeLog' => [
289  'name' => 'ChangeLog',
290  'size' => 4559,
291  'mtime' => 1219448527,
292  'is_executable' => false,
293  'content' => 'some content to write',
294  ],
295  'README' => [
296  'name' => 'README',
297  'size' => 4566,
298  'mtime' => 1219448533,
299  'is_executable' => false,
300  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
301  ],
302  ];
303  $rootPath = $this->fakedExtensions[$this->‪createFakeExtension()]['packagePath'];
304  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir'], [], '', false);
305  $subject->_call('writeExtensionFiles', $files, $rootPath);
306  self::assertFileExists($rootPath . 'ChangeLog');
307  }
308 
313  {
314  $files = [
315  'ChangeLog' => [
316  'name' => 'ChangeLog',
317  'size' => 4559,
318  'mtime' => 1219448527,
319  'is_executable' => false,
320  'content' => 'some content to write',
321  ],
322  'doc/' => [
323  'name' => 'doc/',
324  'size' => 0,
325  'mtime' => 1219448527,
326  'is_executable' => false,
327  'content' => '',
328  ],
329  'doc/ChangeLog' => [
330  'name' => 'ChangeLog',
331  'size' => 4559,
332  'mtime' => 1219448527,
333  'is_executable' => false,
334  'content' => 'some content to write',
335  ],
336  'doc/README' => [
337  'name' => 'README',
338  'size' => 4566,
339  'mtime' => 1219448533,
340  'is_executable' => false,
341  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
342  ],
343  'mod/doc/README' => [
344  'name' => 'README',
345  'size' => 4566,
346  'mtime' => 1219448533,
347  'is_executable' => false,
348  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
349  ],
350  ];
351  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir'], [], '', false);
352  $extractedDirectories = $subject->_call('extractDirectoriesFromExtensionData', $files);
353  $expected = [
354  'doc/',
355  'mod/doc/',
356  ];
357  self::assertSame($expected, array_values($extractedDirectories));
358  }
359 
364  {
365  $rootPath = $this->fakedExtensions[$this->‪createFakeExtension()]['packagePath'];
366  $directories = [
367  'doc/',
368  'mod/doc/',
369  ];
370  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir'], [], '', false);
371  self::assertDirectoryDoesNotExist($rootPath . 'doc/');
372  self::assertDirectoryDoesNotExist($rootPath . 'mod/doc/');
373  $subject->_call('createDirectoriesForExtensionFiles', $directories, $rootPath);
374  self::assertDirectoryExists($rootPath . 'doc/');
375  self::assertDirectoryExists($rootPath . 'mod/doc/');
376  }
377 
381  public function ‪writeEmConfWritesEmConfFile(): void
382  {
383  $extKey = $this->‪createFakeExtension();
384  $emConfData = [
385  'title' => 'Plugin cache engine',
386  'description' => 'Provides an interface to cache plugin content elements based on 4.3 caching framework',
387  'category' => 'Frontend',
388  ];
389  $rootPath = $this->fakedExtensions[$extKey]['packagePath'];
390  $subject = $this->getAccessibleMock(
391  FileHandlingUtility::class,
392  ['makeAndClearExtensionDir'],
393  [
394  $this->createMock(PackageManager::class),
395  new EmConfUtility(),
396  $this->createMock(OpcodeCacheService::class),
397  $this->createMock(ZipService::class),
398  $this->createMock(LanguageServiceFactory::class),
399  ]
400  );
401  $subject->_call('writeEmConfToFile', $extKey, $emConfData, $rootPath);
402  self::assertFileExists($rootPath . 'ext_emconf.php');
403  }
404 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirThrowsExceptionOnInvalidPath
‪makeAndClearExtensionDirThrowsExceptionOnInvalidPath()
Definition: FileHandlingUtilityTest.php:96
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\createFakeExtension
‪string createFakeExtension()
Definition: FileHandlingUtilityTest.php:57
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory
‪removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory()
Definition: FileHandlingUtilityTest.php:164
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility
Definition: DependencyUtilityTest.php:18
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirAddsDir
‪makeAndClearExtensionDirAddsDir()
Definition: FileHandlingUtilityTest.php:84
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryRemovesDirectory
‪removeDirectoryRemovesDirectory()
Definition: FileHandlingUtilityTest.php:132
‪TYPO3\CMS\Core\Core\Environment\getVarPath
‪static getVarPath()
Definition: Environment.php:197
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryRemovesSymlink
‪removeDirectoryRemovesSymlink()
Definition: FileHandlingUtilityTest.php:144
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility
Definition: FileHandlingUtility.php:38
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\extractDirectoriesFromExtensionDataExtractsDirectories
‪extractDirectoriesFromExtensionDataExtractsDirectories()
Definition: FileHandlingUtilityTest.php:312
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest
Definition: FileHandlingUtilityTest.php:35
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\addDirectoryAddsDirectory
‪addDirectoryAddsDirectory()
Definition: FileHandlingUtilityTest.php:121
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory
‪unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory()
Definition: FileHandlingUtilityTest.php:186
‪TYPO3\CMS\Core\Utility\GeneralUtility\mkdir_deep
‪static mkdir_deep($directory)
Definition: GeneralUtility.php:1638
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\setUp
‪setUp()
Definition: FileHandlingUtilityTest.php:43
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\writeExtensionFilesWritesFiles
‪writeExtensionFilesWritesFiles()
Definition: FileHandlingUtilityTest.php:285
‪TYPO3\CMS\Extensionmanager\Exception\ExtensionManagerException
Definition: ExtensionManagerException.php:24
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:64
‪TYPO3\CMS\Core\Service\OpcodeCacheService
Definition: OpcodeCacheService.php:27
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray
‪unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray()
Definition: FileHandlingUtilityTest.php:211
‪TYPO3\CMS\Core\Service\Archive\ZipService
Definition: ZipService.php:29
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\writeEmConfWritesEmConfFile
‪writeEmConfWritesEmConfFile()
Definition: FileHandlingUtilityTest.php:381
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists
‪makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists()
Definition: FileHandlingUtilityTest.php:71
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\createDirectoriesForExtensionFilesCreatesDirectories
‪createDirectoriesForExtensionFilesCreatesDirectories()
Definition: FileHandlingUtilityTest.php:363
‪TYPO3\CMS\Core\Localization\LanguageService
Definition: LanguageService.php:46
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\$fakedExtensions
‪array $fakedExtensions
Definition: FileHandlingUtilityTest.php:39
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:51
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\$testRoot
‪string $testRoot
Definition: FileHandlingUtilityTest.php:41
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57