ProductTest.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\GroupedProduct\Test\Unit\Model;
  7. use \Magento\Catalog\Model\Product;
  8. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
  9. /**
  10. * Product Test
  11. *
  12. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  13. * @SuppressWarnings(PHPMD.TooManyFields)
  14. *
  15. */
  16. class ProductTest extends \PHPUnit\Framework\TestCase
  17. {
  18. /**
  19. * @var ObjectManagerHelper
  20. */
  21. protected $objectManagerHelper;
  22. /**
  23. * @var \Magento\Catalog\Model\Product
  24. */
  25. protected $model;
  26. /**
  27. * @var \Magento\Framework\Module\Manager|\PHPUnit_Framework_MockObject_MockObject
  28. */
  29. protected $moduleManager;
  30. /**
  31. * @var \PHPUnit_Framework_MockObject_MockObject
  32. */
  33. protected $stockItemFactoryMock;
  34. /**
  35. * @var \Magento\Framework\Indexer\IndexerInterface|\PHPUnit_Framework_MockObject_MockObject
  36. */
  37. protected $categoryIndexerMock;
  38. /**
  39. * @var \Magento\Catalog\Model\Indexer\Product\Flat\Processor|\PHPUnit_Framework_MockObject_MockObject
  40. */
  41. protected $productFlatProcessor;
  42. /**
  43. * @var \Magento\Catalog\Model\Indexer\Product\Price\Processor|\PHPUnit_Framework_MockObject_MockObject
  44. */
  45. protected $productPriceProcessor;
  46. /**
  47. * @var Product\Type|\PHPUnit_Framework_MockObject_MockObject
  48. */
  49. protected $productTypeInstanceMock;
  50. /**
  51. * @var Product\Option|\PHPUnit_Framework_MockObject_MockObject
  52. */
  53. protected $optionInstanceMock;
  54. /**
  55. * @var \Magento\Framework\Pricing\PriceInfo\Base|\PHPUnit_Framework_MockObject_MockObject
  56. */
  57. protected $_priceInfoMock;
  58. /**
  59. * @var \Magento\Store\Model\Store|\PHPUnit_Framework_MockObject_MockObject
  60. */
  61. private $store;
  62. /**
  63. * @var \Magento\Catalog\Model\ResourceModel\Product|\PHPUnit_Framework_MockObject_MockObject
  64. */
  65. private $resource;
  66. /**
  67. * @var \Magento\Framework\Registry|\PHPUnit_Framework_MockObject_MockObject
  68. */
  69. private $registry;
  70. /**
  71. * @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject
  72. */
  73. private $category;
  74. /**
  75. * @var \Magento\Store\Model\Website|\PHPUnit_Framework_MockObject_MockObject
  76. */
  77. private $website;
  78. /**
  79. * @var \Magento\Framework\Indexer\IndexerRegistry|\PHPUnit_Framework_MockObject_MockObject
  80. */
  81. protected $indexerRegistryMock;
  82. /**
  83. * @var \Magento\Catalog\Api\CategoryRepositoryInterface|\PHPUnit_Framework_MockObject_MockObject
  84. */
  85. private $categoryRepository;
  86. /**
  87. * @var \Magento\Catalog\Helper\Product|\PHPUnit_Framework_MockObject_MockObject
  88. */
  89. private $_catalogProduct;
  90. /**
  91. * @var \Magento\Catalog\Model\Product\Image\Cache|\PHPUnit_Framework_MockObject_MockObject
  92. */
  93. protected $imageCache;
  94. /**
  95. * @var \Magento\Catalog\Model\Product\Image\CacheFactory|\PHPUnit_Framework_MockObject_MockObject
  96. */
  97. protected $imageCacheFactory;
  98. /**
  99. * @var \PHPUnit_Framework_MockObject_MockObject
  100. */
  101. protected $mediaGalleryEntryFactoryMock;
  102. /**
  103. * @var \PHPUnit_Framework_MockObject_MockObject
  104. */
  105. protected $productLinkFactory;
  106. /**
  107. * @var \PHPUnit_Framework_MockObject_MockObject
  108. */
  109. protected $dataObjectHelperMock;
  110. /**
  111. * @var \PHPUnit_Framework_MockObject_MockObject
  112. */
  113. protected $metadataServiceMock;
  114. /**
  115. * @var \PHPUnit_Framework_MockObject_MockObject
  116. */
  117. protected $attributeValueFactory;
  118. /**
  119. * @var \PHPUnit_Framework_MockObject_MockObject
  120. */
  121. protected $linkTypeProviderMock;
  122. /**
  123. * @var \PHPUnit_Framework_MockObject_MockObject
  124. */
  125. protected $entityCollectionProviderMock;
  126. /**
  127. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  128. */
  129. protected function setUp()
  130. {
  131. $this->categoryIndexerMock = $this->getMockForAbstractClass(\Magento\Framework\Indexer\IndexerInterface::class);
  132. $this->moduleManager = $this->createPartialMock(\Magento\Framework\Module\Manager::class, ['isEnabled']);
  133. $this->stockItemFactoryMock = $this->createPartialMock(
  134. \Magento\CatalogInventory\Api\Data\StockItemInterfaceFactory::class,
  135. ['create']
  136. );
  137. $this->dataObjectHelperMock = $this->getMockBuilder(\Magento\Framework\Api\DataObjectHelper::class)
  138. ->disableOriginalConstructor()
  139. ->getMock();
  140. $this->productFlatProcessor = $this->createMock(\Magento\Catalog\Model\Indexer\Product\Flat\Processor::class);
  141. $this->_priceInfoMock = $this->createMock(\Magento\Framework\Pricing\PriceInfo\Base::class);
  142. $this->productTypeInstanceMock = $this->createMock(\Magento\Catalog\Model\Product\Type::class);
  143. $this->productPriceProcessor = $this->createMock(\Magento\Catalog\Model\Indexer\Product\Price\Processor::class);
  144. $stateMock = $this->createPartialMock(\Magento\Framework\App\State::class, ['getAreaCode']);
  145. $stateMock->expects($this->any())
  146. ->method('getAreaCode')
  147. ->will($this->returnValue(\Magento\Backend\App\Area\FrontNameResolver::AREA_CODE));
  148. $eventManagerMock = $this->createMock(\Magento\Framework\Event\ManagerInterface::class);
  149. $actionValidatorMock = $this->createMock(\Magento\Framework\Model\ActionValidator\RemoveAction::class);
  150. $actionValidatorMock->expects($this->any())->method('isAllowed')->will($this->returnValue(true));
  151. $cacheInterfaceMock = $this->createMock(\Magento\Framework\App\CacheInterface::class);
  152. $contextMock = $this->createPartialMock(
  153. \Magento\Framework\Model\Context::class,
  154. ['getEventDispatcher', 'getCacheManager', 'getAppState', 'getActionValidator']
  155. );
  156. $contextMock->expects($this->any())->method('getAppState')->will($this->returnValue($stateMock));
  157. $contextMock->expects($this->any())->method('getEventDispatcher')->will($this->returnValue($eventManagerMock));
  158. $contextMock->expects($this->any())
  159. ->method('getCacheManager')
  160. ->will($this->returnValue($cacheInterfaceMock));
  161. $contextMock->expects($this->any())
  162. ->method('getActionValidator')
  163. ->will($this->returnValue($actionValidatorMock));
  164. $this->optionInstanceMock = $this->getMockBuilder(\Magento\Catalog\Model\Product\Option::class)
  165. ->setMethods(['setProduct', 'saveOptions', '__wakeup', '__sleep'])
  166. ->disableOriginalConstructor()->getMock();
  167. $this->resource = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product::class)
  168. ->disableOriginalConstructor()
  169. ->getMock();
  170. $this->registry = $this->getMockBuilder(\Magento\Framework\Registry::class)
  171. ->disableOriginalConstructor()
  172. ->getMock();
  173. $this->category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
  174. ->disableOriginalConstructor()
  175. ->getMock();
  176. $this->store = $this->getMockBuilder(\Magento\Store\Model\Store::class)
  177. ->disableOriginalConstructor()
  178. ->getMock();
  179. $this->website = $this->getMockBuilder(\Magento\Store\Model\Website::class)
  180. ->disableOriginalConstructor()
  181. ->getMock();
  182. $storeManager = $this->getMockBuilder(\Magento\Store\Model\StoreManagerInterface::class)
  183. ->disableOriginalConstructor()
  184. ->getMockForAbstractClass();
  185. $storeManager->expects($this->any())
  186. ->method('getStore')
  187. ->will($this->returnValue($this->store));
  188. $storeManager->expects($this->any())
  189. ->method('getWebsite')
  190. ->will($this->returnValue($this->website));
  191. $this->indexerRegistryMock = $this->createPartialMock(
  192. \Magento\Framework\Indexer\IndexerRegistry::class,
  193. ['get']
  194. );
  195. $this->categoryRepository = $this->createMock(\Magento\Catalog\Api\CategoryRepositoryInterface::class);
  196. $this->_catalogProduct = $this->createPartialMock(
  197. \Magento\Catalog\Helper\Product::class,
  198. ['isDataForProductCategoryIndexerWasChanged']
  199. );
  200. $this->imageCache = $this->getMockBuilder(\Magento\Catalog\Model\Product\Image\Cache::class)
  201. ->disableOriginalConstructor()
  202. ->getMock();
  203. $this->imageCacheFactory = $this->getMockBuilder(\Magento\Catalog\Model\Product\Image\CacheFactory::class)
  204. ->disableOriginalConstructor()
  205. ->setMethods(['create'])
  206. ->getMock();
  207. $this->productLinkFactory = $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductLinkInterfaceFactory::class)
  208. ->disableOriginalConstructor()
  209. ->setMethods(['create'])
  210. ->getMock();
  211. $this->mediaGalleryEntryFactoryMock =
  212. $this->getMockBuilder(\Magento\Catalog\Api\Data\ProductAttributeMediaGalleryEntryInterfaceFactory::class)
  213. ->setMethods(['create'])
  214. ->disableOriginalConstructor()
  215. ->getMock();
  216. $this->metadataServiceMock = $this->createMock(\Magento\Catalog\Api\ProductAttributeRepositoryInterface::class);
  217. $this->attributeValueFactory = $this->getMockBuilder(\Magento\Framework\Api\AttributeValueFactory::class)
  218. ->disableOriginalConstructor()->getMock();
  219. $this->linkTypeProviderMock = $this->createPartialMock(
  220. \Magento\Catalog\Model\Product\LinkTypeProvider::class,
  221. ['getLinkTypes']
  222. );
  223. $this->entityCollectionProviderMock = $this->createPartialMock(
  224. \Magento\Catalog\Model\ProductLink\CollectionProvider::class,
  225. ['getCollection']
  226. );
  227. $this->objectManagerHelper = new ObjectManagerHelper($this);
  228. $this->model = $this->objectManagerHelper->getObject(
  229. \Magento\Catalog\Model\Product::class,
  230. [
  231. 'context' => $contextMock,
  232. 'catalogProductType' => $this->productTypeInstanceMock,
  233. 'productFlatIndexerProcessor' => $this->productFlatProcessor,
  234. 'productPriceIndexerProcessor' => $this->productPriceProcessor,
  235. 'catalogProductOption' => $this->optionInstanceMock,
  236. 'storeManager' => $storeManager,
  237. 'resource' => $this->resource,
  238. 'registry' => $this->registry,
  239. 'moduleManager' => $this->moduleManager,
  240. 'stockItemFactory' => $this->stockItemFactoryMock,
  241. 'dataObjectHelper' => $this->dataObjectHelperMock,
  242. 'indexerRegistry' => $this->indexerRegistryMock,
  243. 'categoryRepository' => $this->categoryRepository,
  244. 'catalogProduct' => $this->_catalogProduct,
  245. 'imageCacheFactory' => $this->imageCacheFactory,
  246. 'productLinkFactory' => $this->productLinkFactory,
  247. 'mediaGalleryEntryFactory' => $this->mediaGalleryEntryFactoryMock,
  248. 'metadataService' => $this->metadataServiceMock,
  249. 'customAttributeFactory' => $this->attributeValueFactory,
  250. 'entityCollectionProvider' => $this->entityCollectionProviderMock,
  251. 'linkTypeProvider' => $this->linkTypeProviderMock,
  252. 'data' => ['id' => 1]
  253. ]
  254. );
  255. }
  256. /**
  257. * Test for getProductLinks() with associated product links
  258. */
  259. public function testGetProductLinks()
  260. {
  261. $this->markTestIncomplete('Skipped due to https://jira.corp.x.com/browse/MAGETWO-36926');
  262. $linkTypes = ['related' => 1, 'upsell' => 4, 'crosssell' => 5, 'associated' => 3];
  263. $this->linkTypeProviderMock->expects($this->once())->method('getLinkTypes')->willReturn($linkTypes);
  264. $inputRelatedLink = $this->objectManagerHelper->getObject(\Magento\Catalog\Model\ProductLink\Link::class);
  265. $inputRelatedLink->setProductSku("Simple Product 1");
  266. $inputRelatedLink->setLinkType("related");
  267. $inputRelatedLink->setData("sku", "Simple Product 2");
  268. $inputRelatedLink->setData("type", "simple");
  269. $inputRelatedLink->setPosition(0);
  270. $customData = ["attribute_code" => "qty", "value" => 1];
  271. $inputGroupLink = $this->objectManagerHelper->getObject(\Magento\Catalog\Model\ProductLink\Link::class);
  272. $inputGroupLink->setProductSku("Simple Product 1");
  273. $inputGroupLink->setLinkType("associated");
  274. $inputGroupLink->setData("sku", "Simple Product 2");
  275. $inputGroupLink->setData("type", "simple");
  276. $inputGroupLink->setPosition(0);
  277. $inputGroupLink["custom_attributes"] = [$customData];
  278. $outputRelatedLink = $this->objectManagerHelper->getObject(\Magento\Catalog\Model\ProductLink\Link::class);
  279. $outputRelatedLink->setProductSku("Simple Product 1");
  280. $outputRelatedLink->setLinkType("related");
  281. $outputRelatedLink->setLinkedProductSku("Simple Product 2");
  282. $outputRelatedLink->setLinkedProductType("simple");
  283. $outputRelatedLink->setPosition(0);
  284. $groupExtension = $this->objectManagerHelper->getObject(\Magento\Catalog\Api\Data\ProductLinkExtension::class);
  285. $reflectionOfExtension = new \ReflectionClass(\Magento\Catalog\Api\Data\ProductLinkExtension::class);
  286. $method = $reflectionOfExtension->getMethod('setData');
  287. $method->setAccessible(true);
  288. $method->invokeArgs($groupExtension, ['qty', 1]);
  289. $outputGroupLink = $this->objectManagerHelper->getObject(\Magento\Catalog\Model\ProductLink\Link::class);
  290. $outputGroupLink->setProductSku("Simple Product 1");
  291. $outputGroupLink->setLinkType("associated");
  292. $outputGroupLink->setLinkedProductSku("Simple Product 2");
  293. $outputGroupLink->setLinkedProductType("simple");
  294. $outputGroupLink->setPosition(0);
  295. $outputGroupLink->setExtensionAttributes($groupExtension);
  296. $this->entityCollectionProviderMock->expects($this->at(0))
  297. ->method('getCollection')
  298. ->with($this->model, 'related')
  299. ->willReturn([$inputRelatedLink]);
  300. $this->entityCollectionProviderMock->expects($this->at(1))
  301. ->method('getCollection')
  302. ->with($this->model, 'upsell')
  303. ->willReturn([]);
  304. $this->entityCollectionProviderMock->expects($this->at(2))
  305. ->method('getCollection')
  306. ->with($this->model, 'crosssell')
  307. ->willReturn([]);
  308. $this->entityCollectionProviderMock->expects($this->at(3))
  309. ->method('getCollection')
  310. ->with($this->model, 'associated')
  311. ->willReturn([$inputGroupLink]);
  312. $expectedOutput = [$outputRelatedLink, $outputGroupLink];
  313. $typeInstanceMock = $this->getMockBuilder(\Magento\ConfigurableProduct\Model\Product\Type\Simple::class)
  314. ->setMethods(["getSku"])
  315. ->getMock();
  316. $typeInstanceMock->expects($this->atLeastOnce())->method('getSku')->willReturn("Simple Product 1");
  317. $this->model->setTypeInstance($typeInstanceMock);
  318. $productLink1 = $this->objectManagerHelper->getObject(\Magento\Catalog\Model\ProductLink\Link::class);
  319. $productLink2 = $this->objectManagerHelper->getObject(\Magento\Catalog\Model\ProductLink\Link::class);
  320. $this->productLinkFactory->expects($this->at(0))
  321. ->method('create')
  322. ->willReturn($productLink1);
  323. $this->productLinkFactory->expects($this->at(1))
  324. ->method('create')
  325. ->willReturn($productLink2);
  326. $extension = $this->objectManagerHelper->getObject(\Magento\Catalog\Api\Data\ProductLinkExtension::class);
  327. $productLink2->setExtensionAttributes($extension);
  328. $links = $this->model->getProductLinks();
  329. // Match the links
  330. $matches = 0;
  331. foreach ($links as $link) {
  332. foreach ($expectedOutput as $expected) {
  333. if ($expected->getData() == $link->getData()) {
  334. $matches++;
  335. }
  336. }
  337. }
  338. $this->assertEquals($matches, 2);
  339. }
  340. }