![]() 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-downloadable/Test/Unit/Model/ |
<?php /** * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ declare(strict_types=1); namespace Magento\Downloadable\Test\Unit\Model; use Magento\Catalog\Model\Product; use Magento\Catalog\Model\ProductRepository; use Magento\Downloadable\Api\Data\File\ContentUploaderInterface; use Magento\Downloadable\Api\Data\SampleInterface; use Magento\Downloadable\Api\Data\SampleInterfaceFactory; use Magento\Downloadable\Model\Product\Type; use Magento\Downloadable\Model\Product\TypeHandler\Sample; use Magento\Downloadable\Model\Sample\ContentValidator; use Magento\Downloadable\Model\SampleFactory; use Magento\Downloadable\Model\SampleRepository; use Magento\Framework\EntityManager\EntityMetadataInterface; use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\Json\EncoderInterface; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class SampleRepositoryTest extends TestCase { /** * @var MockObject */ protected $repositoryMock; /** * @var MockObject */ protected $productTypeMock; /** * @var MockObject */ protected $contentValidatorMock; /** * @var MockObject */ protected $contentUploaderMock; /** * @var MockObject */ protected $jsonEncoderMock; /** * @var MockObject */ protected $sampleFactoryMock; /** * @var MockObject */ protected $productMock; /** * @var SampleRepository */ protected $service; /** * @var MockObject */ protected $sampleDataObjectFactory; /** * @var MockObject */ protected $metadataPoolMock; /** * @var MockObject */ protected $sampleHandlerMock; /** * @var MockObject */ protected $entityMetadataMock; protected function setUp(): void { $this->productMock = $this->getMockBuilder(Product::class) ->addMethods(['setDownloadableData']) ->onlyMethods(['__wakeup', 'getTypeId', 'save', 'getId', 'getStoreId', 'getData']) ->disableOriginalConstructor() ->getMock(); $this->repositoryMock = $this->createMock(ProductRepository::class); $this->productTypeMock = $this->createMock(Type::class); $this->contentValidatorMock = $this->createMock(ContentValidator::class); $this->contentUploaderMock = $this->createMock( ContentUploaderInterface::class ); $this->jsonEncoderMock = $this->createMock( EncoderInterface::class ); $this->sampleFactoryMock = $this->createPartialMock( SampleFactory::class, ['create'] ); $this->productTypeMock = $this->getMockBuilder(Type::class) ->disableOriginalConstructor() ->getMock(); $this->sampleDataObjectFactory = $this->getMockBuilder( SampleInterfaceFactory::class )->setMethods(['create']) ->disableOriginalConstructor() ->getMock(); $this->service = new SampleRepository( $this->repositoryMock, $this->productTypeMock, $this->sampleDataObjectFactory, $this->contentValidatorMock, $this->contentUploaderMock, $this->jsonEncoderMock, $this->sampleFactoryMock ); $this->entityMetadataMock = $this->getMockBuilder( EntityMetadataInterface::class )->getMockForAbstractClass(); $linkRepository = new \ReflectionClass(get_class($this->service)); $metadataPoolProperty = $linkRepository->getProperty('metadataPool'); $this->metadataPoolMock = $this->getMockBuilder( MetadataPool::class )->disableOriginalConstructor() ->getMock(); $metadataPoolProperty->setAccessible(true); $metadataPoolProperty->setValue( $this->service, $this->metadataPoolMock ); $saveHandlerProperty = $linkRepository->getProperty('sampleTypeHandler'); $this->sampleHandlerMock = $this->getMockBuilder( Sample::class )->disableOriginalConstructor() ->getMock(); $saveHandlerProperty->setAccessible(true); $saveHandlerProperty->setValue( $this->service, $this->sampleHandlerMock ); $this->metadataPoolMock ->method('getMetadata')->willReturn($this->entityMetadataMock); } /** * @param array $sampleData * @return MockObject */ protected function getSampleMock(array $sampleData) { $sampleMock = $this->getMockForAbstractClass(SampleInterface::class); if (isset($sampleData['id'])) { $sampleMock->method('getId')->willReturn($sampleData['id']); } $sampleMock->method('getTitle')->willReturn($sampleData['title']); $sampleMock->method('getSortOrder')->willReturn( $sampleData['sort_order'] ); if (isset($sampleData['sample_type'])) { $sampleMock->method('getSampleType')->willReturn( $sampleData['sample_type'] ); } if (isset($sampleData['sample_url'])) { $sampleMock->method('getSampleUrl')->willReturn( $sampleData['sample_url'] ); } if (isset($sampleData['sample_file'])) { $sampleMock->method('getSampleFile')->willReturn( $sampleData['sample_file'] ); } return $sampleMock; } public function testCreate() { $productSku = 'simple'; $sampleData = [ 'title' => 'Title', 'sort_order' => 1, 'sample_type' => 'url', 'sample_url' => 'http://example.com/', ]; $this->repositoryMock->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->method('getTypeId')->willReturn('downloadable'); $sampleMock = $this->getSampleMock($sampleData); $this->contentValidatorMock->method('isValid')->with($sampleMock) ->willReturn(true); $this->sampleHandlerMock->expects($this->once())->method('save')->with( $this->productMock, [ 'sample' => [ [ 'sample_id' => 0, 'is_delete' => 0, 'type' => $sampleData['sample_type'], 'sort_order' => $sampleData['sort_order'], 'title' => $sampleData['title'], 'sample_url' => $sampleData['sample_url'], ], ], ] ); $this->service->save($productSku, $sampleMock); } public function testCreateThrowsExceptionIfTitleIsEmpty() { $this->expectException('Magento\Framework\Exception\InputException'); $this->expectExceptionMessage('The sample title is empty. Enter the title and try again.'); $productSku = 'simple'; $sampleData = [ 'title' => '', 'sort_order' => 1, 'sample_type' => 'url', 'sample_url' => 'http://example.com/', ]; $this->repositoryMock->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->method('getTypeId')->willReturn('downloadable'); $sampleMock = $this->getSampleMock($sampleData); $this->contentValidatorMock->method('isValid')->with($sampleMock) ->willReturn(true); $this->sampleHandlerMock->expects($this->never())->method('save'); $this->service->save($productSku, $sampleMock); } public function testUpdate() { $sampleId = 1; $productId = 1; $productSku = 'simple'; $sampleData = [ 'id' => $sampleId, 'title' => 'Updated Title', 'sort_order' => 1, 'sample_type' => 'url', 'sample_url' => 'http://example.com/', ]; $this->repositoryMock->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->method('getData')->willReturn($productId); $existingSampleMock = $this->getMockBuilder(\Magento\Downloadable\Model\Sample::class) ->addMethods(['getProductId']) ->onlyMethods(['__wakeup', 'getId', 'load']) ->disableOriginalConstructor() ->getMock(); $this->sampleFactoryMock->expects($this->once())->method('create') ->willReturn($existingSampleMock); $sampleMock = $this->getSampleMock($sampleData); $this->contentValidatorMock->method('isValid')->with($sampleMock) ->willReturn(true); $existingSampleMock->method('getId')->willReturn($sampleId); $existingSampleMock->method('getProductId')->willReturn($productId); $existingSampleMock->expects($this->once())->method('load')->with($sampleId)->willReturnSelf(); $this->sampleHandlerMock->expects($this->once())->method('save')->with( $this->productMock, [ 'sample' => [ [ 'sample_id' => $sampleId, 'is_delete' => 0, 'type' => $sampleData['sample_type'], 'sort_order' => $sampleData['sort_order'], 'title' => $sampleData['title'], 'sample_url' => $sampleData['sample_url'], ], ], ] ); $this->assertEquals($sampleId, $this->service->save($productSku, $sampleMock)); } public function testUpdateWithExistingFile() { $sampleId = 1; $productId = 1; $productSku = 'simple'; $sampleFile = '/s/a/sample.jpg'; $encodedFile = 'something'; $sampleData = [ 'id' => $sampleId, 'title' => 'Updated Title', 'sort_order' => 1, 'sample_type' => 'file', 'sample_file' => $sampleFile, ]; $this->repositoryMock->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->method('getData')->willReturn($productId); $existingSampleMock = $this->getMockBuilder(\Magento\Downloadable\Model\Sample::class) ->addMethods(['getProductId']) ->onlyMethods(['__wakeup', 'getId', 'load']) ->disableOriginalConstructor() ->getMock(); $this->sampleFactoryMock->expects($this->once())->method('create') ->willReturn($existingSampleMock); $sampleMock = $this->getSampleMock($sampleData); $this->contentValidatorMock->method('isValid')->with($sampleMock) ->willReturn(true); $existingSampleMock->method('getId')->willReturn($sampleId); $existingSampleMock->method('getProductId')->willReturn($productId); $existingSampleMock->expects($this->once())->method('load')->with($sampleId)->willReturnSelf(); $this->jsonEncoderMock->expects($this->once()) ->method('encode') ->with( [ [ 'file' => $sampleFile, 'status' => 'old', ] ] )->willReturn($encodedFile); $this->sampleHandlerMock->expects($this->once())->method('save')->with( $this->productMock, [ 'sample' => [ [ 'sample_id' => $sampleId, 'is_delete' => 0, 'type' => $sampleData['sample_type'], 'sort_order' => $sampleData['sort_order'], 'title' => $sampleData['title'], 'file' => $encodedFile, ], ], ] ); $this->assertEquals($sampleId, $this->service->save($productSku, $sampleMock)); } public function testUpdateThrowsExceptionIfTitleIsEmptyAndScopeIsGlobal() { $this->expectException('Magento\Framework\Exception\InputException'); $this->expectExceptionMessage('The sample title is empty. Enter the title and try again.'); $sampleId = 1; $productSku = 'simple'; $productId = 1; $sampleData = [ 'id' => $sampleId, 'title' => '', 'sort_order' => 1, 'sample_type' => 'url', 'sample_url' => 'https://google.com', ]; $this->repositoryMock->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->method('getData')->willReturn($productId); $existingSampleMock = $this->getMockBuilder(\Magento\Downloadable\Model\Sample::class) ->addMethods(['getProductId']) ->onlyMethods(['__wakeup', 'getId', 'load', 'save']) ->disableOriginalConstructor() ->getMock(); $existingSampleMock->method('getId')->willReturn($sampleId); $existingSampleMock->expects($this->once())->method('load')->with($sampleId)->willReturnSelf(); $existingSampleMock->method('getProductId')->willReturn($productId); $this->sampleFactoryMock->expects($this->once())->method('create') ->willReturn($existingSampleMock); $sampleMock = $this->getSampleMock($sampleData); $this->contentValidatorMock->method('isValid')->with($sampleMock) ->willReturn(true); $this->sampleHandlerMock->expects($this->never())->method('save'); $this->service->save($productSku, $sampleMock, true); } public function testDelete() { $sampleId = 1; $sampleMock = $this->createMock(\Magento\Downloadable\Model\Sample::class); $this->sampleFactoryMock->expects($this->once())->method('create')->willReturn($sampleMock); $sampleMock->expects($this->once())->method('load')->with($sampleId)->willReturnSelf(); $sampleMock->method('getId')->willReturn($sampleId); $sampleMock->expects($this->once())->method('delete'); $this->assertTrue($this->service->delete($sampleId)); } public function testDeleteThrowsExceptionIfSampleIdIsNotValid() { $this->expectException('Magento\Framework\Exception\NoSuchEntityException'); $this->expectExceptionMessage( 'No downloadable sample with the provided ID was found. Verify the ID and try again.' ); $sampleId = 1; $sampleMock = $this->createMock(\Magento\Downloadable\Model\Sample::class); $this->sampleFactoryMock->expects($this->once())->method('create')->willReturn($sampleMock); $sampleMock->expects($this->once())->method('load')->with($sampleId)->willReturnSelf(); $sampleMock->expects($this->once())->method('getId'); $sampleMock->expects($this->never())->method('delete'); $this->service->delete($sampleId); } public function testGetList() { $productSku = 'downloadable_sku'; $sampleData = [ 'id' => 324, 'store_title' => 'rock melody sample', 'title' => 'just melody sample', 'sort_order' => 21, 'sample_type' => 'file', 'sample_url' => null, 'sample_file' => '/r/o/rock.melody.ogg', ]; $sampleMock = $this->getMockBuilder(\Magento\Downloadable\Model\Sample::class) ->addMethods(['getStoreTitle']) ->onlyMethods([ 'getId', 'getTitle', 'getSampleType', 'getSampleFile', 'getSampleUrl', 'getSortOrder', 'getData', '__wakeup' ]) ->disableOriginalConstructor() ->getMock(); $sampleInterfaceMock = $this->getMockForAbstractClass(SampleInterface::class); $this->repositoryMock->expects($this->once()) ->method('get') ->with($productSku) ->willReturn($this->productMock); $this->productTypeMock->expects($this->once()) ->method('getSamples') ->with($this->productMock) ->willReturn([$sampleMock]); $this->setSampleAssertions($sampleMock, $sampleData); $this->sampleDataObjectFactory->expects($this->once())->method('create')->willReturn($sampleInterfaceMock); $this->assertEquals([$sampleInterfaceMock], $this->service->getList($productSku)); } /** * @param $resource * @param $inputData */ protected function setSampleAssertions($resource, $inputData) { $resource->method('getId')->willReturn($inputData['id']); $resource->method('getStoreTitle') ->willReturn($inputData['store_title']); $resource->method('getTitle') ->willReturn($inputData['title']); $resource->method('getSortOrder') ->willReturn($inputData['sort_order']); $resource->method('getSampleType') ->willReturn($inputData['sample_type']); $resource->method('getSampleFile') ->willReturn($inputData['sample_file']); $resource->method('getSampleUrl') ->willReturn($inputData['sample_url']); } }