Skip to content

Commit 265d82e

Browse files
committed
GraphQL-425: [Place order] Cart grand total
1 parent 9e8519d commit 265d82e

File tree

4 files changed

+102
-88
lines changed

4 files changed

+102
-88
lines changed

app/code/Magento/QuoteGraphQl/Model/Resolver/Totals.php renamed to app/code/Magento/QuoteGraphQl/Model/Resolver/CartPrices.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,14 @@
1111
use Magento\Framework\GraphQl\Config\Element\Field;
1212
use Magento\Framework\GraphQl\Query\ResolverInterface;
1313
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
14+
use Magento\Quote\Model\Quote;
1415
use Magento\Quote\Model\Quote\Address\Total;
1516
use Magento\Quote\Model\Quote\TotalsCollector;
1617

1718
/**
1819
* @inheritdoc
1920
*/
20-
class Totals implements ResolverInterface
21+
class CartPrices implements ResolverInterface
2122
{
2223
/**
2324
* @var TotalsCollector
@@ -68,10 +69,11 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
6869
*/
6970
private function getAppliedTaxes(Total $total, string $currency): array
7071
{
72+
$appliedTaxesData = [];
7173
$appliedTaxes = $total->getAppliedTaxes();
7274

7375
if (count($appliedTaxes) === 0) {
74-
return [];
76+
return $appliedTaxesData;
7577
}
7678

7779
foreach ($appliedTaxes as $appliedTax) {
@@ -80,7 +82,6 @@ private function getAppliedTaxes(Total $total, string $currency): array
8082
'amount' => ['value' => $appliedTax['amount'], 'currency' => $currency]
8183
];
8284
}
83-
8485
return $appliedTaxesData;
8586
}
8687
}

app/code/Magento/QuoteGraphQl/etc/schema.graphqls

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ type Cart {
173173
billing_address: CartAddress! @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\BillingAddress")
174174
available_payment_methods: [AvailablePaymentMethod] @resolver(class: "Magento\\QuoteGraphQl\\Model\\Resolver\\AvailablePaymentMethods") @doc(description: "Available payment methods")
175175
selected_payment_method: SelectedPaymentMethod @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\SelectedPaymentMethod")
176-
prices: CartPrices @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\Totals")
176+
prices: CartPrices @resolver(class: "\\Magento\\QuoteGraphQl\\Model\\Resolver\\CartPrices")
177177
}
178178

179179
type CartAddress {

dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Customer/CartTotalsTest.php

Lines changed: 63 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,8 @@
77

88
namespace Magento\GraphQl\Quote\Customer;
99

10+
use Magento\GraphQl\Quote\GetMaskedQuoteIdByReservedOrderId;
1011
use Magento\Integration\Api\CustomerTokenServiceInterface;
11-
use Magento\Quote\Model\QuoteFactory;
12-
use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;
13-
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
1412
use Magento\TestFramework\Helper\Bootstrap;
1513
use Magento\TestFramework\TestCase\GraphQlAbstract;
1614

@@ -25,26 +23,14 @@ class CartTotalsTest extends GraphQlAbstract
2523
private $customerTokenService;
2624

2725
/**
28-
* @var QuoteResource
26+
* @var GetMaskedQuoteIdByReservedOrderId
2927
*/
30-
private $quoteResource;
31-
32-
/**
33-
* @var QuoteFactory
34-
*/
35-
private $quoteFactory;
36-
37-
/**
38-
* @var QuoteIdToMaskedQuoteIdInterface
39-
*/
40-
private $quoteIdToMaskedId;
28+
private $getMaskedQuoteIdByReservedOrderId;
4129

4230
protected function setUp()
4331
{
4432
$objectManager = Bootstrap::getObjectManager();
45-
$this->quoteResource = $objectManager->get(QuoteResource::class);
46-
$this->quoteFactory = $objectManager->get(QuoteFactory::class);
47-
$this->quoteIdToMaskedId = $objectManager->get(QuoteIdToMaskedQuoteIdInterface::class);
33+
$this->getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class);
4834
$this->customerTokenService = $objectManager->get(CustomerTokenServiceInterface::class);
4935
}
5036

@@ -60,9 +46,9 @@ protected function setUp()
6046
*/
6147
public function testGetCartTotalsWithTaxApplied()
6248
{
63-
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_quote');
64-
$query = $this->getCartTotalsGraphqlQuery($maskedQuoteId);
65-
$response = $this->sendRequestWithToken($query);
49+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
50+
$query = $this->getQuery($maskedQuoteId);
51+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
6652

6753
self::assertArrayHasKey('prices', $response['cart']);
6854
$pricesResponse = $response['cart']['prices'];
@@ -88,9 +74,9 @@ public function testGetCartTotalsWithTaxApplied()
8874
*/
8975
public function testGetTotalsWithNoTaxApplied()
9076
{
91-
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_quote');
92-
$query = $this->getCartTotalsGraphqlQuery($maskedQuoteId);
93-
$response = $this->sendRequestWithToken($query);
77+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
78+
$query = $this->getQuery($maskedQuoteId);
79+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
9480

9581
$pricesResponse = $response['cart']['prices'];
9682
self::assertEquals(20, $pricesResponse['grand_total']['value']);
@@ -111,9 +97,9 @@ public function testGetTotalsWithNoTaxApplied()
11197
*/
11298
public function testGetCartTotalsWithNoAddressSet()
11399
{
114-
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_quote');
115-
$query = $this->getCartTotalsGraphqlQuery($maskedQuoteId);
116-
$response = $this->sendRequestWithToken($query);
100+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
101+
$query = $this->getQuery($maskedQuoteId);
102+
$response = $this->graphQlQuery($query, [], '', $this->getHeaderMap());
117103

118104
$pricesResponse = $response['cart']['prices'];
119105
self::assertEquals(20, $pricesResponse['grand_total']['value']);
@@ -123,13 +109,57 @@ public function testGetCartTotalsWithNoAddressSet()
123109
self::assertEmpty($pricesResponse['applied_taxes']);
124110
}
125111

112+
/**
113+
* _security
114+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
115+
* @magentoApiDataFixture Magento/GraphQl/Tax/_files/tax_rule_for_region_1.php
116+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
117+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/apply_tax_for_simple_product.php
118+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
119+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
120+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
121+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
122+
*/
123+
public function testGetTotalsFromGuestCart()
124+
{
125+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
126+
$query = $this->getQuery($maskedQuoteId);
127+
128+
$this->expectExceptionMessage(
129+
"The current user cannot perform operations on cart \"$maskedQuoteId\""
130+
);
131+
$this->graphQlQuery($query, [], '', $this->getHeaderMap());
132+
}
133+
134+
/**
135+
* _security
136+
* @magentoApiDataFixture Magento/Customer/_files/three_customers.php
137+
* @magentoApiDataFixture Magento/GraphQl/Tax/_files/tax_rule_for_region_1.php
138+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
139+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/apply_tax_for_simple_product.php
140+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php
141+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
142+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
143+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
144+
*/
145+
public function testGetTotalsFromAnotherCustomerCart()
146+
{
147+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
148+
$query = $this->getQuery($maskedQuoteId);
149+
150+
$this->expectExceptionMessage(
151+
"The current user cannot perform operations on cart \"$maskedQuoteId\""
152+
);
153+
$this->graphQlQuery($query, [], '', $this->getHeaderMap('customer3@search.example.com'));
154+
}
155+
126156
/**
127157
* Generates GraphQl query for retrieving cart totals
128158
*
129159
* @param string $maskedQuoteId
130160
* @return string
131161
*/
132-
private function getCartTotalsGraphqlQuery(string $maskedQuoteId): string
162+
private function getQuery(string $maskedQuoteId): string
133163
{
134164
return <<<QUERY
135165
{
@@ -165,30 +195,14 @@ private function getCartTotalsGraphqlQuery(string $maskedQuoteId): string
165195
}
166196

167197
/**
168-
* @param string $reversedQuoteId
169-
* @return string
170-
*/
171-
private function getMaskedQuoteIdByReversedQuoteId(string $reversedQuoteId): string
172-
{
173-
$quote = $this->quoteFactory->create();
174-
$this->quoteResource->load($quote, $reversedQuoteId, 'reserved_order_id');
175-
176-
return $this->quoteIdToMaskedId->execute((int)$quote->getId());
177-
}
178-
179-
/**
180-
* Sends a GraphQL request with using a bearer token
181-
*
182-
* @param string $query
198+
* @param string $username
199+
* @param string $password
183200
* @return array
184-
* @throws \Magento\Framework\Exception\AuthenticationException
185201
*/
186-
private function sendRequestWithToken(string $query): array
202+
private function getHeaderMap(string $username = 'customer@example.com', string $password = 'password'): array
187203
{
188-
189-
$customerToken = $this->customerTokenService->createCustomerAccessToken('customer@example.com', 'password');
204+
$customerToken = $this->customerTokenService->createCustomerAccessToken($username, $password);
190205
$headerMap = ['Authorization' => 'Bearer ' . $customerToken];
191-
192-
return $this->graphQlQuery($query, [], '', $headerMap);
206+
return $headerMap;
193207
}
194208
}

dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CartTotalsTest.php

Lines changed: 34 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,7 @@
77

88
namespace Magento\GraphQl\Quote\Guest;
99

10-
use Magento\Quote\Model\QuoteFactory;
11-
use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;
12-
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
10+
use Magento\GraphQl\Quote\GetMaskedQuoteIdByReservedOrderId;
1311
use Magento\TestFramework\Helper\Bootstrap;
1412
use Magento\TestFramework\TestCase\GraphQlAbstract;
1513

@@ -19,26 +17,17 @@
1917
class CartTotalsTest extends GraphQlAbstract
2018
{
2119
/**
22-
* @var QuoteResource
20+
* @var GetMaskedQuoteIdByReservedOrderId
2321
*/
24-
private $quoteResource;
22+
private $getMaskedQuoteIdByReservedOrderId;
2523

2624
/**
27-
* @var QuoteFactory
25+
* @inheritdoc
2826
*/
29-
private $quoteFactory;
30-
31-
/**
32-
* @var QuoteIdToMaskedQuoteIdInterface
33-
*/
34-
private $quoteIdToMaskedId;
35-
3627
protected function setUp()
3728
{
3829
$objectManager = Bootstrap::getObjectManager();
39-
$this->quoteResource = $objectManager->get(QuoteResource::class);
40-
$this->quoteFactory = $objectManager->get(QuoteFactory::class);
41-
$this->quoteIdToMaskedId = $objectManager->get(QuoteIdToMaskedQuoteIdInterface::class);
30+
$this->getMaskedQuoteIdByReservedOrderId = $objectManager->get(GetMaskedQuoteIdByReservedOrderId::class);
4231
}
4332

4433
/**
@@ -52,8 +41,8 @@ protected function setUp()
5241
*/
5342
public function testGetCartTotalsWithTaxApplied()
5443
{
55-
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_quote');
56-
$query = $this->getCartTotalsGraphqlQuery($maskedQuoteId);
44+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
45+
$query = $this->getQuery($maskedQuoteId);
5746
$response = $this->graphQlQuery($query);
5847

5948
self::assertArrayHasKey('prices', $response['cart']);
@@ -79,8 +68,8 @@ public function testGetCartTotalsWithTaxApplied()
7968
*/
8069
public function testGetTotalsWithNoTaxApplied()
8170
{
82-
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_quote');
83-
$query = $this->getCartTotalsGraphqlQuery($maskedQuoteId);
71+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
72+
$query = $this->getQuery($maskedQuoteId);
8473
$response = $this->graphQlQuery($query);
8574

8675
$pricesResponse = $response['cart']['prices'];
@@ -102,8 +91,8 @@ public function testGetTotalsWithNoTaxApplied()
10291
*/
10392
public function testGetCartTotalsWithNoAddressSet()
10493
{
105-
$maskedQuoteId = $this->getMaskedQuoteIdByReversedQuoteId('test_quote');
106-
$query = $this->getCartTotalsGraphqlQuery($maskedQuoteId);
94+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
95+
$query = $this->getQuery($maskedQuoteId);
10796
$response = $this->graphQlQuery($query);
10897

10998
$pricesResponse = $response['cart']['prices'];
@@ -114,13 +103,35 @@ public function testGetCartTotalsWithNoAddressSet()
114103
self::assertEmpty($pricesResponse['applied_taxes']);
115104
}
116105

106+
/**
107+
* _security
108+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
109+
* @magentoApiDataFixture Magento/GraphQl/Tax/_files/tax_rule_for_region_1.php
110+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/simple_product.php
111+
* @magentoApiDataFixture Magento/GraphQl/Catalog/_files/apply_tax_for_simple_product.php
112+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php
113+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_simple_product.php
114+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
115+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_billing_address.php
116+
*/
117+
public function testGetSelectedShippingMethodFromCustomerCart()
118+
{
119+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
120+
$query = $this->getQuery($maskedQuoteId);
121+
122+
$this->expectExceptionMessage(
123+
"The current user cannot perform operations on cart \"$maskedQuoteId\""
124+
);
125+
$this->graphQlQuery($query);
126+
}
127+
117128
/**
118129
* Generates GraphQl query for retrieving cart totals
119130
*
120131
* @param string $maskedQuoteId
121132
* @return string
122133
*/
123-
private function getCartTotalsGraphqlQuery(string $maskedQuoteId): string
134+
private function getQuery(string $maskedQuoteId): string
124135
{
125136
return <<<QUERY
126137
{
@@ -154,16 +165,4 @@ private function getCartTotalsGraphqlQuery(string $maskedQuoteId): string
154165
}
155166
QUERY;
156167
}
157-
158-
/**
159-
* @param string $reversedQuoteId
160-
* @return string
161-
*/
162-
private function getMaskedQuoteIdByReversedQuoteId(string $reversedQuoteId): string
163-
{
164-
$quote = $this->quoteFactory->create();
165-
$this->quoteResource->load($quote, $reversedQuoteId, 'reserved_order_id');
166-
167-
return $this->quoteIdToMaskedId->execute((int)$quote->getId());
168-
}
169168
}

0 commit comments

Comments
 (0)