2 declare(strict_types = 1);
21 use TYPO3\CMS\Extensionmanager\Utility\EmConfUtility;
23 use TYPO3\TestingFramework\Core\Unit\UnitTestCase;
44 $extKey = strtolower($this->getUniqueId(
'testing'));
46 $relPath =
'typo3temp/var/tests/ext-' . $extKey .
'/';
47 $this->fakedExtensions[$extKey] = [
48 'siteRelPath' => $relPath,
49 'siteAbsPath' => $absExtPath
51 if ($extkeyOnly ===
true) {
54 GeneralUtility::mkdir($absExtPath);
65 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'removeDirectory',
'addDirectory',
'getExtensionDir'], [],
'',
false);
66 $fileHandlerMock->expects($this->once())
67 ->method(
'removeDirectory')
69 $fileHandlerMock->expects($this->any())
70 ->method(
'getExtensionDir')
72 $fileHandlerMock->_call(
'makeAndClearExtensionDir', $extKey);
95 $this->expectException(ExtensionManagerException::class);
96 $this->expectExceptionCode(1350742864);
97 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'dummy'], []);
98 $fileHandlerMock->_call(
'getAbsolutePath', $invalidRelativePath);
120 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'dummy']);
121 $this->assertSame($expectedAbsolutePath, $fileHandlerMock->_call(
'getAbsolutePath', $validRelativePath));
130 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'removeDirectory',
'addDirectory',
'getExtensionDir']);
131 $fileHandlerMock->expects($this->once())
132 ->method(
'addDirectory')
134 $fileHandlerMock->expects($this->any())
135 ->method(
'getExtensionDir')
137 $fileHandlerMock->_call(
'makeAndClearExtensionDir', $extKey);
145 $this->expectException(ExtensionManagerException::class);
146 $this->expectExceptionCode(1337280417);
147 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'removeDirectory',
'addDirectory']);
148 $languageServiceMock = $this->getMockBuilder(LanguageService::class)->getMock();
149 $fileHandlerMock->_set(
'languageService', $languageServiceMock);
150 $fileHandlerMock->_call(
'makeAndClearExtensionDir',
'testing123',
'fakepath');
159 $this->testFilesToDelete[] = $extDirPath;
160 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'dummy']);
161 $fileHandlerMock->_call(
'addDirectory', $extDirPath);
162 $this->assertTrue(is_dir($extDirPath));
172 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'dummy']);
173 $fileHandlerMock->_call(
'removeDirectory', $extDirPath);
174 $this->assertFalse(is_dir($extDirPath));
184 touch($absoluteFilePath);
185 $this->testFilesToDelete[] = $absoluteFilePath;
186 symlink($absoluteFilePath, $absoluteSymlinkPath);
188 $fileHandler->removeDirectory($absoluteSymlinkPath);
189 $this->assertFalse(is_link($absoluteSymlinkPath));
199 $relativeFilePath = $this->getUniqueId(
'test_file_');
201 mkdir($absoluteDirectoryPath);
202 touch($absoluteDirectoryPath . $relativeFilePath);
204 $this->testFilesToDelete[] = $absoluteDirectoryPath . $relativeFilePath;
205 $this->testFilesToDelete[] = $absoluteDirectoryPath;
207 symlink($absoluteDirectoryPath, $absoluteSymlinkPath);
210 $fileHandler->removeDirectory($absoluteSymlinkPath);
211 $this->assertTrue(is_file($absoluteDirectoryPath . $relativeFilePath));
222 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
223 'makeAndClearExtensionDir',
225 'extractFilesArrayFromExtensionData',
226 'extractDirectoriesFromExtensionData',
227 'createDirectoriesForExtensionFiles',
228 'writeExtensionFiles',
229 'reloadPackageInformation',
231 $fileHandlerMock->expects($this->once())->method(
'extractFilesArrayFromExtensionData')->will($this->returnValue([]));
232 $fileHandlerMock->expects($this->once())->method(
'extractDirectoriesFromExtensionData')->will($this->returnValue([]));
233 $fileHandlerMock->expects($this->once())->method(
'makeAndClearExtensionDir')->with($extensionData[
'extKey']);
234 $fileHandlerMock->_call(
'unpackExtensionFromExtensionDataArray', $extensionData);
247 'name' =>
'ChangeLog',
249 'mtime' => 1219448527,
250 'is_executable' =>
false,
251 'content' =>
'some content to write'
256 'mtime' => 1219448527,
257 'is_executable' =>
false,
261 'name' =>
'ChangeLog',
263 'mtime' => 1219448527,
264 'is_executable' =>
false,
265 'content' =>
'some content to write'
270 'name' =>
'ChangeLog',
272 'mtime' => 1219448527,
273 'is_executable' =>
false,
274 'content' =>
'some content to write'
277 'name' =>
'ChangeLog',
279 'mtime' => 1219448527,
280 'is_executable' =>
false,
281 'content' =>
'some content to write'
289 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
290 'makeAndClearExtensionDir',
292 'extractFilesArrayFromExtensionData',
293 'extractDirectoriesFromExtensionData',
294 'createDirectoriesForExtensionFiles',
295 'writeExtensionFiles',
296 'reloadPackageInformation',
298 $fileHandlerMock->expects($this->once())->method(
'extractFilesArrayFromExtensionData')->will($this->returnValue($files));
299 $fileHandlerMock->expects($this->once())->method(
'extractDirectoriesFromExtensionData')->will($this->returnValue($directories));
300 $fileHandlerMock->expects($this->once())->method(
'createDirectoriesForExtensionFiles')->with($directories);
301 $fileHandlerMock->expects($this->once())->method(
'writeExtensionFiles')->with($cleanedFiles);
302 $fileHandlerMock->expects($this->once())->method(
'reloadPackageInformation')->with(
'test');
303 $fileHandlerMock->_call(
'unpackExtensionFromExtensionDataArray', $extensionData);
314 'filename1' =>
'dummycontent',
315 'filename2' =>
'dummycontent2'
318 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'makeAndClearExtensionDir']);
319 $extractedFiles = $fileHandlerMock->_call(
'extractFilesArrayFromExtensionData', $extensionData);
320 $this->assertArrayHasKey(
'filename1', $extractedFiles);
321 $this->assertArrayHasKey(
'filename2', $extractedFiles);
331 'name' =>
'ChangeLog',
333 'mtime' => 1219448527,
334 'is_executable' =>
false,
335 'content' =>
'some content to write'
340 'mtime' => 1219448533,
341 'is_executable' =>
false,
342 'content' =>
'FEEL FREE TO ADD SOME DOCUMENTATION HERE'
345 $rootPath = ($extDirPath = $this->fakedExtensions[$this->
createFakeExtension()][
'siteAbsPath']);
346 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'makeAndClearExtensionDir']);
347 $fileHandlerMock->_call(
'writeExtensionFiles', $files, $rootPath);
348 $this->assertTrue(file_exists($rootPath .
'ChangeLog'));
358 'name' =>
'ChangeLog',
360 'mtime' => 1219448527,
361 'is_executable' =>
false,
362 'content' =>
'some content to write'
367 'mtime' => 1219448527,
368 'is_executable' =>
false,
372 'name' =>
'ChangeLog',
374 'mtime' => 1219448527,
375 'is_executable' =>
false,
376 'content' =>
'some content to write'
381 'mtime' => 1219448533,
382 'is_executable' =>
false,
383 'content' =>
'FEEL FREE TO ADD SOME DOCUMENTATION HERE'
385 'mod/doc/README' => [
388 'mtime' => 1219448533,
389 'is_executable' =>
false,
390 'content' =>
'FEEL FREE TO ADD SOME DOCUMENTATION HERE'
393 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'makeAndClearExtensionDir']);
394 $extractedDirectories = $fileHandlerMock->_call(
'extractDirectoriesFromExtensionData', $files);
399 $this->assertSame($expected, array_values($extractedDirectories));
412 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'makeAndClearExtensionDir']);
413 $this->assertFalse(is_dir($rootPath .
'doc/'));
414 $this->assertFalse(is_dir($rootPath .
'mod/doc/'));
415 $fileHandlerMock->_call(
'createDirectoriesForExtensionFiles', $directories, $rootPath);
416 $this->assertTrue(is_dir($rootPath .
'doc/'));
417 $this->assertTrue(is_dir($rootPath .
'mod/doc/'));
429 'title' =>
'Plugin cache engine',
430 'description' =>
'Provides an interface to cache plugin content elements based on 4.3 caching framework',
431 'category' =>
'Frontend',
434 $rootPath = $this->fakedExtensions[$extKey][
'siteAbsPath'];
435 $emConfUtilityMock = $this->getAccessibleMock(EmConfUtility::class, [
'constructEmConf']);
436 $emConfUtilityMock->expects($this->once())->method(
'constructEmConf')->with($extensionData)->will($this->returnValue(var_export($extensionData[
'EM_CONF'],
true)));
437 $fileHandlerMock = $this->getAccessibleMock(FileHandlingUtility::class, [
'makeAndClearExtensionDir']);
438 $fileHandlerMock->_set(
'emConfUtility', $emConfUtilityMock);
439 $fileHandlerMock->_call(
'writeEmConfToFile', $extensionData, $rootPath);
440 $this->assertTrue(file_exists($rootPath .
'ext_emconf.php'));
449 $fileHandlerMock = $this->getMockBuilder(FileHandlingUtility::class)
450 ->setMethods([
'createNestedDirectory',
'getAbsolutePath',
'directoryExists'])
452 $fileHandlerMock->expects($this->any())
453 ->method(
'getAbsolutePath')
454 ->will($this->returnArgument(0));
455 return $fileHandlerMock;
464 $fileHandlerMock->expects($this->never())
465 ->method(
'createNestedDirectory');
466 $fileHandlerMock->ensureConfiguredDirectoriesExist(
480 $fileHandlerMock->expects($this->never())
481 ->method(
'createNestedDirectory');
482 $fileHandlerMock->ensureConfiguredDirectoriesExist(
496 $fileHandlerMock->expects($this->once())
497 ->method(
'createNestedDirectory')
498 ->with(
'uploads/tx_foobar/');
499 $fileHandlerMock->ensureConfiguredDirectoriesExist(
513 $fileHandlerMock->expects($this->exactly(2))
514 ->method(
'createNestedDirectory')
516 $this->returnCallback(
function ($path) {
517 if (!\in_array($path, [
'foo/bar',
'baz/foo'])) {
518 throw new \Exception(
'Path "' . $path .
'" is not expected to be created', 1476108500);
522 $fileHandlerMock->ensureConfiguredDirectoriesExist(
525 'createDirs' =>
'foo/bar, baz/foo',
536 $fileHandlerMock->expects($this->exactly(3))
537 ->method(
'directoryExists')
538 ->will($this->returnValue(
true));
539 $fileHandlerMock->expects($this->never())
540 ->method(
'createNestedDirectory');
541 $fileHandlerMock->ensureConfiguredDirectoriesExist(
545 'createDirs' =>
'foo/bar, baz/foo',
562 $extensionRoot = $this->fakedExtensions[$extKey][
'siteAbsPath'];
565 $fileHandlerMock = $this->getAccessibleMock(
566 FileHandlingUtility::class,
567 [
'getAbsoluteExtensionPath',
'getExtensionVersion']
569 $fileHandlerMock->expects($this->any())
570 ->method(
'getAbsoluteExtensionPath')
571 ->will($this->returnValue($extensionRoot));
572 $fileHandlerMock->expects($this->any())
573 ->method(
'getExtensionVersion')
574 ->will($this->returnValue(
'0.0.0'));
577 touch($extensionRoot .
'emptyFile.txt');
578 file_put_contents($extensionRoot .
'notEmptyFile.txt',
'content');
579 touch($extensionRoot .
'.hiddenFile');
580 mkdir($extensionRoot .
'emptyDir');
581 mkdir($extensionRoot .
'notEmptyDir');
582 touch($extensionRoot .
'notEmptyDir/file.txt');
585 $filename = $fileHandlerMock->_call(
'createZipFileFromExtension', $extKey);
588 $this->testFilesToDelete[] = $filename;
589 $this->assertEquals($expectedFilename, $filename,
'Archive file name differs from expectation');
592 $this->assertTrue(file_exists($filename),
'Zip file not created');
595 $archive = new \ZipArchive();
596 $this->assertTrue($archive->open($filename),
'Unable to open archive');
597 $this->assertEquals($archive->statName(
'emptyFile.txt')[
'size'], 0,
'Empty file not in archive');
598 $this->assertEquals($archive->getFromName(
'notEmptyFile.txt'),
'content',
'Expected content not found');
599 $this->assertFalse($archive->statName(
'.hiddenFile'),
'Hidden file not in archive');
600 $this->assertTrue(is_array($archive->statName(
'emptyDir/')),
'Empty directory not in archive');
601 $this->assertTrue(is_array($archive->statName(
'notEmptyDir/')),
'Not empty directory not in archive');
602 $this->assertTrue(is_array($archive->statName(
'notEmptyDir/file.txt')),
'File within directory not in archive');
605 $this->assertEquals($archive->numFiles, 5,
'Too many or too less files in archive');