‪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 
20 use PHPUnit\Framework\Attributes\Test;
23 use TYPO3\CMS\Core\Package\PackageManager;
28 use TYPO3\CMS\Extensionmanager\Utility\EmConfUtility;
30 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
31 
32 final class ‪FileHandlingUtilityTest extends UnitTestCase
33 {
37  private array ‪$fakedExtensions = [];
38 
39  private string ‪$testRoot;
40 
41  protected function ‪setUp(): void
42  {
43  $this->testRoot = ‪Environment::getVarPath() . '/tests/';
44  ‪GeneralUtility::mkdir_deep($this->testRoot);
45  $this->testFilesToDelete[] = ‪$this->testRoot;
46  parent::setUp();
47  }
48 
55  private function ‪createFakeExtension(): string
56  {
57  $extKey = strtolower(‪StringUtility::getUniqueId('testing'));
58  $absExtPath = $this->testRoot . 'ext-' . $extKey . '/';
59  ‪GeneralUtility::mkdir_deep($absExtPath);
60  $this->fakedExtensions[$extKey] = [
61  'packagePath' => $absExtPath,
62  ];
63  return $extKey;
64  }
65 
66  #[Test]
68  {
69  $extKey = $this->‪createFakeExtension();
70  $path = $this->fakedExtensions[$extKey]['packagePath'];
71  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory', 'getExtensionDir'], [], '', false);
72  $subject->expects(self::once())->method('removeDirectory')->with($path);
73  $subject->method('getExtensionDir')->willReturn($path);
74  $subject->_call('makeAndClearExtensionDir', $extKey);
75  }
76 
77  #[Test]
78  public function ‪makeAndClearExtensionDirAddsDir(): void
79  {
80  $extKey = $this->‪createFakeExtension();
81  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['removeDirectory', 'addDirectory', 'getExtensionDir'], [], '', false);
82  $subject->expects(self::once())->method('addDirectory')->with($this->testRoot . 'ext-' . $extKey . '/');
83  $subject->method('getExtensionDir')->willReturn($this->testRoot . 'ext-' . $extKey . '/');
84  $subject->_call('makeAndClearExtensionDir', $extKey);
85  }
86 
87  #[Test]
88  public function ‪addDirectoryAddsDirectory(): void
89  {
90  $extDirPath = $this->testRoot . ‪StringUtility::getUniqueId('test-extensions-');
91  $subject = $this->getAccessibleMock(FileHandlingUtility::class, null, [], '', false);
92  $subject->_call('addDirectory', $extDirPath);
93  self::assertDirectoryExists($extDirPath);
94  }
95 
96  #[Test]
97  public function ‪removeDirectoryRemovesDirectory(): void
98  {
99  $extDirPath = $this->testRoot . ‪StringUtility::getUniqueId('test-extensions-');
100  @mkdir($extDirPath);
101  $subject = $this->getAccessibleMock(FileHandlingUtility::class, null, [], '', false);
102  $subject->_call('removeDirectory', $extDirPath);
103  self::assertDirectoryDoesNotExist($extDirPath);
104  }
105 
106  #[Test]
107  public function ‪removeDirectoryRemovesSymlink(): void
108  {
109  $absoluteSymlinkPath = $this->testRoot . ‪StringUtility::getUniqueId('test_symlink_');
110  $absoluteFilePath = $this->testRoot . ‪StringUtility::getUniqueId('test_file_');
111  touch($absoluteFilePath);
112  symlink($absoluteFilePath, $absoluteSymlinkPath);
113  $subject = new ‪FileHandlingUtility(
114  $this->createMock(PackageManager::class),
115  $this->createMock(EmConfUtility::class),
116  $this->createMock(OpcodeCacheService::class),
117  $this->createMock(ZipService::class),
118  $this->createMock(LanguageServiceFactory::class)
119  );
120  $subject->removeDirectory($absoluteSymlinkPath);
121  self::assertFalse(is_link($absoluteSymlinkPath));
122  }
123 
124  #[Test]
126  {
127  $absoluteSymlinkPath = $this->testRoot . ‪StringUtility::getUniqueId('test_symlink_');
128  $absoluteDirectoryPath = $this->testRoot . ‪StringUtility::getUniqueId('test_dir_') . '/';
129  $relativeFilePath = ‪StringUtility::getUniqueId('test_file_');
130  ‪GeneralUtility::mkdir_deep($absoluteDirectoryPath);
131  touch($absoluteDirectoryPath . $relativeFilePath);
132  symlink($absoluteDirectoryPath, $absoluteSymlinkPath);
133  $subject = new ‪FileHandlingUtility(
134  $this->createMock(PackageManager::class),
135  $this->createMock(EmConfUtility::class),
136  $this->createMock(OpcodeCacheService::class),
137  $this->createMock(ZipService::class),
138  $this->createMock(LanguageServiceFactory::class)
139  );
140  $subject->removeDirectory($absoluteSymlinkPath);
141  self::assertTrue(is_file($absoluteDirectoryPath . $relativeFilePath));
142  }
143 
144  #[Test]
146  {
147  $extensionKey = 'test';
148  $subject = $this->getAccessibleMock(
149  FileHandlingUtility::class,
150  [
151  'makeAndClearExtensionDir',
152  'writeEmConfToFile',
153  'extractDirectoriesFromExtensionData',
154  'createDirectoriesForExtensionFiles',
155  'writeExtensionFiles',
156  'reloadPackageInformation',
157  ],
158  [],
159  '',
160  false
161  );
162  $subject->expects(self::once())->method('extractDirectoriesFromExtensionData')->willReturn([]);
163  $subject->expects(self::once())->method('makeAndClearExtensionDir')->with($extensionKey)->willReturn('my_path');
164  $subject->unpackExtensionFromExtensionDataArray($extensionKey, []);
165  }
166 
167  #[Test]
169  {
170  $extensionData = [
171  'extKey' => 'test',
172  'FILES' => [
173  'ChangeLog' => [
174  'name' => 'ChangeLog',
175  'size' => 4559,
176  'mtime' => 1219448527,
177  'is_executable' => false,
178  'content' => 'some content to write',
179  ],
180  'doc/' => [
181  'name' => 'doc/',
182  'size' => 0,
183  'mtime' => 1219448527,
184  'is_executable' => false,
185  'content' => '',
186  ],
187  'doc/ChangeLog' => [
188  'name' => 'ChangeLog',
189  'size' => 4559,
190  'mtime' => 1219448527,
191  'is_executable' => false,
192  'content' => 'some content to write',
193  ],
194  ],
195  ];
196  $cleanedFiles = [
197  'ChangeLog' => [
198  'name' => 'ChangeLog',
199  'size' => 4559,
200  'mtime' => 1219448527,
201  'is_executable' => false,
202  'content' => 'some content to write',
203  ],
204  'doc/ChangeLog' => [
205  'name' => 'ChangeLog',
206  'size' => 4559,
207  'mtime' => 1219448527,
208  'is_executable' => false,
209  'content' => 'some content to write',
210  ],
211  ];
212  $directories = [
213  'doc/',
214  'mod/doc/',
215  ];
216 
217  $subject = $this->getAccessibleMock(
218  FileHandlingUtility::class,
219  [
220  'makeAndClearExtensionDir',
221  'writeEmConfToFile',
222  'extractDirectoriesFromExtensionData',
223  'createDirectoriesForExtensionFiles',
224  'writeExtensionFiles',
225  'reloadPackageInformation',
226  ],
227  [],
228  '',
229  false
230  );
231  $subject->expects(self::once())->method('extractDirectoriesFromExtensionData')->willReturn($directories);
232  $subject->expects(self::once())->method('createDirectoriesForExtensionFiles')->with($directories);
233  $subject->expects(self::once())->method('makeAndClearExtensionDir')->with($extensionData['extKey'])->willReturn('my_path');
234  $subject->expects(self::once())->method('writeExtensionFiles')->with($cleanedFiles);
235  $subject->expects(self::once())->method('reloadPackageInformation')->with('test');
236  $subject->unpackExtensionFromExtensionDataArray('test', $extensionData);
237  }
238 
239  #[Test]
240  public function ‪writeExtensionFilesWritesFiles(): void
241  {
242  $files = [
243  'ChangeLog' => [
244  'name' => 'ChangeLog',
245  'size' => 4559,
246  'mtime' => 1219448527,
247  'is_executable' => false,
248  'content' => 'some content to write',
249  ],
250  'README' => [
251  'name' => 'README',
252  'size' => 4566,
253  'mtime' => 1219448533,
254  'is_executable' => false,
255  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
256  ],
257  ];
258  $rootPath = $this->fakedExtensions[$this->‪createFakeExtension()]['packagePath'];
259  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir'], [], '', false);
260  $subject->_call('writeExtensionFiles', $files, $rootPath);
261  self::assertFileExists($rootPath . 'ChangeLog');
262  }
263 
264  #[Test]
266  {
267  $files = [
268  'ChangeLog' => [
269  'name' => 'ChangeLog',
270  'size' => 4559,
271  'mtime' => 1219448527,
272  'is_executable' => false,
273  'content' => 'some content to write',
274  ],
275  'doc/' => [
276  'name' => 'doc/',
277  'size' => 0,
278  'mtime' => 1219448527,
279  'is_executable' => false,
280  'content' => '',
281  ],
282  'doc/ChangeLog' => [
283  'name' => 'ChangeLog',
284  'size' => 4559,
285  'mtime' => 1219448527,
286  'is_executable' => false,
287  'content' => 'some content to write',
288  ],
289  'doc/README' => [
290  'name' => 'README',
291  'size' => 4566,
292  'mtime' => 1219448533,
293  'is_executable' => false,
294  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
295  ],
296  'mod/doc/README' => [
297  'name' => 'README',
298  'size' => 4566,
299  'mtime' => 1219448533,
300  'is_executable' => false,
301  'content' => 'FEEL FREE TO ADD SOME DOCUMENTATION HERE',
302  ],
303  ];
304  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir'], [], '', false);
305  $extractedDirectories = $subject->_call('extractDirectoriesFromExtensionData', $files);
306  $expected = [
307  'doc/',
308  'mod/doc/',
309  ];
310  self::assertSame($expected, array_values($extractedDirectories));
311  }
312 
313  #[Test]
315  {
316  $rootPath = $this->fakedExtensions[$this->‪createFakeExtension()]['packagePath'];
317  $directories = [
318  'doc/',
319  'mod/doc/',
320  ];
321  $subject = $this->getAccessibleMock(FileHandlingUtility::class, ['makeAndClearExtensionDir'], [], '', false);
322  self::assertDirectoryDoesNotExist($rootPath . 'doc/');
323  self::assertDirectoryDoesNotExist($rootPath . 'mod/doc/');
324  $subject->_call('createDirectoriesForExtensionFiles', $directories, $rootPath);
325  self::assertDirectoryExists($rootPath . 'doc/');
326  self::assertDirectoryExists($rootPath . 'mod/doc/');
327  }
328 
329  #[Test]
330  public function ‪writeEmConfWritesEmConfFile(): void
331  {
332  $extKey = $this->‪createFakeExtension();
333  $emConfData = [
334  'title' => 'Plugin cache engine',
335  'description' => 'Provides an interface to cache plugin content elements based on 4.3 caching framework',
336  'category' => 'Frontend',
337  ];
338  $rootPath = $this->fakedExtensions[$extKey]['packagePath'];
339  $subject = $this->getAccessibleMock(
340  FileHandlingUtility::class,
341  ['makeAndClearExtensionDir'],
342  [
343  $this->createMock(PackageManager::class),
344  new EmConfUtility(),
345  $this->createMock(OpcodeCacheService::class),
346  $this->createMock(ZipService::class),
347  $this->createMock(LanguageServiceFactory::class),
348  ]
349  );
350  $subject->_call('writeEmConfToFile', $extKey, $emConfData, $rootPath);
351  self::assertFileExists($rootPath . 'ext_emconf.php');
352  }
353 }
‪TYPO3\CMS\Core\Localization\LanguageServiceFactory
Definition: LanguageServiceFactory.php:25
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\createFakeExtension
‪string createFakeExtension()
Definition: FileHandlingUtilityTest.php:55
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory
‪removeDirectoryDoesNotRemoveContentOfSymlinkedTargetDirectory()
Definition: FileHandlingUtilityTest.php:125
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility
Definition: DependencyUtilityTest.php:18
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirAddsDir
‪makeAndClearExtensionDirAddsDir()
Definition: FileHandlingUtilityTest.php:78
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryRemovesDirectory
‪removeDirectoryRemovesDirectory()
Definition: FileHandlingUtilityTest.php:97
‪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\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\removeDirectoryRemovesSymlink
‪removeDirectoryRemovesSymlink()
Definition: FileHandlingUtilityTest.php:107
‪TYPO3\CMS\Extensionmanager\Utility\FileHandlingUtility
Definition: FileHandlingUtility.php:40
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\extractDirectoriesFromExtensionDataExtractsDirectories
‪extractDirectoriesFromExtensionDataExtractsDirectories()
Definition: FileHandlingUtilityTest.php:265
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest
Definition: FileHandlingUtilityTest.php:33
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\addDirectoryAddsDirectory
‪addDirectoryAddsDirectory()
Definition: FileHandlingUtilityTest.php:88
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory
‪unpackExtensionFromExtensionDataArrayCreatesTheExtensionDirectory()
Definition: FileHandlingUtilityTest.php:145
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\setUp
‪setUp()
Definition: FileHandlingUtilityTest.php:41
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\writeExtensionFilesWritesFiles
‪writeExtensionFilesWritesFiles()
Definition: FileHandlingUtilityTest.php:240
‪TYPO3\CMS\Core\Service\OpcodeCacheService
Definition: OpcodeCacheService.php:27
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray
‪unpackExtensionFromExtensionDataArrayStripsDirectoriesFromFilesArray()
Definition: FileHandlingUtilityTest.php:168
‪TYPO3\CMS\Core\Service\Archive\ZipService
Definition: ZipService.php:29
‪TYPO3\CMS\Core\Core\Environment
Definition: Environment.php:41
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\writeEmConfWritesEmConfFile
‪writeEmConfWritesEmConfFile()
Definition: FileHandlingUtilityTest.php:330
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists
‪makeAndClearExtensionDirRemovesExtensionDirIfAlreadyExists()
Definition: FileHandlingUtilityTest.php:67
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\createDirectoriesForExtensionFilesCreatesDirectories
‪createDirectoriesForExtensionFilesCreatesDirectories()
Definition: FileHandlingUtilityTest.php:314
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\$fakedExtensions
‪array $fakedExtensions
Definition: FileHandlingUtilityTest.php:37
‪TYPO3\CMS\Core\Utility\GeneralUtility
Definition: GeneralUtility.php:52
‪TYPO3\CMS\Core\Utility\StringUtility
Definition: StringUtility.php:24
‪TYPO3\CMS\Extensionmanager\Tests\Unit\Utility\FileHandlingUtilityTest\$testRoot
‪string $testRoot
Definition: FileHandlingUtilityTest.php:39
‪TYPO3\CMS\Core\Utility\StringUtility\getUniqueId
‪static getUniqueId(string $prefix='')
Definition: StringUtility.php:57