UrlRewriteHandlerTest.php 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\CatalogUrlRewrite\Test\Unit\Observer;
  7. use Magento\Catalog\Model\ResourceModel\Product\Collection;
  8. use Magento\CatalogUrlRewrite\Observer\UrlRewriteHandler;
  9. use Magento\CatalogUrlRewrite\Model\Category\ChildrenCategoriesProvider;
  10. use Magento\CatalogUrlRewrite\Model\CategoryBasedProductRewriteGenerator;
  11. use Magento\CatalogUrlRewrite\Model\CategoryUrlRewriteGenerator;
  12. use Magento\CatalogUrlRewrite\Model\ProductUrlRewriteGenerator;
  13. use Magento\Catalog\Model\ResourceModel\Product\CollectionFactory;
  14. use Magento\UrlRewrite\Model\UrlPersistInterface;
  15. use Magento\Framework\Serialize\Serializer\Json;
  16. use Magento\UrlRewrite\Model\MergeDataProviderFactory;
  17. use Magento\UrlRewrite\Model\MergeDataProvider;
  18. use Magento\CatalogUrlRewrite\Model\CategoryProductUrlPathGenerator;
  19. /**
  20. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  21. */
  22. class UrlRewriteHandlerTest extends \PHPUnit\Framework\TestCase
  23. {
  24. /**
  25. * @var UrlRewriteHandler
  26. */
  27. protected $urlRewriteHandler;
  28. /**
  29. * @var ChildrenCategoriesProvider|\PHPUnit_Framework_MockObject_MockObject
  30. */
  31. protected $childrenCategoriesProviderMock;
  32. /**
  33. * @var CategoryUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
  34. */
  35. protected $categoryUrlRewriteGeneratorMock;
  36. /**
  37. * @var ProductUrlRewriteGenerator|\PHPUnit_Framework_MockObject_MockObject
  38. */
  39. protected $productUrlRewriteGeneratorMock;
  40. /**
  41. * @var UrlPersistInterface|\PHPUnit_Framework_MockObject_MockObject
  42. */
  43. protected $urlPersistMock;
  44. /**
  45. * @var CollectionFactory|\PHPUnit_Framework_MockObject_MockObject
  46. */
  47. protected $collectionFactoryMock;
  48. /**
  49. * @var CategoryProductUrlPathGenerator|\PHPUnit_Framework_MockObject_MockObject
  50. */
  51. private $categoryBasedProductRewriteGeneratorMock;
  52. /**
  53. * @var MergeDataProviderFactory|\PHPUnit_Framework_MockObject_MockObject
  54. */
  55. private $mergeDataProviderFactoryMock;
  56. /**
  57. * @var MergeDataProvider|\PHPUnit_Framework_MockObject_MockObject
  58. */
  59. private $mergeDataProviderMock;
  60. /**
  61. * @var Json|\PHPUnit_Framework_MockObject_MockObject
  62. */
  63. private $serializerMock;
  64. /**
  65. * {@inheritDoc}
  66. */
  67. protected function setUp()
  68. {
  69. $this->childrenCategoriesProviderMock = $this->getMockBuilder(ChildrenCategoriesProvider::class)
  70. ->getMock();
  71. $this->categoryUrlRewriteGeneratorMock = $this->getMockBuilder(CategoryUrlRewriteGenerator::class)
  72. ->disableOriginalConstructor()
  73. ->getMock();
  74. $this->productUrlRewriteGeneratorMock = $this->getMockBuilder(ProductUrlRewriteGenerator::class)
  75. ->disableOriginalConstructor()
  76. ->getMock();
  77. $this->urlPersistMock = $this->getMockBuilder(UrlPersistInterface::class)
  78. ->getMock();
  79. $this->collectionFactoryMock = $this->getMockBuilder(CollectionFactory::class)
  80. ->disableOriginalConstructor()
  81. ->getMock();
  82. $this->mergeDataProviderFactoryMock = $this->getMockBuilder(MergeDataProviderFactory::class)
  83. ->setMethods(['create'])
  84. ->disableOriginalConstructor()
  85. ->getMock();
  86. $this->mergeDataProviderMock = $this->getMockBuilder(MergeDataProvider::class)
  87. ->disableOriginalConstructor()
  88. ->getMock();
  89. $this->categoryBasedProductRewriteGeneratorMock = $this->getMockBuilder(CategoryProductUrlPathGenerator::class)
  90. ->disableOriginalConstructor()
  91. ->getMock();
  92. $this->mergeDataProviderFactoryMock->expects($this->any())
  93. ->method('create')
  94. ->willReturn($this->mergeDataProviderMock);
  95. $this->serializerMock = $this->getMockBuilder(Json::class)
  96. ->disableOriginalConstructor()
  97. ->getMock();
  98. $this->urlRewriteHandler = new UrlRewriteHandler(
  99. $this->childrenCategoriesProviderMock,
  100. $this->categoryUrlRewriteGeneratorMock,
  101. $this->productUrlRewriteGeneratorMock,
  102. $this->urlPersistMock,
  103. $this->collectionFactoryMock,
  104. $this->categoryBasedProductRewriteGeneratorMock,
  105. $this->mergeDataProviderFactoryMock,
  106. $this->serializerMock
  107. );
  108. }
  109. /**
  110. * @test
  111. */
  112. public function testGenerateProductUrlRewrites()
  113. {
  114. /* @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject $category */
  115. $category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
  116. ->setMethods(['getEntityId', 'getStoreId', 'getData', 'getChangedProductIds'])
  117. ->disableOriginalConstructor()
  118. ->getMock();
  119. $category->expects($this->any())
  120. ->method('getEntityId')
  121. ->willReturn(2);
  122. $category->expects($this->any())
  123. ->method('getStoreId')
  124. ->willReturn(1);
  125. $category->expects($this->any())
  126. ->method('getData')
  127. ->with('save_rewrites_history')
  128. ->willReturn(true);
  129. /* @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject $childCategory1 */
  130. $childCategory1 = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
  131. ->setMethods(['getEntityId'])
  132. ->disableOriginalConstructor()
  133. ->getMock();
  134. $childCategory1->expects($this->any())
  135. ->method('getEntityId')
  136. ->willReturn(100);
  137. /* @var \Magento\Catalog\Model\Category|\PHPUnit_Framework_MockObject_MockObject $childCategory1 */
  138. $childCategory2 = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
  139. ->setMethods(['getEntityId'])
  140. ->disableOriginalConstructor()
  141. ->getMock();
  142. $childCategory1->expects($this->any())
  143. ->method('getEntityId')
  144. ->willReturn(200);
  145. $this->childrenCategoriesProviderMock->expects($this->once())
  146. ->method('getChildren')
  147. ->with($category, true)
  148. ->willReturn([$childCategory1, $childCategory2]);
  149. /** @var Collection|\PHPUnit_Framework_MockObject_MockObject $productCollection */
  150. $productCollection = $this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\Collection::class)
  151. ->disableOriginalConstructor()
  152. ->getMock();
  153. $productCollection->expects($this->any())
  154. ->method('addCategoriesFilter')
  155. ->willReturnSelf();
  156. $productCollection->expects($this->any())
  157. ->method('addIdFilter')
  158. ->willReturnSelf();
  159. $productCollection->expects($this->any())->method('setStoreId')->willReturnSelf();
  160. $productCollection->expects($this->any())->method('addAttributeToSelect')->willReturnSelf();
  161. $iterator = new \ArrayIterator([]);
  162. $productCollection->expects($this->any())->method('getIterator')->will($this->returnValue($iterator));
  163. $this->collectionFactoryMock->expects($this->any())->method('create')->willReturn($productCollection);
  164. $this->mergeDataProviderMock->expects($this->any())->method('getData')->willReturn([1, 2]);
  165. $this->urlRewriteHandler->generateProductUrlRewrites($category);
  166. }
  167. public function testDeleteCategoryRewritesForChildren()
  168. {
  169. $category = $this->getMockBuilder(\Magento\Catalog\Model\Category::class)
  170. ->disableOriginalConstructor()
  171. ->getMock();
  172. $category->expects($this->once())
  173. ->method('getId')
  174. ->willReturn(2);
  175. $this->childrenCategoriesProviderMock->expects($this->once())
  176. ->method('getChildrenIds')
  177. ->with($category, true)
  178. ->willReturn([3, 4]);
  179. $this->serializerMock->expects($this->exactly(3))
  180. ->method('serialize');
  181. $this->urlRewriteHandler->deleteCategoryRewritesForChildren($category);
  182. }
  183. }