GuestCartTotalRepositoryTest.php 7.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. <?php
  2. /**
  3. *
  4. * Copyright © Magento, Inc. All rights reserved.
  5. * See COPYING.txt for license details.
  6. */
  7. namespace Magento\Quote\Api;
  8. use Magento\Quote\Model\Cart\Totals;
  9. use Magento\Quote\Model\Cart\Totals\Item as ItemTotals;
  10. use Magento\Framework\Api\FilterBuilder;
  11. use Magento\Framework\Api\SearchCriteriaBuilder;
  12. use Magento\TestFramework\ObjectManager;
  13. use Magento\TestFramework\TestCase\WebapiAbstract;
  14. class GuestCartTotalRepositoryTest extends WebapiAbstract
  15. {
  16. /**
  17. * @var ObjectManager
  18. */
  19. private $objectManager;
  20. /**
  21. * @var SearchCriteriaBuilder
  22. */
  23. private $searchCriteriaBuilder;
  24. /**
  25. * @var FilterBuilder
  26. */
  27. private $filterBuilder;
  28. protected function setUp()
  29. {
  30. $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
  31. $this->searchCriteriaBuilder = $this->objectManager->create(
  32. \Magento\Framework\Api\SearchCriteriaBuilder::class
  33. );
  34. $this->filterBuilder = $this->objectManager->create(
  35. \Magento\Framework\Api\FilterBuilder::class
  36. );
  37. }
  38. protected function getQuoteMaskedId($quoteId)
  39. {
  40. /** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
  41. $quoteIdMask = $this->objectManager->create(\Magento\Quote\Model\QuoteIdMaskFactory::class)->create();
  42. $quoteIdMask->load($quoteId, 'quote_id');
  43. return $quoteIdMask->getMaskedId();
  44. }
  45. /**
  46. * @magentoApiDataFixture Magento/Checkout/_files/quote_with_shipping_method.php
  47. */
  48. public function testGetTotals()
  49. {
  50. /** @var \Magento\Quote\Model\Quote $quote */
  51. $quote = $this->objectManager->create(\Magento\Quote\Model\Quote::class);
  52. $quote->load('test_order_1', 'reserved_order_id');
  53. $cartId = $this->getQuoteMaskedId($quote->getId());
  54. /** @var \Magento\Quote\Model\Quote\Address $shippingAddress */
  55. $shippingAddress = $quote->getShippingAddress();
  56. $data = [
  57. Totals::KEY_GRAND_TOTAL => $quote->getGrandTotal(),
  58. Totals::KEY_BASE_GRAND_TOTAL => $quote->getBaseGrandTotal(),
  59. Totals::KEY_SUBTOTAL => $quote->getSubtotal(),
  60. Totals::KEY_BASE_SUBTOTAL => $quote->getBaseSubtotal(),
  61. Totals::KEY_DISCOUNT_AMOUNT => $shippingAddress->getDiscountAmount(),
  62. Totals::KEY_BASE_DISCOUNT_AMOUNT => $shippingAddress->getBaseDiscountAmount(),
  63. Totals::KEY_SUBTOTAL_WITH_DISCOUNT => $quote->getSubtotalWithDiscount(),
  64. Totals::KEY_BASE_SUBTOTAL_WITH_DISCOUNT => $quote->getBaseSubtotalWithDiscount(),
  65. Totals::KEY_SHIPPING_AMOUNT => $shippingAddress->getShippingAmount(),
  66. Totals::KEY_BASE_SHIPPING_AMOUNT => $shippingAddress->getBaseShippingAmount(),
  67. Totals::KEY_SHIPPING_DISCOUNT_AMOUNT => $shippingAddress->getShippingDiscountAmount(),
  68. Totals::KEY_BASE_SHIPPING_DISCOUNT_AMOUNT => $shippingAddress->getBaseShippingDiscountAmount(),
  69. Totals::KEY_TAX_AMOUNT => $shippingAddress->getTaxAmount(),
  70. Totals::KEY_BASE_TAX_AMOUNT => $shippingAddress->getBaseTaxAmount(),
  71. Totals::KEY_SHIPPING_TAX_AMOUNT => $shippingAddress->getShippingTaxAmount(),
  72. Totals::KEY_BASE_SHIPPING_TAX_AMOUNT => $shippingAddress->getBaseShippingTaxAmount(),
  73. Totals::KEY_SUBTOTAL_INCL_TAX => $shippingAddress->getSubtotalInclTax(),
  74. Totals::KEY_BASE_SUBTOTAL_INCL_TAX => $shippingAddress->getBaseSubtotalTotalInclTax(),
  75. Totals::KEY_SHIPPING_INCL_TAX => $shippingAddress->getShippingInclTax(),
  76. Totals::KEY_BASE_SHIPPING_INCL_TAX => $shippingAddress->getBaseShippingInclTax(),
  77. Totals::KEY_BASE_CURRENCY_CODE => $quote->getBaseCurrencyCode(),
  78. Totals::KEY_QUOTE_CURRENCY_CODE => $quote->getQuoteCurrencyCode(),
  79. Totals::KEY_ITEMS_QTY => $quote->getItemsQty(),
  80. Totals::KEY_ITEMS => [$this->getQuoteItemTotalsData($quote)],
  81. ];
  82. $requestData = ['cartId' => $cartId];
  83. $data = $this->formatTotalsData($data);
  84. $actual = $this->_webApiCall($this->getServiceInfoForTotalsService($cartId), $requestData);
  85. $actual = $this->formatTotalsData($actual);
  86. unset($actual['items'][0]['options']);
  87. unset($actual['weee_tax_applied_amount']);
  88. unset($actual['total_segments']);
  89. if (array_key_exists('extension_attributes', $actual)) {
  90. unset($actual['extension_attributes']);
  91. }
  92. $this->assertEquals($data, $actual);
  93. }
  94. /**
  95. * @expectedException \Exception
  96. * @expectedExceptionMessage No such entity
  97. */
  98. public function testGetTotalsWithAbsentQuote()
  99. {
  100. $cartId = 'unknownCart';
  101. $requestData = ['cartId' => $cartId];
  102. $this->_webApiCall($this->getServiceInfoForTotalsService($cartId), $requestData);
  103. }
  104. /**
  105. * Get service info for totals service
  106. *
  107. * @param string $cartId
  108. * @return array
  109. */
  110. protected function getServiceInfoForTotalsService($cartId)
  111. {
  112. return [
  113. 'soap' => [
  114. 'service' => 'quoteGuestCartTotalRepositoryV1',
  115. 'serviceVersion' => 'V1',
  116. 'operation' => 'quoteGuestCartTotalRepositoryV1get',
  117. ],
  118. 'rest' => [
  119. 'resourcePath' => '/V1/guest-carts/' . $cartId . '/totals',
  120. 'httpMethod' => \Magento\Framework\Webapi\Rest\Request::HTTP_METHOD_GET,
  121. ],
  122. ];
  123. }
  124. /**
  125. * Adjust response details for SOAP protocol
  126. *
  127. * @param array $data
  128. * @return array
  129. */
  130. protected function formatTotalsData($data)
  131. {
  132. foreach ($data as $key => $field) {
  133. if (is_numeric($field)) {
  134. $data[$key] = round($field, 1);
  135. if ($data[$key] === null) {
  136. $data[$key] = 0.0;
  137. }
  138. }
  139. }
  140. unset($data[Totals::KEY_BASE_SUBTOTAL_INCL_TAX]);
  141. return $data;
  142. }
  143. /**
  144. * Fetch quote item totals data from quote
  145. *
  146. * @param \Magento\Quote\Model\Quote $quote
  147. * @return array
  148. */
  149. protected function getQuoteItemTotalsData(\Magento\Quote\Model\Quote $quote)
  150. {
  151. $items = $quote->getAllItems();
  152. $item = array_shift($items);
  153. return [
  154. ItemTotals::KEY_ITEM_ID => $item->getItemId(),
  155. ItemTotals::KEY_PRICE => $item->getPrice(),
  156. ItemTotals::KEY_BASE_PRICE => $item->getBasePrice(),
  157. ItemTotals::KEY_QTY => $item->getQty(),
  158. ItemTotals::KEY_ROW_TOTAL => $item->getRowTotal(),
  159. ItemTotals::KEY_BASE_ROW_TOTAL => $item->getBaseRowTotal(),
  160. ItemTotals::KEY_ROW_TOTAL_WITH_DISCOUNT => $item->getRowTotalWithDiscount(),
  161. ItemTotals::KEY_TAX_AMOUNT => $item->getTaxAmount(),
  162. ItemTotals::KEY_BASE_TAX_AMOUNT => $item->getBaseTaxAmount(),
  163. ItemTotals::KEY_TAX_PERCENT => $item->getTaxPercent(),
  164. ItemTotals::KEY_DISCOUNT_AMOUNT => $item->getDiscountAmount(),
  165. ItemTotals::KEY_BASE_DISCOUNT_AMOUNT => $item->getBaseDiscountAmount(),
  166. ItemTotals::KEY_DISCOUNT_PERCENT => $item->getDiscountPercent(),
  167. ItemTotals::KEY_PRICE_INCL_TAX => $item->getPriceInclTax(),
  168. ItemTotals::KEY_BASE_PRICE_INCL_TAX => $item->getBasePriceInclTax(),
  169. ItemTotals::KEY_ROW_TOTAL_INCL_TAX => $item->getRowTotalInclTax(),
  170. ItemTotals::KEY_BASE_ROW_TOTAL_INCL_TAX => $item->getBaseRowTotalInclTax(),
  171. ItemTotals::KEY_WEEE_TAX_APPLIED_AMOUNT => $item->getWeeeTaxAppliedAmount(),
  172. ItemTotals::KEY_WEEE_TAX_APPLIED => $item->getWeeeTaxApplied(),
  173. ItemTotals::KEY_NAME => $item->getName(),
  174. ];
  175. }
  176. }