Skip to content

Commit 5a8518c

Browse files
authored
Merge pull request #5418 from magento-performance/honey-combined-PR23
[honey-combined-PR23] MC-31420: [GraphQL] Flat Rate shipping amount is returned as $10 instead of $5 for 1st configurable product in cart.
2 parents 9bb5cd6 + 9a2c6b1 commit 5a8518c

File tree

4 files changed

+157
-7
lines changed

4 files changed

+157
-7
lines changed

app/code/Magento/QuoteGraphQl/Model/Resolver/ShippingAddress/AvailableShippingMethods.php

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,14 @@
77

88
namespace Magento\QuoteGraphQl\Model\Resolver\ShippingAddress;
99

10-
use Magento\Directory\Model\Currency;
1110
use Magento\Framework\Api\ExtensibleDataObjectConverter;
1211
use Magento\Framework\Exception\LocalizedException;
13-
use Magento\Framework\Exception\NoSuchEntityException;
1412
use Magento\Framework\GraphQl\Config\Element\Field;
1513
use Magento\Framework\GraphQl\Query\ResolverInterface;
1614
use Magento\Framework\GraphQl\Schema\Type\ResolveInfo;
1715
use Magento\Quote\Api\Data\ShippingMethodInterface;
1816
use Magento\Quote\Model\Cart\ShippingMethodConverter;
19-
use Magento\Store\Api\Data\StoreInterface;
17+
use Magento\Quote\Model\Quote\TotalsCollector;
2018

2119
/**
2220
* @inheritdoc
@@ -33,16 +31,24 @@ class AvailableShippingMethods implements ResolverInterface
3331
*/
3432
private $shippingMethodConverter;
3533

34+
/**
35+
* @var TotalsCollector
36+
*/
37+
private $totalsCollector;
38+
3639
/**
3740
* @param ExtensibleDataObjectConverter $dataObjectConverter
3841
* @param ShippingMethodConverter $shippingMethodConverter
42+
* @param TotalsCollector $totalsCollector
3943
*/
4044
public function __construct(
4145
ExtensibleDataObjectConverter $dataObjectConverter,
42-
ShippingMethodConverter $shippingMethodConverter
46+
ShippingMethodConverter $shippingMethodConverter,
47+
TotalsCollector $totalsCollector
4348
) {
4449
$this->dataObjectConverter = $dataObjectConverter;
4550
$this->shippingMethodConverter = $shippingMethodConverter;
51+
$this->totalsCollector = $totalsCollector;
4652
}
4753

4854
/**
@@ -61,9 +67,8 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
6167
}
6268

6369
$address->setCollectShippingRates(true);
64-
$address->collectShippingRates();
6570
$cart = $address->getQuote();
66-
71+
$this->totalsCollector->collectAddressTotals($cart, $address);
6772
$methods = [];
6873
$shippingRates = $address->getGroupedAllShippingRates();
6974
foreach ($shippingRates as $carrierRates) {
@@ -88,7 +93,6 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
8893
* @param array $data
8994
* @param string $quoteCurrencyCode
9095
* @return array
91-
* @throws NoSuchEntityException
9296
*/
9397
private function processMoneyTypeData(array $data, string $quoteCurrencyCode): array
9498
{

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

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,51 @@ public function testGetAvailableShippingMethods()
8282
);
8383
}
8484

85+
/**
86+
* Test case: get available shipping methods from current customer quote with configurable product
87+
*
88+
* @magentoApiDataFixture Magento/Customer/_files/customer.php
89+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/customer/create_empty_cart.php
90+
* @magentoApiDataFixture Magento/CatalogRule/_files/configurable_product.php
91+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_configurable_product.php
92+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
93+
*/
94+
public function testGetAvailableShippingMethodsWithConfigurableProduct()
95+
{
96+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
97+
$response = $this->graphQlQuery($this->getQuery($maskedQuoteId), [], '', $this->getHeaderMap());
98+
99+
self::assertArrayHasKey('cart', $response);
100+
self::assertArrayHasKey('shipping_addresses', $response['cart']);
101+
self::assertCount(1, $response['cart']['shipping_addresses']);
102+
self::assertArrayHasKey('available_shipping_methods', $response['cart']['shipping_addresses'][0]);
103+
self::assertCount(1, $response['cart']['shipping_addresses'][0]['available_shipping_methods']);
104+
105+
$expectedAddressData = [
106+
'amount' => [
107+
'value' => 5,
108+
'currency' => 'USD',
109+
],
110+
'carrier_code' => 'flatrate',
111+
'carrier_title' => 'Flat Rate',
112+
'error_message' => '',
113+
'method_code' => 'flatrate',
114+
'method_title' => 'Fixed',
115+
'price_incl_tax' => [
116+
'value' => 5,
117+
'currency' => 'USD',
118+
],
119+
'price_excl_tax' => [
120+
'value' => 5,
121+
'currency' => 'USD',
122+
],
123+
];
124+
self::assertEquals(
125+
$expectedAddressData,
126+
$response['cart']['shipping_addresses'][0]['available_shipping_methods'][0]
127+
);
128+
}
129+
85130
/**
86131
* _security
87132
* @magentoApiDataFixture Magento/Customer/_files/customer.php

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

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,57 @@ public function testGetAvailableShippingMethods()
8181
);
8282
}
8383

84+
/**
85+
* Test case: get available shipping methods from current customer quote with configurable product
86+
*
87+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/guest/create_empty_cart.php
88+
* @magentoApiDataFixture Magento/CatalogRule/_files/configurable_product.php
89+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/add_configurable_product.php
90+
* @magentoApiDataFixture Magento/GraphQl/Quote/_files/set_new_shipping_address.php
91+
*/
92+
public function testGetAvailableShippingMethodsWithConfigurableProduct()
93+
{
94+
$maskedQuoteId = $this->getMaskedQuoteIdByReservedOrderId->execute('test_quote');
95+
$response = $this->graphQlQuery($this->getQuery($maskedQuoteId));
96+
97+
self::assertArrayHasKey('cart', $response);
98+
self::assertArrayHasKey('shipping_addresses', $response['cart']);
99+
self::assertCount(1, $response['cart']['shipping_addresses']);
100+
self::assertArrayHasKey('available_shipping_methods', $response['cart']['shipping_addresses'][0]);
101+
self::assertCount(1, $response['cart']['shipping_addresses'][0]['available_shipping_methods']);
102+
103+
$expectedAddressData = [
104+
'amount' => [
105+
'value' => 5,
106+
'currency' => 'USD',
107+
],
108+
'carrier_code' => 'flatrate',
109+
'carrier_title' => 'Flat Rate',
110+
'error_message' => '',
111+
'method_code' => 'flatrate',
112+
'method_title' => 'Fixed',
113+
'price_incl_tax' => [
114+
'value' => 5,
115+
'currency' => 'USD',
116+
],
117+
'price_excl_tax' => [
118+
'value' => 5,
119+
'currency' => 'USD',
120+
],
121+
'base_amount' => null,
122+
];
123+
self::assertEquals(
124+
$expectedAddressData,
125+
$response['cart']['shipping_addresses'][0]['available_shipping_methods'][0]
126+
);
127+
self::assertCount(2, $response['cart']['shipping_addresses'][0]['cart_items']);
128+
self::assertCount(2, $response['cart']['shipping_addresses'][0]['cart_items_v2']);
129+
self::assertEquals(
130+
'configurable',
131+
$response['cart']['shipping_addresses'][0]['cart_items_v2'][0]['product']['sku']
132+
);
133+
}
134+
84135
/**
85136
* _security
86137
* @magentoApiDataFixture Magento/Customer/_files/customer.php
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
use Magento\Catalog\Api\ProductRepositoryInterface;
9+
use Magento\Quote\Api\CartRepositoryInterface;
10+
use Magento\Quote\Model\QuoteFactory;
11+
use Magento\Quote\Model\ResourceModel\Quote as QuoteResource;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
14+
/** @var ProductRepositoryInterface $productRepository */
15+
$productRepository = Bootstrap::getObjectManager()->get(ProductRepositoryInterface::class);
16+
/** @var QuoteFactory $quoteFactory */
17+
$quoteFactory = Bootstrap::getObjectManager()->get(QuoteFactory::class);
18+
/** @var QuoteResource $quoteResource */
19+
$quoteResource = Bootstrap::getObjectManager()->get(QuoteResource::class);
20+
/** @var CartRepositoryInterface $cartRepository */
21+
$cartRepository = Bootstrap::getObjectManager()->get(CartRepositoryInterface::class);
22+
23+
/** @var $product \Magento\Catalog\Model\Product */
24+
$product = $productRepository->get('configurable');
25+
/** @var $options \Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection */
26+
$options = Bootstrap::getObjectManager()->create(
27+
\Magento\Eav\Model\ResourceModel\Entity\Attribute\Option\Collection::class
28+
);
29+
30+
$attributeRepository = Bootstrap::getObjectManager()->get(\Magento\Eav\Api\AttributeRepositoryInterface::class);
31+
$attribute = $attributeRepository->get('catalog_product', 'test_configurable');
32+
33+
$option = $options->setAttributeFilter($attribute->getId())->getFirstItem();
34+
35+
$requestInfo = new \Magento\Framework\DataObject(
36+
[
37+
'product' => 1,
38+
'selected_configurable_option' => 1,
39+
'qty' => 1,
40+
'super_attribute' => [
41+
$attribute->getId() => $option->getId()
42+
]
43+
]
44+
);
45+
46+
47+
$quote = $quoteFactory->create();
48+
$quoteResource->load($quote, 'test_quote', 'reserved_order_id');
49+
$quote->addProduct($product, $requestInfo);
50+
$cartRepository->save($quote);

0 commit comments

Comments
 (0)