GetCartTest.php 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\GraphQl\Quote;
  8. use Magento\Integration\Api\CustomerTokenServiceInterface;
  9. use Magento\Quote\Model\Quote;
  10. use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;
  11. use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
  12. use Magento\TestFramework\Helper\Bootstrap;
  13. use Magento\TestFramework\TestCase\GraphQlAbstract;
  14. /**
  15. * Test for getting cart information
  16. */
  17. class GetCartTest extends GraphQlAbstract
  18. {
  19. /**
  20. * @var CustomerTokenServiceInterface
  21. */
  22. private $customerTokenService;
  23. /**
  24. * @var QuoteResource
  25. */
  26. private $quoteResource;
  27. /**
  28. * @var Quote
  29. */
  30. private $quote;
  31. /**
  32. * @var QuoteIdToMaskedQuoteIdInterface
  33. */
  34. private $quoteIdToMaskedId;
  35. /**
  36. * @inheritdoc
  37. */
  38. protected function setUp()
  39. {
  40. $this->markTestIncomplete('https://github.com/magento/graphql-ce/issues/434');
  41. $objectManager = Bootstrap::getObjectManager();
  42. $this->quoteResource = $objectManager->create(QuoteResource::class);
  43. $this->quote = $objectManager->create(Quote::class);
  44. $this->quoteIdToMaskedId = $objectManager->create(QuoteIdToMaskedQuoteIdInterface::class);
  45. $this->customerTokenService = $objectManager->get(CustomerTokenServiceInterface::class);
  46. }
  47. /**
  48. * @magentoApiDataFixture Magento/Checkout/_files/quote_with_items_saved.php
  49. */
  50. public function testGetOwnCartForRegisteredCustomer()
  51. {
  52. $reservedOrderId = 'test_order_item_with_items';
  53. $this->quoteResource->load(
  54. $this->quote,
  55. $reservedOrderId,
  56. 'reserved_order_id'
  57. );
  58. $maskedQuoteId = $this->quoteIdToMaskedId->execute((int)$this->quote->getId());
  59. $query = $this->prepareGetCartQuery($maskedQuoteId);
  60. $response = $this->sendRequestWithToken($query);
  61. self::assertArrayHasKey('cart', $response);
  62. self::assertNotEmpty($response['cart']['items']);
  63. self::assertNotEmpty($response['cart']['shipping_addresses']);
  64. }
  65. /**
  66. * @magentoApiDataFixture Magento/Checkout/_files/quote_with_items_saved.php
  67. */
  68. public function testGetCartFromAnotherCustomer()
  69. {
  70. $reservedOrderId = 'test_order_item_with_items';
  71. $this->quoteResource->load(
  72. $this->quote,
  73. $reservedOrderId,
  74. 'reserved_order_id'
  75. );
  76. $maskedQuoteId = $this->quoteIdToMaskedId->execute((int)$this->quote->getId());
  77. $query = $this->prepareGetCartQuery($maskedQuoteId);
  78. self::expectExceptionMessage("The current user cannot perform operations on cart \"$maskedQuoteId\"");
  79. $this->graphQlQuery($query);
  80. }
  81. /**
  82. * @magentoApiDataFixture Magento/Checkout/_files/active_quote.php
  83. */
  84. public function testGetCartForGuest()
  85. {
  86. $reservedOrderId = 'test_order_1';
  87. $this->quoteResource->load(
  88. $this->quote,
  89. $reservedOrderId,
  90. 'reserved_order_id'
  91. );
  92. $maskedQuoteId = $this->quoteIdToMaskedId->execute((int)$this->quote->getId());
  93. $query = $this->prepareGetCartQuery($maskedQuoteId);
  94. $response = $this->graphQlQuery($query);
  95. self::assertArrayHasKey('cart', $response);
  96. }
  97. public function testGetNonExistentCart()
  98. {
  99. $maskedQuoteId = 'non_existent_masked_id';
  100. $query = $this->prepareGetCartQuery($maskedQuoteId);
  101. self::expectExceptionMessage("Could not find a cart with ID \"$maskedQuoteId\"");
  102. $this->graphQlQuery($query);
  103. }
  104. /**
  105. * Generates query for setting the specified shipping method on cart
  106. *
  107. * @param string $maskedQuoteId
  108. * @return string
  109. */
  110. private function prepareGetCartQuery(
  111. string $maskedQuoteId
  112. ) : string {
  113. return <<<QUERY
  114. {
  115. cart(cart_id: "$maskedQuoteId") {
  116. applied_coupon {
  117. code
  118. }
  119. items {
  120. id
  121. }
  122. shipping_addresses {
  123. firstname,
  124. lastname
  125. }
  126. }
  127. }
  128. QUERY;
  129. }
  130. /**
  131. * Sends a GraphQL request with using a bearer token
  132. *
  133. * @param string $query
  134. * @return array
  135. * @throws \Magento\Framework\Exception\AuthenticationException
  136. */
  137. private function sendRequestWithToken(string $query): array
  138. {
  139. $customerToken = $this->customerTokenService->createCustomerAccessToken('customer@example.com', 'password');
  140. $headerMap = ['Authorization' => 'Bearer ' . $customerToken];
  141. return $this->graphQlQuery($query, [], '', $headerMap);
  142. }
  143. }