![]() 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/framework/View/Test/Unit/Design/Theme/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); /** * Test theme image model */ namespace Magento\Framework\View\Test\Unit\Design\Theme; use Magento\Framework\App\Area; use Magento\Framework\App\Filesystem\DirectoryList; use Magento\Framework\App\ObjectManager as AppObjectManager; use Magento\Framework\Filesystem; use Magento\Framework\Filesystem\Directory\ReadInterface; use Magento\Framework\Filesystem\Directory\Write; use Magento\Framework\Image\Factory; use Magento\Framework\ObjectManagerInterface; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Framework\View\Design\Theme\Image; use Magento\Framework\View\Design\Theme\Image\Uploader; use Magento\Framework\View\Design\ThemeInterface; use Magento\Theme\Model\Theme; use Magento\Theme\Model\Theme\Image\Path; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; use Psr\Log\LoggerInterface; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class ImageTest extends TestCase { /** * @var Image */ protected $_model; /** * @var Filesystem|MockObject */ protected $_filesystemMock; /** * @var \Magento\Framework\Image|MockObject */ protected $_imageMock; /** * @var Uploader|MockObject */ protected $_uploaderMock; /** * @var Theme|MockObject */ protected $_themeMock; /** * @var Write|MockObject */ protected $_mediaDirectoryMock; /** * @var Write|MockObject */ protected $_rootDirectoryMock; /** * @var MockObject|Path */ protected $imagePathMock; /** * @return void */ private function setupObjectManagerForCheckImageExist($return): void { $objectManagerMock = $this->getMockForAbstractClass(ObjectManagerInterface::class); $mockFileSystem = $this->createMock(Filesystem::class); $mockRead = $this->createMock(ReadInterface::class); $objectManagerMock->method($this->logicalOr('get', 'create'))->willReturn($mockFileSystem); $mockFileSystem->method('getDirectoryRead')->willReturn($mockRead); $mockRead->method('isExist')->willReturn($return); AppObjectManager::setInstance($objectManagerMock); } /** * @inheritdoc */ protected function setUp(): void { $this->setupObjectManagerForCheckImageExist(false); $this->_mediaDirectoryMock = $this->createPartialMock( Write::class, ['isExist', 'copyFile', 'getRelativePath', 'delete'] ); $this->_rootDirectoryMock = $this->createPartialMock( Write::class, ['isExist', 'copyFile', 'getRelativePath', 'delete'] ); $this->_filesystemMock = $this->getMockBuilder(Filesystem::class) ->addMethods(['delete']) ->onlyMethods(['getDirectoryWrite']) ->disableOriginalConstructor() ->getMock(); $this->_filesystemMock ->method('getDirectoryWrite') ->withConsecutive([DirectoryList::MEDIA], [DirectoryList::ROOT]) ->willReturnOnConsecutiveCalls($this->_mediaDirectoryMock, $this->_rootDirectoryMock); $imageFactory = $this->createMock(Factory::class); $this->_imageMock = $this->createMock(\Magento\Framework\Image::class); $imageFactory->expects($this->any())->method('create')->willReturn($this->_imageMock); $logger = $this->getMockForAbstractClass(LoggerInterface::class); $this->_themeMock = $this->getMockBuilder(Theme::class) ->disableOriginalConstructor() ->addMethods(['getPreviewImage']) ->getMock(); $this->_uploaderMock = $this->createMock(Uploader::class); $this->imagePathMock = $this->_getImagePathMock(); $objectManager = new ObjectManager($this); $this->_model = $objectManager->getObject( Image::class, [ 'filesystem' => $this->_filesystemMock, 'imageFactory' => $imageFactory, 'uploader' => $this->_uploaderMock, 'themeImagePath' => $this->imagePathMock, 'logger' => $logger, 'theme' => $this->_themeMock ] ); } /** * @inheritdoc */ protected function tearDown(): void { $this->_model = null; $this->_filesystemMock = null; $this->_imageMock = null; $this->_uploaderMock = null; $this->_themeMock = null; } /** * @return MockObject|Path */ protected function _getImagePathMock(): Path { $imagePathMock = $this->createMock(Path::class); $testBaseUrl = 'http://localhost/media_path/'; $imagePathMock->expects($this->any()) ->method('getPreviewImageDefaultUrl') ->willReturn($testBaseUrl . 'test_default_preview.png'); $testBaseDir = '/media_path/'; $imagePathMock->expects($this->any()) ->method('getImagePreviewDirectory') ->willReturn($testBaseDir . 'theme/preview'); $imagePathMock->expects($this->any()) ->method('getTemporaryDirectory') ->willReturn($testBaseDir . 'tmp'); return $imagePathMock; } /** * Sample theme data. * * @return array */ protected function _getThemeSampleData(): array { return [ 'theme_id' => 1, 'theme_title' => 'Sample theme', 'preview_image' => 'images/preview.png', 'area' => Area::AREA_FRONTEND, 'type' => ThemeInterface::TYPE_VIRTUAL ]; } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::__construct */ public function testConstructor(): void { $this->assertNotEmpty($this->_model); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::createPreviewImage */ public function testCreatePreviewImage(): void { $this->_themeMock->method('getPreviewImage')->willReturn(null); $this->_imageMock->expects( $this->once() )->method( 'save' )->with( '/media_path/theme/preview', $this->anything() ); $this->_imageMock->expects($this->any()) ->method('getImageType') ->willReturn(1); $this->_model->createPreviewImage('/some/path/to/image.png'); $this->assertNotNull($this->_themeMock->getData('preview_image')); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::createPreviewImageCopy */ public function testCreatePreviewImageCopy(): void { $previewImage = 'test_preview.png'; $relativePath = '/media_path/theme/preview/test_preview.png'; $this->_themeMock->method('getPreviewImage')->willReturn($previewImage); $this->_mediaDirectoryMock->expects($this->once()) ->method('getRelativePath') ->willReturnArgument(0); $this->_rootDirectoryMock->expects($this->once()) ->method('getRelativePath') ->with($previewImage) ->willReturn($relativePath); $this->_rootDirectoryMock->expects($this->once()) ->method('copyFile') ->with($relativePath, $this->anything()) ->willReturn(true); $themeImageMock = $this->getMockBuilder(Image::class)->disableOriginalConstructor() ->onlyMethods(['getPreviewImagePath']) ->getMock(); $themeImageMock->expects($this->atLeastOnce()) ->method('getPreviewImagePath') ->willReturn($previewImage); $themeMock = $this->getMockBuilder(Theme::class)->disableOriginalConstructor() ->onlyMethods(['getThemeImage']) ->addMethods(['getPreviewImage']) ->getMock(); $themeMock->expects($this->atLeastOnce()) ->method('getPreviewImage') ->willReturn($previewImage); $themeMock->expects($this->atLeastOnce()) ->method('getThemeImage') ->willReturn($themeImageMock); $this->assertTrue($this->_model->createPreviewImageCopy($themeMock)); $this->assertEquals($previewImage, $this->_themeMock->getData('preview_image')); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::removePreviewImage */ public function testRemovePreviewImage(): void { $this->_themeMock->method('getPreviewImage')->willReturn('test.png'); $this->_mediaDirectoryMock->expects($this->once())->method('delete'); $this->_model->removePreviewImage(); $this->assertNull($this->_themeMock->getData('preview_image')); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::removePreviewImage */ public function testRemoveEmptyPreviewImage(): void { $this->_themeMock->method('getPreviewImage')->willReturn(null); $this->_filesystemMock->expects($this->never())->method('delete'); $this->_model->removePreviewImage(); $this->assertNull($this->_themeMock->getData('preview_image')); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::uploadPreviewImage */ public function testUploadPreviewImage(): void { $scope = 'test_scope'; $tmpFilePath = '/media_path/tmp/temporary.png'; $this->_imageMock->method('getImageType') ->willReturn(0); // PHP 8.1 compatibility $this->_themeMock->method('getPreviewImage')->willReturn('test.png'); $this->_uploaderMock->expects($this->once()) ->method('uploadPreviewImage') ->with($scope, '/media_path/tmp') ->willReturn($tmpFilePath); $this->_mediaDirectoryMock ->method('getRelativePath') ->willReturnArgument(0); $this->_mediaDirectoryMock ->method('delete') ->withConsecutive( [$this->stringContains('test.png')], [$tmpFilePath] ); $this->_model->uploadPreviewImage($scope); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::getPreviewImageUrl */ public function testGetPreviewImageUrl(): void { $this->_themeMock->method('getPreviewImage') ->willReturn('...'); $this->imagePathMock->expects($this->any()) ->method('getPreviewImageUrl') ->with($this->_themeMock) ->willReturn('http://localhost/media_path/preview/image.png'); $this->assertEquals('http://localhost/media_path/preview/image.png', $this->_model->getPreviewImageUrl()); } /** * @return void * * @covers \Magento\Framework\View\Design\Theme\Image::getPreviewImageUrl */ public function testGetDefaultPreviewImageUrl(): void { $this->_themeMock->method('getPreviewImage')->willReturn(null); $this->assertEquals( 'http://localhost/media_path/test_default_preview.png', $this->_model->getPreviewImageUrl() ); } }