![]() 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/Design/Backend/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Theme\Test\Unit\Model\Design\Backend; use Magento\Config\Model\Config\Backend\File\RequestData\RequestDataInterface; use Magento\Framework\App\Cache\TypeListInterface; use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Data\Collection\AbstractDb; use Magento\Framework\File\Mime; use Magento\Framework\Filesystem; use Magento\Framework\Filesystem\Directory\WriteInterface; use Magento\Framework\Filesystem\Io\File as IoFileSystem; use Magento\Framework\Model\Context; use Magento\Framework\Model\ResourceModel\AbstractResource; use Magento\Framework\Registry; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Framework\UrlInterface; use Magento\MediaStorage\Helper\File\Storage\Database; use Magento\Theme\Model\Design\Backend\File; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class FileTest extends TestCase { /** @var WriteInterface|MockObject */ private $mediaDirectory; /** @var UrlInterface|MockObject */ private $urlBuilder; /** @var File */ private $fileBackend; /** @var IoFileSystem|\PHPUnit\Framework\MockObject\MockObject */ private $ioFileSystem; /** * @var Mime|MockObject */ private $mime; /** * @var Database|MockObject */ private $databaseHelper; /** * @inheritdoc */ protected function setUp(): void { $context = $this->getMockObject(Context::class); $registry = $this->getMockObject(Registry::class); $config = $this->getMockObjectForAbstractClass(ScopeConfigInterface::class); $cacheTypeList = $this->getMockObjectForAbstractClass(TypeListInterface::class); $uploaderFactory = $this->getMockObject(\Magento\MediaStorage\Model\File\UploaderFactory::class, ['create']); $requestData = $this->getMockObjectForAbstractClass( RequestDataInterface::class ); $filesystem = $this->getMockBuilder(Filesystem::class) ->disableOriginalConstructor() ->getMock(); $this->mediaDirectory = $this->getMockBuilder( WriteInterface::class ) ->getMockForAbstractClass(); $filesystem->expects($this->once()) ->method('getDirectoryWrite') ->with(DirectoryList::MEDIA) ->willReturn($this->mediaDirectory); $this->urlBuilder = $this->getMockBuilder(UrlInterface::class) ->getMockForAbstractClass(); $this->ioFileSystem = $this->getMockBuilder(IoFileSystem::class) ->getMockForAbstractClass(); $this->mime = $this->getMockBuilder(Mime::class) ->disableOriginalConstructor() ->getMock(); $this->databaseHelper = $this->getMockBuilder(Database::class) ->disableOriginalConstructor() ->getMock(); $abstractResource = $this->getMockBuilder(AbstractResource::class) ->getMockForAbstractClass(); $abstractDb = $this->getMockBuilder(AbstractDb::class) ->disableOriginalConstructor() ->getMockForAbstractClass(); $this->fileBackend = new File( $context, $registry, $config, $cacheTypeList, $uploaderFactory, $requestData, $filesystem, $this->urlBuilder, $abstractResource, $abstractDb, [], $this->databaseHelper, $this->ioFileSystem ); $objectManager = new ObjectManager($this); $objectManager->setBackwardCompatibleProperty( $this->fileBackend, 'mime', $this->mime ); } /** * @inheritdoc */ protected function tearDown(): void { unset($this->fileBackend); } /** * Gets the mock object. * * @param string $class * @param array $methods * @return MockObject */ private function getMockObject(string $class, array $methods = []): \PHPUnit\Framework\MockObject\MockObject { $builder = $this->getMockBuilder($class) ->disableOriginalConstructor(); if (count($methods)) { $builder->setMethods($methods); } return $builder->getMock(); } /** * Gets mock objects for abstract class. * * @param string $class * @return MockObject */ private function getMockObjectForAbstractClass(string $class): \PHPUnit\Framework\MockObject\MockObject { return $this->getMockBuilder($class) ->getMockForAbstractClass(); } /** * Test for afterLoad method. */ public function testAfterLoad() { $value = 'filename.jpg'; $mime = 'image/jpg'; $absoluteFilePath = '/absolute_path/' . $value; $this->fileBackend->setData( [ 'value' => $value, 'field_config' => [ 'upload_dir' => [ 'value' => 'value', 'config' => 'system/filesystem/media', ], 'base_url' => [ 'type' => 'media', 'value' => 'design/file' ], ], ] ); $this->mediaDirectory->expects($this->once()) ->method('isExist') ->with('value/' . $value) ->willReturn(true); $this->mediaDirectory->expects($this->once()) ->method('getAbsolutePath') ->with('value/' . $value) ->willReturn($absoluteFilePath); $this->urlBuilder->expects($this->once()) ->method('getBaseUrl') ->with(['_type' => UrlInterface::URL_TYPE_MEDIA]) ->willReturn('http://magento2.com/media/'); $this->mediaDirectory->expects($this->once()) ->method('getRelativePath') ->with('value') ->willReturn('value'); $this->mediaDirectory->expects($this->once()) ->method('stat') ->with('value/' . $value) ->willReturn(['size' => 234234]); $this->mime->expects($this->once()) ->method('getMimeType') ->with($absoluteFilePath) ->willReturn($mime); $this->fileBackend->afterLoad(); $this->assertEquals( [ [ 'url' => 'http://magento2.com/media/design/file/' . $value, 'file' => $value, 'size' => 234234, 'exists' => true, 'name' => $value, 'type' => $mime, ] ], $this->fileBackend->getValue() ); } /** * Test for beforeSave method. * * @dataProvider beforeSaveDataProvider * @param string $fileName * @throws LocalizedException */ public function testBeforeSave(string $fileName) { $expectedFileName = basename($fileName); $expectedTmpMediaPath = 'tmp/design/file/' . $expectedFileName; $this->fileBackend->setData( [ 'scope' => 'store', 'scope_id' => 1, 'value' => [ [ 'url' => 'http://magento2.com/media/tmp/image/' . $fileName, 'file' => $fileName, 'size' => 234234, ] ], 'field_config' => [ 'upload_dir' => [ 'value' => 'value', 'config' => 'system/filesystem/media', ], ], ] ); $this->databaseHelper->expects($this->once()) ->method('renameFile') ->with($expectedTmpMediaPath, '/' . $expectedFileName) ->willReturn(true); $this->mediaDirectory->expects($this->once()) ->method('copyFile') ->with($expectedTmpMediaPath, '/' . $expectedFileName) ->willReturn(true); $this->mediaDirectory->expects($this->once()) ->method('delete') ->with($expectedTmpMediaPath); $this->fileBackend->beforeSave(); $this->assertEquals($expectedFileName, $this->fileBackend->getValue()); } /** * Data provider for testBeforeSave. * * @return array */ public function beforeSaveDataProvider(): array { return [ 'Normal file name' => ['filename.jpg'], 'Vulnerable file name' => ['../../../../../../../../etc/pass'], ]; } public function testBeforeSaveWithoutFile() { $this->expectException('Magento\Framework\Exception\LocalizedException'); $this->expectExceptionMessage('header_logo_src does not contain field \'file\''); $this->fileBackend->setData( [ 'value' => [ 'test' => '' ], 'field_config' => [ 'field' => 'header_logo_src' ], ] ); $this->fileBackend->beforeSave(); } /** * Test for beforeSave method with existing file. * * @throws LocalizedException */ public function testBeforeSaveWithExistingFile() { $value = 'filename.jpg'; $this->fileBackend->setData( [ 'value' => [ [ 'url' => 'http://magento2.com/media/tmp/image/' . $value, 'file' => $value, 'size' => 234234, 'exists' => true ] ], ] ); $this->fileBackend->beforeSave(); $this->assertEquals( $value, $this->fileBackend->getValue() ); } /** * Test for getRelativeMediaPath method. * * @param string $path * @param string $filename * @dataProvider getRelativeMediaPathDataProvider * @throws \ReflectionException */ public function testGetRelativeMediaPath(string $path, string $filename) { $reflection = new \ReflectionClass($this->fileBackend); $method = $reflection->getMethod('getRelativeMediaPath'); $method->setAccessible(true); $this->assertEquals( $filename, $method->invoke($this->fileBackend, $path . $filename) ); } /** * Data provider for testGetRelativeMediaPath. * * @return array */ public function getRelativeMediaPathDataProvider(): array { return [ 'Normal path' => ['pub/media/', 'filename.jpg'], 'Complex path' => ['some_path/media/', 'filename.jpg'], ]; } }