CartTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Checkout\Test\Unit\CustomerData;
  7. /**
  8. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  9. */
  10. class CartTest extends \PHPUnit\Framework\TestCase
  11. {
  12. /**
  13. * @var \Magento\Checkout\CustomerData\Cart
  14. */
  15. protected $model;
  16. /**
  17. * @var \PHPUnit_Framework_MockObject_MockObject
  18. */
  19. protected $checkoutSessionMock;
  20. /**
  21. * @var \PHPUnit_Framework_MockObject_MockObject
  22. */
  23. protected $catalogUrlMock;
  24. /**
  25. * @var \PHPUnit_Framework_MockObject_MockObject
  26. */
  27. protected $checkoutCartMock;
  28. /**
  29. * @var \PHPUnit_Framework_MockObject_MockObject
  30. */
  31. protected $checkoutHelperMock;
  32. /**
  33. * @var \PHPUnit_Framework_MockObject_MockObject
  34. */
  35. protected $itemPoolInterfaceMock;
  36. /**
  37. * @var \PHPUnit_Framework_MockObject_MockObject
  38. */
  39. protected $layoutMock;
  40. protected function setUp()
  41. {
  42. $this->checkoutSessionMock = $this->createMock(\Magento\Checkout\Model\Session::class);
  43. $this->catalogUrlMock = $this->createPartialMock(
  44. \Magento\Catalog\Model\ResourceModel\Url::class,
  45. ['getRewriteByProductStore']
  46. );
  47. $this->checkoutCartMock = $this->createMock(\Magento\Checkout\Model\Cart::class);
  48. $this->checkoutHelperMock = $this->createMock(\Magento\Checkout\Helper\Data::class);
  49. $this->layoutMock = $this->createMock(\Magento\Framework\View\LayoutInterface::class);
  50. $this->itemPoolInterfaceMock = $this->createMock(\Magento\Checkout\CustomerData\ItemPoolInterface::class);
  51. $this->model = new \Magento\Checkout\CustomerData\Cart(
  52. $this->checkoutSessionMock,
  53. $this->catalogUrlMock,
  54. $this->checkoutCartMock,
  55. $this->checkoutHelperMock,
  56. $this->itemPoolInterfaceMock,
  57. $this->layoutMock
  58. );
  59. }
  60. public function testIsGuestCheckoutAllowed()
  61. {
  62. $quoteMock = $this->createMock(\Magento\Quote\Model\Quote::class);
  63. $this->checkoutSessionMock->expects($this->once())->method('getQuote')->willReturn($quoteMock);
  64. $this->checkoutHelperMock->expects($this->once())->method('isAllowedGuestCheckout')->with($quoteMock)
  65. ->willReturn(true);
  66. $this->assertTrue($this->model->isGuestCheckoutAllowed());
  67. }
  68. public function testGetSectionData()
  69. {
  70. $summaryQty = 100;
  71. $subtotalValue = 200;
  72. $productId = 10;
  73. $storeId = 20;
  74. $productRewrite = [$productId => ['rewrite' => 'product']];
  75. $itemData = ['item' => 'data'];
  76. $shortcutButtonsHtml = '<span>Buttons</span>';
  77. $websiteId = 100;
  78. $subtotalMock = $this->createPartialMock(\Magento\Framework\DataObject::class, ['getValue']);
  79. $subtotalMock->expects($this->once())->method('getValue')->willReturn($subtotalValue);
  80. $totals = ['subtotal' => $subtotalMock];
  81. $quoteMock = $this->createPartialMock(
  82. \Magento\Quote\Model\Quote::class,
  83. ['getTotals', 'getHasError', 'getAllVisibleItems', 'getStore']
  84. );
  85. $this->checkoutSessionMock->expects($this->exactly(2))->method('getQuote')->willReturn($quoteMock);
  86. $quoteMock->expects($this->once())->method('getTotals')->willReturn($totals);
  87. $quoteMock->expects($this->once())->method('getHasError')->willReturn(false);
  88. $this->checkoutCartMock->expects($this->once())->method('getSummaryQty')->willReturn($summaryQty);
  89. $this->checkoutHelperMock->expects($this->once())
  90. ->method('formatPrice')
  91. ->with($subtotalValue)
  92. ->willReturn($subtotalValue);
  93. $this->checkoutHelperMock->expects($this->once())->method('canOnepageCheckout')->willReturn(true);
  94. $quoteItemMock = $this->createPartialMock(\Magento\Quote\Model\Quote\Item::class, ['getProduct', 'getStoreId']);
  95. $quoteMock->expects($this->once())->method('getAllVisibleItems')->willReturn([$quoteItemMock]);
  96. $storeMock = $this->createPartialMock(\Magento\Store\Model\System\Store::class, ['getWebsiteId']);
  97. $storeMock->expects($this->once())->method('getWebsiteId')->willReturn($websiteId);
  98. $quoteMock->expects($this->any())->method('getStore')->willReturn($storeMock);
  99. $productMock = $this->createPartialMock(
  100. \Magento\Catalog\Model\Product::class,
  101. ['isVisibleInSiteVisibility', 'getId', 'setUrlDataObject']
  102. );
  103. $quoteItemMock->expects($this->exactly(3))->method('getProduct')->willReturn($productMock);
  104. $quoteItemMock->expects($this->once())->method('getStoreId')->willReturn($storeId);
  105. $productMock->expects($this->once())->method('isVisibleInSiteVisibility')->willReturn(false);
  106. $productMock->expects($this->exactly(3))->method('getId')->willReturn($productId);
  107. $productMock->expects($this->once())
  108. ->method('setUrlDataObject')
  109. ->with(new \Magento\Framework\DataObject($productRewrite[$productId]))
  110. ->willReturnSelf();
  111. $this->catalogUrlMock->expects($this->once())
  112. ->method('getRewriteByProductStore')
  113. ->with([$productId => $storeId])
  114. ->willReturn($productRewrite);
  115. $this->itemPoolInterfaceMock->expects($this->once())
  116. ->method('getItemData')
  117. ->with($quoteItemMock)
  118. ->willReturn($itemData);
  119. $shortcutButtonsMock = $this->createMock(\Magento\Catalog\Block\ShortcutButtons::class);
  120. $this->layoutMock->expects($this->once())
  121. ->method('createBlock')
  122. ->with(\Magento\Catalog\Block\ShortcutButtons::class)
  123. ->willReturn($shortcutButtonsMock);
  124. $shortcutButtonsMock->expects($this->once())->method('toHtml')->willReturn($shortcutButtonsHtml);
  125. $this->checkoutHelperMock->expects($this->once())
  126. ->method('isAllowedGuestCheckout')
  127. ->with($quoteMock)
  128. ->willReturn(true);
  129. $expectedResult = [
  130. 'summary_count' => 100,
  131. 'subtotal' => 200,
  132. 'possible_onepage_checkout' => 1,
  133. 'items' => [
  134. ['item' => 'data']
  135. ],
  136. 'extra_actions' => '<span>Buttons</span>',
  137. 'isGuestCheckoutAllowed' => 1,
  138. 'website_id' => $websiteId,
  139. 'subtotalAmount' => 200,
  140. 'storeId' => null
  141. ];
  142. $this->assertEquals($expectedResult, $this->model->getSectionData());
  143. }
  144. /**
  145. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  146. */
  147. public function testGetSectionDataWithCompositeProduct()
  148. {
  149. $summaryQty = 100;
  150. $subtotalValue = 200;
  151. $productId = 10;
  152. $storeId = 20;
  153. $websiteId = 100;
  154. $productRewrite = [$productId => ['rewrite' => 'product']];
  155. $itemData = ['item' => 'data'];
  156. $shortcutButtonsHtml = '<span>Buttons</span>';
  157. $subtotalMock = $this->createPartialMock(\Magento\Framework\DataObject::class, ['getValue']);
  158. $subtotalMock->expects($this->once())->method('getValue')->willReturn($subtotalValue);
  159. $totals = ['subtotal' => $subtotalMock];
  160. $quoteMock = $this->createPartialMock(
  161. \Magento\Quote\Model\Quote::class,
  162. ['getTotals', 'getHasError', 'getAllVisibleItems', 'getStore']
  163. );
  164. $quoteItemMock = $this->createPartialMock(
  165. \Magento\Quote\Model\Quote\Item::class,
  166. ['getProduct', 'getOptionByCode', 'getStoreId']
  167. );
  168. $this->checkoutSessionMock->expects($this->exactly(2))->method('getQuote')->willReturn($quoteMock);
  169. $quoteMock->expects($this->once())->method('getTotals')->willReturn($totals);
  170. $quoteMock->expects($this->once())->method('getHasError')->willReturn(false);
  171. $storeMock = $this->createPartialMock(\Magento\Store\Model\System\Store::class, ['getWebsiteId']);
  172. $storeMock->expects($this->once())->method('getWebsiteId')->willReturn($websiteId);
  173. $quoteMock->expects($this->any())->method('getStore')->willReturn($storeMock);
  174. $this->checkoutCartMock->expects($this->once())->method('getSummaryQty')->willReturn($summaryQty);
  175. $this->checkoutHelperMock->expects($this->once())
  176. ->method('formatPrice')
  177. ->with($subtotalValue)
  178. ->willReturn($subtotalValue);
  179. $this->checkoutHelperMock->expects($this->once())->method('canOnepageCheckout')->willReturn(true);
  180. $quoteMock->expects($this->once())->method('getAllVisibleItems')->willReturn([$quoteItemMock]);
  181. $productMock = $this->createPartialMock(
  182. \Magento\Catalog\Model\Product::class,
  183. ['isVisibleInSiteVisibility', 'getId', 'setUrlDataObject']
  184. );
  185. $optionsMock = $this->createMock(\Magento\Quote\Model\Quote\Item\Option::class);
  186. $optionsMock->expects($this->once())->method('getProduct')->willReturn($productMock);
  187. $quoteItemMock->expects($this->exactly(2))->method('getProduct')->willReturn($productMock);
  188. $quoteItemMock->expects($this->exactly(2))
  189. ->method('getOptionByCode')
  190. ->with('product_type')
  191. ->willReturn($optionsMock);
  192. $quoteItemMock->expects($this->once())->method('getStoreId')->willReturn($storeId);
  193. $productMock->expects($this->once())->method('isVisibleInSiteVisibility')->willReturn(false);
  194. $productMock->expects($this->exactly(3))->method('getId')->willReturn($productId);
  195. $productMock->expects($this->once())
  196. ->method('setUrlDataObject')
  197. ->with(new \Magento\Framework\DataObject($productRewrite[$productId]))
  198. ->willReturnSelf();
  199. $this->catalogUrlMock->expects($this->once())
  200. ->method('getRewriteByProductStore')
  201. ->with([$productId => $storeId])
  202. ->willReturn($productRewrite);
  203. $shortcutButtonsMock = $this->createMock(\Magento\Catalog\Block\ShortcutButtons::class);
  204. $this->layoutMock->expects($this->once())
  205. ->method('createBlock')
  206. ->with(\Magento\Catalog\Block\ShortcutButtons::class)
  207. ->willReturn($shortcutButtonsMock);
  208. $shortcutButtonsMock->expects($this->once())->method('toHtml')->willReturn($shortcutButtonsHtml);
  209. $this->checkoutHelperMock->expects($this->once())
  210. ->method('isAllowedGuestCheckout')
  211. ->with($quoteMock)
  212. ->willReturn(true);
  213. $this->itemPoolInterfaceMock->expects($this->once())
  214. ->method('getItemData')
  215. ->with($quoteItemMock)
  216. ->willReturn($itemData);
  217. $expectedResult = [
  218. 'summary_count' => 100,
  219. 'subtotal' => 200,
  220. 'possible_onepage_checkout' => 1,
  221. 'items' => [
  222. ['item' => 'data']
  223. ],
  224. 'extra_actions' => '<span>Buttons</span>',
  225. 'isGuestCheckoutAllowed' => 1,
  226. 'website_id' => $websiteId,
  227. 'subtotalAmount' => 200,
  228. 'storeId' => null
  229. ];
  230. $this->assertEquals($expectedResult, $this->model->getSectionData());
  231. }
  232. }