OptionRepositoryTest.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Bundle\Test\Unit\Model;
  8. use Magento\Bundle\Model\OptionRepository;
  9. use Magento\Framework\Exception\NoSuchEntityException;
  10. /**
  11. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  12. */
  13. class OptionRepositoryTest extends \PHPUnit\Framework\TestCase
  14. {
  15. /**
  16. * @var \Magento\Bundle\Model\OptionRepository
  17. */
  18. protected $model;
  19. /**
  20. * @var \PHPUnit_Framework_MockObject_MockObject
  21. */
  22. protected $productRepositoryMock;
  23. /**
  24. * @var \PHPUnit_Framework_MockObject_MockObject
  25. */
  26. protected $typeMock;
  27. /**
  28. * @var \PHPUnit_Framework_MockObject_MockObject
  29. */
  30. protected $optionFactoryMock;
  31. /**
  32. * @var \PHPUnit_Framework_MockObject_MockObject
  33. */
  34. protected $optionResourceMock;
  35. /**
  36. * @var \PHPUnit_Framework_MockObject_MockObject
  37. */
  38. protected $storeManagerMock;
  39. /**
  40. * @var \PHPUnit_Framework_MockObject_MockObject
  41. */
  42. protected $linkManagementMock;
  43. /**
  44. * @var \Magento\Framework\TestFramework\Unit\Helper\ObjectManager
  45. */
  46. protected $objectManager;
  47. /**
  48. * @var \PHPUnit_Framework_MockObject_MockObject
  49. */
  50. protected $optionListMock;
  51. /**
  52. * @var \PHPUnit_Framework_MockObject_MockObject
  53. */
  54. protected $dataObjectHelperMock;
  55. /**
  56. * @var \Magento\Bundle\Model\Option\SaveAction|\PHPUnit_Framework_MockObject_MockObject
  57. */
  58. private $optionSaveActionMock;
  59. protected function setUp()
  60. {
  61. $this->objectManager = new \Magento\Framework\TestFramework\Unit\Helper\ObjectManager($this);
  62. $this->productRepositoryMock = $this->createMock(\Magento\Catalog\Api\ProductRepositoryInterface::class);
  63. $this->typeMock = $this->createMock(\Magento\Bundle\Model\Product\Type::class);
  64. $this->optionFactoryMock = $this->getMockBuilder(\Magento\Bundle\Api\Data\OptionInterfaceFactory::class)
  65. ->disableOriginalConstructor()
  66. ->setMethods(['create'])
  67. ->disableOriginalConstructor()
  68. ->getMock();
  69. $this->dataObjectHelperMock = $this->getMockBuilder(\Magento\Framework\Api\DataObjectHelper::class)
  70. ->disableOriginalConstructor()
  71. ->getMock();
  72. $this->optionResourceMock = $this->createPartialMock(
  73. \Magento\Bundle\Model\ResourceModel\Option::class,
  74. ['get', 'delete', '__wakeup', 'save', 'removeOptionSelections']
  75. );
  76. $this->storeManagerMock = $this->createMock(\Magento\Store\Model\StoreManagerInterface::class);
  77. $this->linkManagementMock = $this->createMock(\Magento\Bundle\Api\ProductLinkManagementInterface::class);
  78. $this->optionListMock = $this->createMock(\Magento\Bundle\Model\Product\OptionList::class);
  79. $this->optionSaveActionMock = $this->createMock(\Magento\Bundle\Model\Option\SaveAction::class);
  80. $this->model = new OptionRepository(
  81. $this->productRepositoryMock,
  82. $this->typeMock,
  83. $this->optionFactoryMock,
  84. $this->optionResourceMock,
  85. $this->linkManagementMock,
  86. $this->optionListMock,
  87. $this->dataObjectHelperMock,
  88. $this->optionSaveActionMock
  89. );
  90. }
  91. /**
  92. * @expectedException \Magento\Framework\Exception\InputException
  93. * @expectedExceptionMessage This is implemented for bundle products only.
  94. */
  95. public function testGetThrowsExceptionIfProductIsSimple()
  96. {
  97. $productSku = 'sku';
  98. $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
  99. $productMock->expects($this->once())
  100. ->method('getTypeId')
  101. ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_SIMPLE);
  102. $this->productRepositoryMock->expects($this->once())
  103. ->method('get')
  104. ->with($productSku)
  105. ->willReturn($productMock);
  106. $this->model->get($productSku, 100);
  107. }
  108. /**
  109. * @expectedException \Magento\Framework\Exception\NoSuchEntityException
  110. * @expectedExceptionMessage The option that was requested doesn't exist. Verify the entity and try again.
  111. */
  112. public function testGetThrowsExceptionIfOptionDoesNotExist()
  113. {
  114. $productSku = 'sku';
  115. $optionId = 100;
  116. $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
  117. $productMock->expects($this->once())
  118. ->method('getTypeId')
  119. ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
  120. $this->productRepositoryMock->expects($this->once())
  121. ->method('get')
  122. ->with($productSku)
  123. ->willReturn($productMock);
  124. $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
  125. $this->typeMock->expects($this->once())
  126. ->method('getOptionsCollection')
  127. ->with($productMock)
  128. ->willReturn($optCollectionMock);
  129. $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
  130. $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
  131. $optionMock->expects($this->once())->method('getId')->willReturn(null);
  132. $this->model->get($productSku, $optionId);
  133. }
  134. public function testGet()
  135. {
  136. $productSku = 'sku';
  137. $optionId = 100;
  138. $optionData = ['title' => 'option title'];
  139. $productMock = $this->createPartialMock(
  140. \Magento\Catalog\Model\Product::class,
  141. ['getTypeId', 'getTypeInstance', 'getStoreId', 'getPriceType', '__wakeup', 'getSku']
  142. );
  143. $productMock->expects($this->once())
  144. ->method('getTypeId')
  145. ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
  146. $productMock->expects($this->exactly(2))->method('getSku')->willReturn($productSku);
  147. $this->productRepositoryMock->expects($this->once())
  148. ->method('get')
  149. ->with($productSku)
  150. ->willReturn($productMock);
  151. $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
  152. $this->typeMock->expects($this->once())
  153. ->method('getOptionsCollection')
  154. ->with($productMock)
  155. ->willReturn($optCollectionMock);
  156. $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
  157. $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
  158. $optionMock->expects($this->exactly(2))->method('getId')->willReturn(1);
  159. $optionMock->expects($this->exactly(2))->method('getTitle')->willReturn($optionData['title']);
  160. $optionMock->expects($this->once())->method('getData')->willReturn($optionData);
  161. $linkMock = ['item'];
  162. $newOptionMock = $this->createMock(\Magento\Bundle\Api\Data\OptionInterface::class);
  163. $this->dataObjectHelperMock->expects($this->once())
  164. ->method('populateWithArray')
  165. ->with($newOptionMock, $optionData, \Magento\Bundle\Api\Data\OptionInterface::class)
  166. ->willReturnSelf();
  167. $newOptionMock->expects($this->once())->method('setOptionId')->with(1)->willReturnSelf();
  168. $newOptionMock->expects($this->once())
  169. ->method('setTitle')
  170. ->with($optionData['title'])
  171. ->willReturnSelf();
  172. $newOptionMock->expects($this->once())->method('setSku')->with()->willReturnSelf();
  173. $this->linkManagementMock->expects($this->once())
  174. ->method('getChildren')
  175. ->with($productSku, $optionId)
  176. ->willReturn($linkMock);
  177. $this->optionFactoryMock->expects($this->once())->method('create')->willReturn($newOptionMock);
  178. $this->assertEquals($newOptionMock, $this->model->get($productSku, $optionId));
  179. }
  180. public function testDelete()
  181. {
  182. $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
  183. $this->optionResourceMock->expects($this->once())->method('delete')->with($optionMock)->willReturnSelf();
  184. $this->assertTrue($this->model->delete($optionMock));
  185. }
  186. /**
  187. * @expectedException \Magento\Framework\Exception\StateException
  188. * @expectedExceptionMessage The option with "1" ID can't be deleted.
  189. */
  190. public function testDeleteThrowsExceptionIfCannotDelete()
  191. {
  192. $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
  193. $optionMock->expects($this->once())->method('getOptionId')->willReturn(1);
  194. $this->optionResourceMock->expects($this->once())
  195. ->method('delete')
  196. ->with($optionMock)
  197. ->willThrowException(new \Exception());
  198. $this->model->delete($optionMock);
  199. }
  200. /**
  201. * Test successful delete action for given $optionId
  202. */
  203. public function testDeleteById()
  204. {
  205. $productSku = 'sku';
  206. $optionId = 100;
  207. $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
  208. $optionMock->expects($this->exactly(2))
  209. ->method('getId')
  210. ->willReturn($optionId);
  211. $optionMock->expects($this->once())
  212. ->method('getData')
  213. ->willReturn([
  214. 'title' => 'Option title',
  215. 'option_id' => $optionId
  216. ]);
  217. $this->optionFactoryMock->expects($this->once())
  218. ->method('create')
  219. ->willReturn($optionMock);
  220. $productMock = $this->createPartialMock(
  221. \Magento\Catalog\Model\Product::class,
  222. ['getTypeId', 'getTypeInstance', 'getStoreId', 'getPriceType', '__wakeup', 'getSku']
  223. );
  224. $productMock->expects($this->once())
  225. ->method('getTypeId')
  226. ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
  227. $productMock->expects($this->exactly(2))->method('getSku')->willReturn($productSku);
  228. $this->productRepositoryMock
  229. ->expects($this->once())
  230. ->method('get')
  231. ->with($productSku)
  232. ->willReturn($productMock);
  233. $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
  234. $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
  235. $this->typeMock->expects($this->once())
  236. ->method('getOptionsCollection')
  237. ->with($productMock)
  238. ->willReturn($optCollectionMock);
  239. $this->assertTrue($this->model->deleteById($productSku, $optionId));
  240. }
  241. /**
  242. * Tests if NoSuchEntityException thrown when provided $optionId not found
  243. */
  244. public function testDeleteByIdException()
  245. {
  246. $productSku = 'sku';
  247. $optionId = null;
  248. $optionMock = $this->createMock(\Magento\Bundle\Model\Option::class);
  249. $optionMock->expects($this->exactly(1))
  250. ->method('getId')
  251. ->willReturn($optionId);
  252. $productMock = $this->createPartialMock(
  253. \Magento\Catalog\Model\Product::class,
  254. ['getTypeId', 'getTypeInstance', 'getStoreId', 'getPriceType', '__wakeup', 'getSku']
  255. );
  256. $productMock->expects($this->once())
  257. ->method('getTypeId')
  258. ->willReturn(\Magento\Catalog\Model\Product\Type::TYPE_BUNDLE);
  259. $this->productRepositoryMock
  260. ->expects($this->once())
  261. ->method('get')
  262. ->with($productSku)
  263. ->willReturn($productMock);
  264. $optCollectionMock = $this->createMock(\Magento\Bundle\Model\ResourceModel\Option\Collection::class);
  265. $optCollectionMock->expects($this->once())->method('getItemById')->with($optionId)->willReturn($optionMock);
  266. $this->typeMock->expects($this->once())
  267. ->method('getOptionsCollection')
  268. ->with($productMock)
  269. ->willReturn($optCollectionMock);
  270. $this->expectException(NoSuchEntityException::class);
  271. $this->model->deleteById($productSku, $optionId);
  272. }
  273. /**
  274. * @SuppressWarnings(PHPMD.UnusedLocalVariable)
  275. */
  276. public function testSaveExistingOption()
  277. {
  278. $optionId = 5;
  279. $productSku = 'sku';
  280. $productMock = $this->createMock(\Magento\Catalog\Model\Product::class);
  281. $productMock->expects($this->once())->method('getSku')->willReturn($productSku);
  282. $optionMock = $this->createPartialMock(
  283. \Magento\Bundle\Model\Option::class,
  284. ['setStoreId', 'setParentId', 'getProductLinks', 'getOptionId', 'getResource']
  285. );
  286. $optionMock->expects($this->atLeastOnce())->method('getOptionId')->willReturn($optionId);
  287. $this->optionSaveActionMock->expects($this->once())->method('save')->with($productMock, $optionMock)
  288. ->willReturn($optionMock);
  289. $this->productRepositoryMock
  290. ->expects($this->once())
  291. ->method('get')
  292. ->with($productSku)
  293. ->willReturn($productMock);
  294. $this->productRepositoryMock
  295. ->expects($this->once())
  296. ->method('save')
  297. ->with($productMock);
  298. $this->assertEquals($optionId, $this->model->save($productMock, $optionMock));
  299. }
  300. public function testSaveNewOption()
  301. {
  302. $optionId = 5;
  303. $productSku = 'sku';
  304. $productMock = $this->createMock(\Magento\Catalog\Model\Product::class);
  305. $productMock->expects($this->once())->method('getSku')->willReturn($productSku);
  306. $optionMock = $this->createPartialMock(
  307. \Magento\Bundle\Model\Option::class,
  308. ['setStoreId', 'setParentId', 'getProductLinks', 'getOptionId', 'getResource']
  309. );
  310. $optionMock->expects($this->atLeastOnce())->method('getOptionId')->willReturn($optionId);
  311. $this->optionSaveActionMock->expects($this->once())->method('save')->with($productMock, $optionMock)
  312. ->willReturn($optionMock);
  313. $this->productRepositoryMock
  314. ->expects($this->once())
  315. ->method('get')
  316. ->with($productSku)
  317. ->willReturn($productMock);
  318. $this->productRepositoryMock
  319. ->expects($this->once())
  320. ->method('save')
  321. ->with($productMock);
  322. $this->assertEquals($optionId, $this->model->save($productMock, $optionMock));
  323. }
  324. public function testGetList()
  325. {
  326. $productSku = 'simple';
  327. $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
  328. $productMock->expects($this->once())->method('getTypeId')->willReturn('bundle');
  329. $this->productRepositoryMock
  330. ->expects($this->once())
  331. ->method('get')
  332. ->with($productSku)
  333. ->willReturn($productMock);
  334. $this->optionListMock->expects($this->once())->method('getItems')->with($productMock)->willReturn(['object']);
  335. $this->assertEquals(['object'], $this->model->getList($productSku));
  336. }
  337. /**
  338. * @expectedException \Magento\Framework\Exception\InputException
  339. * @expectedExceptionMessage This is implemented for bundle products only.
  340. */
  341. public function testGetListException()
  342. {
  343. $productSku = 'simple';
  344. $productMock = $this->createMock(\Magento\Catalog\Api\Data\ProductInterface::class);
  345. $productMock->expects($this->once())->method('getTypeId')->willReturn('simple');
  346. $this->productRepositoryMock
  347. ->expects($this->once())
  348. ->method('get')
  349. ->with($productSku)
  350. ->willReturn($productMock);
  351. $this->assertEquals(['object'], $this->model->getList($productSku));
  352. }
  353. }