![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/old/vendor/magento/module-theme/Test/Unit/Model/Wysiwyg/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); /** * Storage model test */ namespace Magento\Theme\Test\Unit\Model\Wysiwyg; use Magento\Backend\Model\Session; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Filesystem; use Magento\Framework\Filesystem\Directory\Write; use Magento\Framework\Filesystem\DriverInterface; use Magento\Framework\Filesystem\Io\File; use Magento\Framework\Image\Adapter\Gd2; use Magento\Framework\Image\AdapterFactory; use Magento\Framework\ObjectManagerInterface; use Magento\Framework\Url\DecoderInterface; use Magento\Framework\Url\EncoderInterface; use Magento\MediaStorage\Model\File\Uploader; use Magento\Theme\Helper\Storage as HelperStorage; use Magento\Theme\Model\Wysiwyg\Storage; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use ReflectionClass; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class StorageTest extends TestCase { /** * @var string */ protected $storageRoot; /** * @var Filesystem|MockObject */ protected $filesystem; /** * @var HelperStorage|MockObject */ protected $helperStorage; /** * @var ObjectManagerInterface */ protected $objectManager; /** * @var null|Storage */ protected $storageModel; /** * @var AdapterFactory|MockObject */ protected $imageFactory; /** * @var Write|MockObject */ protected $directoryWrite; /** * @var EncoderInterface|MockObject */ protected $urlEncoder; /** * @var DecoderInterface|MockObject */ protected $urlDecoder; /** * @var DriverInterface|MockObject */ private $filesystemDriver; /** * @inheritdoc */ protected function setUp(): void { $this->filesystem = $this->createMock(Filesystem::class); $file = $this->createPartialMock(File::class, ['getPathInfo']); $file->expects($this->any()) ->method('getPathInfo') ->willReturnCallback( function ($path) { return pathinfo($path); } ); $this->helperStorage = $this->getMockBuilder(HelperStorage::class) ->addMethods(['urlEncode']) ->onlyMethods( [ 'getStorageType', 'getCurrentPath', 'getStorageRoot', 'getShortFilename', 'getSession', 'convertPathToId', 'getRequestParams' ] ) ->disableOriginalConstructor() ->getMock(); $reflection = new ReflectionClass(HelperStorage::class); $reflection_property = $reflection->getProperty('file'); $reflection_property->setAccessible(true); $reflection_property->setValue($this->helperStorage, $file); $this->objectManager = $this->getMockForAbstractClass(ObjectManagerInterface::class); $this->imageFactory = $this->createMock(AdapterFactory::class); $this->directoryWrite = $this->createMock(Write::class); $this->urlEncoder = $this->createPartialMock(EncoderInterface::class, ['encode']); $this->urlDecoder = $this->createPartialMock(DecoderInterface::class, ['decode']); $this->filesystemDriver = $this->createMock(DriverInterface::class); $this->filesystem->expects($this->once()) ->method('getDirectoryWrite') ->willReturn($this->directoryWrite); $this->storageModel = new Storage( $this->filesystem, $this->helperStorage, $this->objectManager, $this->imageFactory, $this->urlEncoder, $this->urlDecoder, null, $this->filesystemDriver ); $this->storageRoot = '/root'; } /** * @inheritdoc */ protected function tearDown(): void { $this->filesystem = null; $this->helperStorage = null; $this->objectManager = null; $this->storageModel = null; $this->storageRoot = null; } /** * @return void * cover Storage::_createThumbnail * cover Storage::uploadFile */ public function testUploadFile(): void { $uploader = $this->prepareUploader(); $uploader->expects($this->once())->method('save')->willReturn(['not_empty', 'path' => 'absPath']); $this->helperStorage->expects($this->any()) ->method('getStorageType') ->willReturn(Storage::TYPE_IMAGE); /** Prepare filesystem */ $this->directoryWrite->expects($this->any())->method('isFile')->willReturn(true); $this->directoryWrite->expects($this->once())->method('isReadable')->willReturn(true); /** Prepare image */ $image = $this->createMock(Gd2::class); $image->expects($this->once())->method('open')->willReturn(true); $image->expects($this->once())->method('keepAspectRatio')->willReturn(true); $image->expects($this->once())->method('resize')->willReturn(true); $image->expects($this->once())->method('save')->willReturn(true); $this->imageFactory ->method('create') ->willReturn($image); /** Prepare session */ $session = $this->createMock(Session::class); $this->helperStorage->expects($this->any())->method('getSession')->willReturn($session); $expectedResult = ['not_empty']; $this->assertEquals($expectedResult, $this->storageModel->uploadFile($this->storageRoot)); } /** * @return void * cover Storage::uploadFile */ public function testUploadInvalidFile(): void { $this->expectException('Magento\Framework\Exception\LocalizedException'); $uploader = $this->prepareUploader(); $uploader->expects($this->once())->method('save')->willReturn(null); $this->storageModel->uploadFile($this->storageRoot); } /** * @return MockObject */ protected function prepareUploader(): MockObject { $uploader = $this->createMock(Uploader::class); $this->objectManager->expects($this->once())->method('create')->willReturn($uploader); $uploader->expects($this->once())->method('setAllowedExtensions')->willReturn($uploader); $uploader->expects($this->once())->method('setAllowRenameFiles')->willReturn($uploader); $uploader->expects($this->once())->method('setFilesDispersion')->willReturn($uploader); return $uploader; } /** * @return void * @dataProvider booleanCasesDataProvider * cover Storage::createFolder */ public function testCreateFolder($isWritable): void { $newDirectoryName = 'dir1'; $fullNewPath = $this->storageRoot . '/' . $newDirectoryName; $this->directoryWrite->expects($this->any()) ->method('isWritable') ->with($this->storageRoot) ->willReturn($isWritable); $this->directoryWrite->expects($this->once()) ->method('isExist') ->with($fullNewPath) ->willReturn(false); $this->helperStorage->expects($this->once()) ->method('getShortFilename') ->with($newDirectoryName) ->willReturn($newDirectoryName); $this->helperStorage->expects($this->once()) ->method('convertPathToId') ->with($fullNewPath) ->willReturn($newDirectoryName); $this->helperStorage->expects($this->any()) ->method('getStorageRoot') ->willReturn($this->storageRoot); $expectedResult = [ 'name' => $newDirectoryName, 'short_name' => $newDirectoryName, 'path' => '/' . $newDirectoryName, 'id' => $newDirectoryName ]; $this->assertEquals( $expectedResult, $this->storageModel->createFolder($newDirectoryName, $this->storageRoot) ); } /** * @return void * cover Storage::createFolder */ public function testCreateFolderWithInvalidName(): void { $this->expectException('Magento\Framework\Exception\LocalizedException'); $newDirectoryName = 'dir2!#$%^&'; $this->storageModel->createFolder($newDirectoryName, $this->storageRoot); } /** * @return void * cover Storage::createFolder */ public function testCreateFolderDirectoryAlreadyExist(): void { $this->expectException('Magento\Framework\Exception\LocalizedException'); $newDirectoryName = 'mew'; $fullNewPath = $this->storageRoot . '/' . $newDirectoryName; $this->directoryWrite->expects($this->any()) ->method('isWritable') ->with($this->storageRoot) ->willReturn(true); $this->directoryWrite->expects($this->once()) ->method('isExist') ->with($fullNewPath) ->willReturn(true); $this->storageModel->createFolder($newDirectoryName, $this->storageRoot); } /** * @return void * cover Storage::getDirsCollection */ public function testGetDirsCollection(): void { $dirs = [$this->storageRoot . '/dir1', $this->storageRoot . '/dir2']; $this->directoryWrite ->method('isExist') ->with($this->storageRoot) ->willReturn(true); $this->directoryWrite->expects($this->once())->method('search')->willReturn($dirs); $this->directoryWrite->expects($this->any())->method('isDirectory')->willReturn(true); $this->assertEquals($dirs, $this->storageModel->getDirsCollection($this->storageRoot)); } /** * @return void * cover Storage::getDirsCollection */ public function testGetDirsCollectionWrongDirName(): void { $this->expectException('Magento\Framework\Exception\LocalizedException'); $this->directoryWrite->expects($this->once()) ->method('isExist') ->with($this->storageRoot) ->willReturn(false); $this->storageModel->getDirsCollection($this->storageRoot); } /** * @return void * cover Storage::getFilesCollection */ public function testGetFilesCollection(): void { $this->helperStorage->expects($this->once()) ->method('getCurrentPath') ->willReturn($this->storageRoot); $this->helperStorage->expects($this->once()) ->method('getStorageType') ->willReturn(Storage::TYPE_FONT); $this->helperStorage->expects($this->any())->method('urlEncode')->willReturnArgument(0); $paths = [$this->storageRoot . '/' . 'font1.ttf', $this->storageRoot . '/' . 'font2.ttf']; $this->directoryWrite->expects($this->once())->method('search')->willReturn($paths); $this->directoryWrite->expects($this->any())->method('isFile')->willReturn(true); $result = $this->storageModel->getFilesCollection(); $this->assertCount(2, $result); $this->assertEquals('font1.ttf', $result[0]['text']); $this->assertEquals('font2.ttf', $result[1]['text']); } /** * @return void * cover Storage::getFilesCollection */ public function testGetFilesCollectionImageType(): void { $this->helperStorage->expects($this->once())->method('getCurrentPath')->willReturn($this->storageRoot); $this->helperStorage->expects($this->once())->method('getStorageType')->willReturn(Storage::TYPE_IMAGE); $this->helperStorage->expects($this->any())->method('urlEncode')->willReturnArgument(0); $paths = [$this->storageRoot . '/picture1.jpg']; $this->directoryWrite->expects($this->once())->method('search')->willReturn($paths); $this->directoryWrite->expects($this->once()) ->method('isFile') ->with($this->storageRoot . '/picture1.jpg') ->willReturn(true); $result = $this->storageModel->getFilesCollection(); $this->assertCount(1, $result); $this->assertEquals('picture1.jpg', $result[0]['text']); $this->assertEquals('picture1.jpg', $result[0]['thumbnailParams']['file']); } /** * @return void * cover Storage::getTreeArray */ public function testTreeArray(): void { $currentPath = $this->storageRoot . '/dir'; $dirs = [$currentPath . '/dir_one', $currentPath . '/dir_two']; $expectedResult = [ ['text' => pathinfo($dirs[0], PATHINFO_BASENAME), 'id' => $dirs[0], 'cls' => 'folder'], ['text' => pathinfo($dirs[1], PATHINFO_BASENAME), 'id' => $dirs[1], 'cls' => 'folder'] ]; $this->directoryWrite->expects($this->once())->method('isExist')->with($currentPath)->willReturn(true); $this->directoryWrite->expects($this->once())->method('search')->willReturn($dirs); $this->directoryWrite->expects($this->any())->method('isDirectory')->willReturn(true); $this->helperStorage->expects($this->once())->method('getCurrentPath')->willReturn($currentPath); $this->helperStorage->expects($this->any())->method('getShortFilename')->willReturnArgument(0); $this->helperStorage->expects($this->any())->method('convertPathToId')->willReturnArgument(0); $result = $this->storageModel->getTreeArray(); $this->assertEquals($expectedResult, $result); } /** * @return void * @cover Storage::deleteFile */ public function testDeleteFile(): void { $image = 'image.jpg'; $this->helperStorage->expects($this->once()) ->method('getCurrentPath') ->willReturn($this->storageRoot); $this->urlDecoder->expects($this->any()) ->method('decode') ->with($image) ->willReturnArgument(0); $this->directoryWrite ->method('getRelativePath') ->withConsecutive([$this->storageRoot], [$this->storageRoot . '/' . $image]) ->willReturnOnConsecutiveCalls($this->storageRoot, $this->storageRoot . '/' . $image); $this->helperStorage->expects($this->once()) ->method('getStorageRoot') ->willReturn('/'); $this->directoryWrite->expects($this->any())->method('delete'); $this->assertInstanceOf(Storage::class, $this->storageModel->deleteFile($image)); } /** * @return void * cover Storage::deleteDirectory * @throws LocalizedException */ public function testDeleteDirectory(): void { $directoryPath = $this->storageRoot . '/../root'; $this->helperStorage->expects($this->atLeastOnce()) ->method('getStorageRoot') ->willReturn($this->storageRoot); $this->directoryWrite->expects($this->once())->method('delete')->with($directoryPath); $this->directoryWrite->expects($this->once())->method('getAbsolutePath')->willreturn(''); $this->filesystemDriver->expects($this->once()) ->method('getRealPathSafety') ->with('') ->willReturn(''); $this->storageModel->deleteDirectory($directoryPath); } /** * @return void * cover Storage::deleteDirectory */ public function testDeleteRootDirectory(): void { $this->expectException('Magento\Framework\Exception\LocalizedException'); $directoryPath = $this->storageRoot; $this->helperStorage->expects($this->atLeastOnce()) ->method('getStorageRoot') ->willReturn($this->storageRoot); $this->filesystemDriver->expects($this->once()) ->method('getRealPathSafety') ->with('') ->willReturn(''); $this->storageModel->deleteDirectory($directoryPath); } /** * @return void * cover Storage::deleteDirectory */ public function testDeleteRootDirectoryRelative(): void { $this->expectException( LocalizedException::class ); $directoryPath = $this->storageRoot; $fakePath = 'fake/relative/path'; $this->directoryWrite->method('getAbsolutePath') ->with($fakePath) ->willReturn($directoryPath); $this->filesystemDriver->method('getRealPathSafety') ->with($directoryPath) ->willReturn($directoryPath); $this->helperStorage ->method('getStorageRoot') ->willReturn($directoryPath); $this->storageModel->deleteDirectory($fakePath); } /** * @return array */ public function booleanCasesDataProvider(): array { return [[true], [false]]; } }