123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417 |
- <?php
- /**
- *
- * Copyright © Magento, Inc. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Bundle\Test\Unit\Model;
- use Magento\Bundle\Model\OptionRepository;
- use Magento\Framework\Exception\NoSuchEntityException;
- /**
- * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
- */
- class OptionRepositoryTest extends \PHPUnit\Framework\TestCase
- {
- /**
- * @var \Magento\Bundle\Model\OptionRepository
- */
- protected $model;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $productRepositoryMock;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $typeMock;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $optionFactoryMock;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $optionResourceMock;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $storeManagerMock;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $linkManagementMock;
- /**
- * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
- */
- protected $objectManager;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $optionListMock;
- /**
- * @var \PHPUnit_Framework_MockObject_MockObject
- */
- protected $dataObjectHelperMock;
- /**
- * @var \Magento\Bundle\Model\Option\SaveAction|\PHPUnit_Framework_MockObject_MockObject
- */
- private $optionSaveActionMock;
- protected function setUp()
- {
- $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
- $this->productRepositoryMock = $this->createMock(\Magento\Catalog\Api\ProductRepositoryInterface::class);
- $this->typeMock = $this->createMock(\Magento\Bundle\Model\Product\Type::class);
- $this->optionFactoryMock = $this->getMockBuilder(\Magento\Bundle\Api\Data\OptionInterfaceFactory::class)
- ->disableOriginalConstructor()
- ->setMethods(['create'])
- ->disableOriginalConstructor()
- ->getMock();
- $this->dataObjectHelperMock = $this->getMockBuilder(\Magento\Framework\Api\DataObjectHelper::class)
- ->disableOriginalConstructor()
- ->getMock();
- $this->optionResourceMock = $this->createPartialMock(
- \Magento\Bundle\Model\ResourceModel\Option::class,
- ['get', 'delete', '__wakeup', 'save', 'removeOptionSelections']
- );
- $this->storeManagerMock = $this->createMock(\Magento\Store\Model\StoreManagerInterface::class);
- $this->linkManagementMock = $this->createMock(\Magento\Bundle\Api\ProductLinkManagementInterface::class);
- $this->optionListMock = $this->createMock(\Magento\Bundle\Model\Product\OptionList::class);
- $this->optionSaveActionMock = $this->createMock(\Magento\Bundle\Model\Option\SaveAction::class);
- $this->model = new OptionRepository(
- $this->productRepositoryMock,
- $this->typeMock,
- $this->optionFactoryMock,
- $this->optionResourceMock,
- $this->linkManagementMock,
- $this->optionListMock,
- $this->dataObjectHelperMock,
- $this->optionSaveActionMock
- );
- }
- /**
- * @expectedException \Magento\Framework\Exception\InputException
- * @expectedExceptionMessage This is implemented for bundle products only.
- */
- public function testGetThrowsExceptionIfProductIsSimple()
- {
- $productSku = 'sku';
- $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
- $productMock->expects($this->once())
- ->method('getTypeId')
- ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
- $this->productRepositoryMock->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $this->model->get($productSku, 100);
- }
- /**
- * @expectedException \Magento\Framework\Exception\NoSuchEntityException
- * @expectedExceptionMessage The option that was requested doesn't exist. Verify the entity and try again.
- */
- public function testGetThrowsExceptionIfOptionDoesNotExist()
- {
- $productSku = 'sku';
- $optionId = 100;
- $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
- $productMock->expects($this->once())
- ->method('getTypeId')
- ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
- $this->productRepositoryMock->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
- $this->typeMock->expects($this->once())
- ->method('getOptionsCollection')
- ->with($productMock)
- ->willReturn($optCollectionMock);
- $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
- $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
- $optionMock->expects($this->once())->method('getId')->willReturn(null);
- $this->model->get($productSku, $optionId);
- }
- public function testGet()
- {
- $productSku = 'sku';
- $optionId = 100;
- $optionData = ['title' => 'option title'];
- $productMock = $this->createPartialMock(
- \Magento\Catalog\Model\Product::class,
- ['getTypeId', 'getTypeInstance', 'getStoreId', 'getPriceType', '__wakeup', 'getSku']
- );
- $productMock->expects($this->once())
- ->method('getTypeId')
- ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
- $productMock->expects($this->exactly(2))->method('getSku')->willReturn($productSku);
- $this->productRepositoryMock->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
- $this->typeMock->expects($this->once())
- ->method('getOptionsCollection')
- ->with($productMock)
- ->willReturn($optCollectionMock);
- $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
- $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
- $optionMock->expects($this->exactly(2))->method('getId')->willReturn(1);
- $optionMock->expects($this->exactly(2))->method('getTitle')->willReturn($optionData['title']);
- $optionMock->expects($this->once())->method('getData')->willReturn($optionData);
- $linkMock = ['item'];
- $newOptionMock = $this->createMock(\Magento\Bundle\Api\Data\OptionInterface::class);
- $this->dataObjectHelperMock->expects($this->once())
- ->method('populateWithArray')
- ->with($newOptionMock, $optionData, \Magento\Bundle\Api\Data\OptionInterface::class)
- ->willReturnSelf();
- $newOptionMock->expects($this->once())->method('setOptionId')->with(1)->willReturnSelf();
- $newOptionMock->expects($this->once())
- ->method('setTitle')
- ->with($optionData['title'])
- ->willReturnSelf();
- $newOptionMock->expects($this->once())->method('setSku')->with()->willReturnSelf();
- $this->linkManagementMock->expects($this->once())
- ->method('getChildren')
- ->with($productSku, $optionId)
- ->willReturn($linkMock);
- $this->optionFactoryMock->expects($this->once())->method('create')->willReturn($newOptionMock);
- $this->assertEquals($newOptionMock, $this->model->get($productSku, $optionId));
- }
- public function testDelete()
- {
- $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
- $this->optionResourceMock->expects($this->once())->method('delete')->with($optionMock)->willReturnSelf();
- $this->assertTrue($this->model->delete($optionMock));
- }
- /**
- * @expectedException \Magento\Framework\Exception\StateException
- * @expectedExceptionMessage The option with "1" ID can't be deleted.
- */
- public function testDeleteThrowsExceptionIfCannotDelete()
- {
- $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
- $optionMock->expects($this->once())->method('getOptionId')->willReturn(1);
- $this->optionResourceMock->expects($this->once())
- ->method('delete')
- ->with($optionMock)
- ->willThrowException(new \Exception());
- $this->model->delete($optionMock);
- }
- /**
- * Test successful delete action for given $optionId
- */
- public function testDeleteById()
- {
- $productSku = 'sku';
- $optionId = 100;
- $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
- $optionMock->expects($this->exactly(2))
- ->method('getId')
- ->willReturn($optionId);
- $optionMock->expects($this->once())
- ->method('getData')
- ->willReturn([
- 'title' => 'Option title',
- 'option_id' => $optionId
- ]);
- $this->optionFactoryMock->expects($this->once())
- ->method('create')
- ->willReturn($optionMock);
- $productMock = $this->createPartialMock(
- \Magento\Catalog\Model\Product::class,
- ['getTypeId', 'getTypeInstance', 'getStoreId', 'getPriceType', '__wakeup', 'getSku']
- );
- $productMock->expects($this->once())
- ->method('getTypeId')
- ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
- $productMock->expects($this->exactly(2))->method('getSku')->willReturn($productSku);
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
- $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
- $this->typeMock->expects($this->once())
- ->method('getOptionsCollection')
- ->with($productMock)
- ->willReturn($optCollectionMock);
- $this->assertTrue($this->model->deleteById($productSku, $optionId));
- }
- /**
- * Tests if NoSuchEntityException thrown when provided $optionId not found
- */
- public function testDeleteByIdException()
- {
- $productSku = 'sku';
- $optionId = null;
- $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
- $optionMock->expects($this->exactly(1))
- ->method('getId')
- ->willReturn($optionId);
- $productMock = $this->createPartialMock(
- \Magento\Catalog\Model\Product::class,
- ['getTypeId', 'getTypeInstance', 'getStoreId', 'getPriceType', '__wakeup', 'getSku']
- );
- $productMock->expects($this->once())
- ->method('getTypeId')
- ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
- $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
- $this->typeMock->expects($this->once())
- ->method('getOptionsCollection')
- ->with($productMock)
- ->willReturn($optCollectionMock);
- $this->expectException(NoSuchEntityException::class);
- $this->model->deleteById($productSku, $optionId);
- }
- /**
- * @SuppressWarnings(PHPMD.UnusedLocalVariable)
- */
- public function testSaveExistingOption()
- {
- $optionId = 5;
- $productSku = 'sku';
- $productMock = $this->createMock(\Magento\Catalog\Model\Product::class);
- $productMock->expects($this->once())->method('getSku')->willReturn($productSku);
- $optionMock = $this->createPartialMock(
- \Magento\Bundle\Model\Option::class,
- ['setStoreId', 'setParentId', 'getProductLinks', 'getOptionId', 'getResource']
- );
- $optionMock->expects($this->atLeastOnce())->method('getOptionId')->willReturn($optionId);
- $this->optionSaveActionMock->expects($this->once())->method('save')->with($productMock, $optionMock)
- ->willReturn($optionMock);
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('save')
- ->with($productMock);
- $this->assertEquals($optionId, $this->model->save($productMock, $optionMock));
- }
- public function testSaveNewOption()
- {
- $optionId = 5;
- $productSku = 'sku';
- $productMock = $this->createMock(\Magento\Catalog\Model\Product::class);
- $productMock->expects($this->once())->method('getSku')->willReturn($productSku);
- $optionMock = $this->createPartialMock(
- \Magento\Bundle\Model\Option::class,
- ['setStoreId', 'setParentId', 'getProductLinks', 'getOptionId', 'getResource']
- );
- $optionMock->expects($this->atLeastOnce())->method('getOptionId')->willReturn($optionId);
- $this->optionSaveActionMock->expects($this->once())->method('save')->with($productMock, $optionMock)
- ->willReturn($optionMock);
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('save')
- ->with($productMock);
- $this->assertEquals($optionId, $this->model->save($productMock, $optionMock));
- }
- public function testGetList()
- {
- $productSku = 'simple';
- $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
- $productMock->expects($this->once())->method('getTypeId')->willReturn('bundle');
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $this->optionListMock->expects($this->once())->method('getItems')->with($productMock)->willReturn(['object']);
- $this->assertEquals(['object'], $this->model->getList($productSku));
- }
- /**
- * @expectedException \Magento\Framework\Exception\InputException
- * @expectedExceptionMessage This is implemented for bundle products only.
- */
- public function testGetListException()
- {
- $productSku = 'simple';
- $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
- $productMock->expects($this->once())->method('getTypeId')->willReturn('simple');
- $this->productRepositoryMock
- ->expects($this->once())
- ->method('get')
- ->with($productSku)
- ->willReturn($productMock);
- $this->assertEquals(['object'], $this->model->getList($productSku));
- }
- }
|