![]() 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/cartforge.co/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\LinkInterface; use Magento\Downloadable\Api\Data\LinkInterfaceFactory; use Magento\Downloadable\Model\Link\ContentValidator; use Magento\Downloadable\Model\LinkFactory; use Magento\Downloadable\Model\LinkRepository; use Magento\Downloadable\Model\Product\Type; use Magento\Downloadable\Model\Product\TypeHandler\Link; use Magento\Framework\EntityManager\EntityMetadataInterface; use Magento\Framework\EntityManager\MetadataPool; use Magento\Framework\Json\EncoderInterface; use Magento\Store\Model\Store; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) */ class LinkRepositoryTest extends TestCase { /** * @var MockObject */ protected $repositoryMock; /** * @var MockObject */ protected $contentValidatorMock; /** * @var MockObject */ protected $contentUploaderMock; /** * @var MockObject */ protected $jsonEncoderMock; /** * @var MockObject */ protected $linkFactoryMock; /** * @var MockObject */ protected $productMock; /** * @var MockObject */ protected $productTypeMock; /** * @var MockObject */ protected $linkDataObjectFactory; /** * @var LinkRepository */ protected $service; /** * @var MockObject */ protected $metadataPoolMock; /** * @var MockObject */ protected $linkHandlerMock; /** * @var MockObject */ protected $entityMetadataMock; protected function setUp(): void { $this->repositoryMock = $this->createMock(ProductRepository::class); $this->productTypeMock = $this->createMock(Type::class); $this->linkDataObjectFactory = $this->getMockBuilder(LinkInterfaceFactory::class) ->setMethods( [ 'create', ] ) ->disableOriginalConstructor() ->getMock(); $this->contentValidatorMock = $this->createMock(ContentValidator::class); $this->contentUploaderMock = $this->createMock( ContentUploaderInterface::class ); $this->jsonEncoderMock = $this->createMock( EncoderInterface::class ); $this->linkFactoryMock = $this->createPartialMock(LinkFactory::class, ['create']); $this->productMock = $this->getMockBuilder(Product::class) ->addMethods(['setDownloadableData']) ->onlyMethods([ '__wakeup', 'getTypeId', 'save', 'getId', 'getStoreId', 'getStore', 'getWebsiteIds', 'getData' ]) ->disableOriginalConstructor() ->getMock(); $this->service = new LinkRepository( $this->repositoryMock, $this->productTypeMock, $this->linkDataObjectFactory, $this->linkFactoryMock, $this->contentValidatorMock, $this->jsonEncoderMock, $this->contentUploaderMock ); $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('linkTypeHandler'); $this->linkHandlerMock = $this->getMockBuilder( Link::class )->disableOriginalConstructor() ->getMock(); $saveHandlerProperty->setAccessible(true); $saveHandlerProperty->setValue( $this->service, $this->linkHandlerMock ); $this->metadataPoolMock->expects($this->any())->method('getMetadata')->willReturn($this->entityMetadataMock); } /** * @param array $linkData * @return MockObject */ protected function getLinkMock(array $linkData) { $linkMock = $this->getMockBuilder(LinkInterface::class) ->setMethods( [ 'getLinkType', 'getId', 'getPrice', 'getTitle', 'getSortOrder', 'getNumberOfDownloads', 'getIsShareable', 'getLinkUrl', 'getLinkFile', 'hasSampleType', ] ) ->getMockForAbstractClass(); if (isset($linkData['id'])) { $linkMock->expects($this->any())->method('getId')->willReturn($linkData['id']); } $linkMock->expects($this->any())->method('getPrice')->willReturn( $linkData['price'] ); $linkMock->expects($this->any())->method('getTitle')->willReturn( $linkData['title'] ); $linkMock->expects($this->any())->method('getSortOrder')->willReturn( $linkData['sort_order'] ); $linkMock->expects($this->any())->method('getNumberOfDownloads')->willReturn( $linkData['number_of_downloads'] ); $linkMock->expects($this->any())->method('getIsShareable')->willReturn( $linkData['is_shareable'] ); if (isset($linkData['link_type'])) { $linkMock->expects($this->any())->method('getLinkType')->willReturn( $linkData['link_type'] ); } if (isset($linkData['link_url'])) { $linkMock->expects($this->any())->method('getLinkUrl')->willReturn( $linkData['link_url'] ); } if (isset($linkData['link_file'])) { $linkMock->expects($this->any())->method('getLinkFile')->willReturn( $linkData['link_file'] ); } return $linkMock; } public function testCreate() { $productSku = 'simple'; $linkData = [ 'title' => 'Title', 'sort_order' => 1, 'price' => 10.1, 'is_shareable' => true, 'number_of_downloads' => 100, 'link_type' => 'url', 'link_url' => 'http://example.com/', ]; $this->repositoryMock->expects($this->any())->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->expects($this->any())->method('getTypeId')->willReturn('downloadable'); $linkMock = $this->getLinkMock($linkData); $this->contentValidatorMock->expects($this->any())->method('isValid')->with($linkMock) ->willReturn(true); $downloadableData = [ 'link' => [ [ 'link_id' => 0, 'is_delete' => 0, 'type' => $linkData['link_type'], 'sort_order' => $linkData['sort_order'], 'title' => $linkData['title'], 'price' => $linkData['price'], 'number_of_downloads' => $linkData['number_of_downloads'], 'is_shareable' => $linkData['is_shareable'], 'link_url' => $linkData['link_url'], ], ], ]; $this->linkHandlerMock->expects($this->once())->method('save') ->with($this->productMock, $downloadableData); $this->service->save($productSku, $linkMock); } public function testCreateThrowsExceptionIfTitleIsEmpty() { $this->expectException('Magento\Framework\Exception\InputException'); $this->expectExceptionMessage('The link title is empty. Enter the link title and try again.'); $productSku = 'simple'; $linkData = [ 'title' => '', 'sort_order' => 1, 'price' => 10.1, 'number_of_downloads' => 100, 'is_shareable' => true, 'link_type' => 'url', 'link_url' => 'http://example.com/', ]; $this->productMock->expects($this->any())->method('getTypeId')->willReturn('downloadable'); $this->repositoryMock->expects($this->any())->method('get')->with($productSku, true) ->willReturn($this->productMock); $linkMock = $this->getLinkMock($linkData); $this->contentValidatorMock->expects($this->any())->method('isValid')->with($linkMock) ->willReturn(true); $this->productMock->expects($this->never())->method('save'); $this->service->save($productSku, $linkMock); } public function testUpdate() { $websiteId = 1; $linkId = 1; $productSku = 'simple'; $productId = 1; $linkData = [ 'id' => $linkId, 'title' => 'Updated Title', 'sort_order' => 1, 'price' => 10.1, 'is_shareable' => true, 'number_of_downloads' => 100, 'link_type' => 'url', 'link_url' => 'http://example.com/', ]; $this->repositoryMock->expects($this->any())->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->expects($this->any())->method('getData')->willReturn($productId); $storeMock = $this->createMock(Store::class); $storeMock->expects($this->any())->method('getWebsiteId')->willReturn($websiteId); $this->productMock->expects($this->any())->method('getStore')->willReturn($storeMock); $existingLinkMock = $this->getMockBuilder(\Magento\Downloadable\Model\Link::class)->addMethods(['getProductId']) ->onlyMethods(['__wakeup', 'getId', 'load']) ->disableOriginalConstructor() ->getMock(); $this->linkFactoryMock->expects($this->once())->method('create')->willReturn($existingLinkMock); $linkMock = $this->getLinkMock($linkData); $this->contentValidatorMock->expects($this->any())->method('isValid')->with($linkMock) ->willReturn(true); $existingLinkMock->expects($this->any())->method('getId')->willReturn($linkId); $existingLinkMock->expects($this->any())->method('getProductId')->willReturn($productId); $existingLinkMock->expects($this->once())->method('load')->with($linkId)->willReturnSelf(); $this->linkHandlerMock->expects($this->once())->method('save') ->with( $this->productMock, [ 'link' => [ [ 'link_id' => $linkId, 'is_delete' => 0, 'type' => $linkData['link_type'], 'sort_order' => $linkData['sort_order'], 'title' => $linkData['title'], 'price' => $linkData['price'], 'number_of_downloads' => $linkData['number_of_downloads'], 'is_shareable' => $linkData['is_shareable'], 'link_url' => $linkData['link_url'], ], ], ] ); $this->assertEquals($linkId, $this->service->save($productSku, $linkMock)); } public function testUpdateWithExistingFile() { $websiteId = 1; $linkId = 1; $productSku = 'simple'; $productId = 1; $linkFile = '/l/i/link.jpg'; $encodedFiles = "something"; $linkData = [ 'id' => $linkId, 'title' => 'Updated Title', 'sort_order' => 1, 'price' => 10.1, 'is_shareable' => true, 'number_of_downloads' => 100, 'link_type' => 'file', 'link_file' => $linkFile, ]; $this->repositoryMock->expects($this->any())->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->expects($this->any())->method('getData')->willReturn($productId); $storeMock = $this->createMock(Store::class); $storeMock->expects($this->any())->method('getWebsiteId')->willReturn($websiteId); $this->productMock->expects($this->any())->method('getStore')->willReturn($storeMock); $existingLinkMock = $this->getMockBuilder(\Magento\Downloadable\Model\Link::class)->addMethods(['getProductId']) ->onlyMethods(['__wakeup', 'getId', 'load']) ->disableOriginalConstructor() ->getMock(); $this->linkFactoryMock->expects($this->once())->method('create')->willReturn($existingLinkMock); $linkMock = $this->getLinkMock($linkData); $this->contentValidatorMock->expects($this->any())->method('isValid')->with($linkMock) ->willReturn(true); $existingLinkMock->expects($this->any())->method('getId')->willReturn($linkId); $existingLinkMock->expects($this->any())->method('getProductId')->willReturn($productId); $existingLinkMock->expects($this->once())->method('load')->with($linkId)->willReturnSelf(); $this->jsonEncoderMock->expects($this->once()) ->method('encode') ->with( [ [ 'file' => $linkFile, 'status' => 'old' ] ] )->willReturn($encodedFiles); $this->linkHandlerMock->expects($this->once())->method('save') ->with( $this->productMock, [ 'link' => [ [ 'link_id' => $linkId, 'is_delete' => 0, 'type' => $linkData['link_type'], 'sort_order' => $linkData['sort_order'], 'title' => $linkData['title'], 'price' => $linkData['price'], 'number_of_downloads' => $linkData['number_of_downloads'], 'is_shareable' => $linkData['is_shareable'], 'file' => $encodedFiles, ], ], ] ); $this->assertEquals($linkId, $this->service->save($productSku, $linkMock)); } public function testUpdateThrowsExceptionIfTitleIsEmptyAndScopeIsGlobal() { $this->expectException('Magento\Framework\Exception\InputException'); $this->expectExceptionMessage('The link title is empty. Enter the link title and try again.'); $linkId = 1; $productSku = 'simple'; $productId = 1; $linkData = [ 'id' => $linkId, 'title' => '', 'sort_order' => 1, 'price' => 10.1, 'number_of_downloads' => 100, 'is_shareable' => true, 'link_type' => 'url', 'link_url' => 'https://google.com', ]; $this->repositoryMock->expects($this->any())->method('get')->with($productSku, true) ->willReturn($this->productMock); $this->productMock->expects($this->any())->method('getData')->willReturn($productId); $existingLinkMock = $this->getMockBuilder(\Magento\Downloadable\Model\Link::class)->addMethods(['getProductId']) ->onlyMethods(['__wakeup', 'getId', 'load', 'save']) ->disableOriginalConstructor() ->getMock(); $existingLinkMock->expects($this->any())->method('getId')->willReturn($linkId); $existingLinkMock->expects($this->any())->method('getProductId')->willReturn($productId); $existingLinkMock->expects($this->once())->method('load')->with($linkId)->willReturnSelf(); $this->linkFactoryMock->expects($this->once())->method('create')->willReturn($existingLinkMock); $linkContentMock = $this->getLinkMock($linkData); $this->contentValidatorMock->expects($this->any())->method('isValid')->with($linkContentMock) ->willReturn(true); $this->linkHandlerMock->expects($this->never())->method('save'); $this->service->save($productSku, $linkContentMock, true); } public function testDelete() { $linkId = 1; $linkMock = $this->createMock(\Magento\Downloadable\Model\Link::class); $this->linkFactoryMock->expects($this->once())->method('create')->willReturn($linkMock); $linkMock->expects($this->once())->method('load')->with($linkId)->willReturnSelf(); $linkMock->expects($this->any())->method('getId')->willReturn($linkId); $linkMock->expects($this->once())->method('delete'); $this->assertTrue($this->service->delete($linkId)); } public function testDeleteThrowsExceptionIfLinkIdIsNotValid() { $this->expectException('Magento\Framework\Exception\NoSuchEntityException'); $this->expectExceptionMessage( 'No downloadable link with the provided ID was found. Verify the ID and try again.' ); $linkId = 1; $linkMock = $this->createMock(\Magento\Downloadable\Model\Link::class); $this->linkFactoryMock->expects($this->once())->method('create')->willReturn($linkMock); $linkMock->expects($this->once())->method('load')->with($linkId)->willReturnSelf(); $linkMock->expects($this->once())->method('getId'); $linkMock->expects($this->never())->method('delete'); $this->service->delete($linkId); } public function testGetList() { $productSku = 'downloadable_sku'; $linkData = [ 'id' => 324, 'store_title' => 'rock melody', 'title' => 'just melody', 'price' => 23, 'number_of_downloads' => 3, 'sort_order' => 21, 'is_shareable' => 2, 'sample_type' => 'file', 'sample_url' => null, 'sample_file' => '/r/o/rock.melody.ogg', 'link_type' => 'url', 'link_url' => 'http://link.url', 'link_file' => null, ]; $linkMock = $this->getMockBuilder(\Magento\Downloadable\Model\Link::class)->addMethods(['getStoreTitle']) ->onlyMethods([ 'getId', 'getTitle', 'getPrice', 'getNumberOfDownloads', 'getSortOrder', 'getIsShareable', 'getData', '__wakeup', 'getSampleType', 'getSampleFile', 'getSampleUrl', 'getLinkType', 'getLinkFile', 'getLinkUrl' ]) ->disableOriginalConstructor() ->getMock(); $linkInterfaceMock = $this->getMockForAbstractClass(LinkInterface::class); $this->repositoryMock->expects($this->once()) ->method('get') ->with($productSku) ->willReturn($this->productMock); $this->productTypeMock->expects($this->once()) ->method('getLinks') ->with($this->productMock) ->willReturn([$linkMock]); $this->setLinkAssertions($linkMock, $linkData); $this->linkDataObjectFactory->expects($this->once())->method('create')->willReturn($linkInterfaceMock); $this->assertEquals([$linkInterfaceMock], $this->service->getList($productSku)); } /** * @param $resource * @param $inputData */ protected function setLinkAssertions($resource, $inputData) { $resource->expects($this->any())->method('getId')->willReturn($inputData['id']); $resource->expects($this->any())->method('getStoreTitle') ->willReturn($inputData['store_title']); $resource->expects($this->any())->method('getTitle') ->willReturn($inputData['title']); $resource->expects($this->any())->method('getSampleType') ->willReturn($inputData['sample_type']); $resource->expects($this->any())->method('getSampleFile') ->willReturn($inputData['sample_file']); $resource->expects($this->any())->method('getSampleUrl') ->willReturn($inputData['sample_url']); $resource->expects($this->any())->method('getPrice') ->willReturn($inputData['price']); $resource->expects($this->once())->method('getNumberOfDownloads') ->willReturn($inputData['number_of_downloads']); $resource->expects($this->once())->method('getSortOrder') ->willReturn($inputData['sort_order']); $resource->expects($this->once())->method('getIsShareable') ->willReturn($inputData['is_shareable']); $resource->expects($this->any())->method('getLinkType') ->willReturn($inputData['link_type']); $resource->expects($this->any())->method('getlinkFile') ->willReturn($inputData['link_file']); $resource->expects($this->any())->method('getLinkUrl') ->willReturn($inputData['link_url']); } }