Skip to content

Commit 6fe4810

Browse files
sumesh-GLsvera
andauthored
LYNX-402: Internal server error when trying to get priceDetails for Bundle products with dynamic price
* LYNX-402: Fix DivisionByZeroError at Magento/BundleGraphQl/Model/Resolver/BundlePriceDetails.php:31 * LYNX-402: Test coverage for division by zero error * LYNX-402: Internal server error when trying to get priceDetails for Bundle products with dynamic price Moved the test coverage to dev/tests/api-functional/testsuite/Magento/GraphQl/Bundle/BundleProductMainPriceTest.php from dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/GetCartTest.php --------- Co-authored-by: Sergio Vera <svera@adobe.com>
1 parent beb7f44 commit 6fe4810

File tree

2 files changed

+96
-1
lines changed

2 files changed

+96
-1
lines changed

app/code/Magento/BundleGraphQl/Model/Resolver/BundlePriceDetails.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public function resolve(Field $field, $context, ResolveInfo $info, array $value
2828

2929
$price = $product->getPrice();
3030
$finalPrice = $product->getFinalPrice();
31-
$discountPercentage = 100 - (($finalPrice * 100) / $price);
31+
$discountPercentage = ($price) ? (100 - (($finalPrice * 100) / $price)) : 0;
3232
return [
3333
'main_price' => $price,
3434
'main_final_price' => $finalPrice,

dev/tests/api-functional/testsuite/Magento/GraphQl/Bundle/BundleProductMainPriceTest.php

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,38 @@
77

88
namespace Magento\GraphQl\Bundle;
99

10+
use Magento\Bundle\Test\Fixture\AddProductToCart as AddBundleProductToCart;
11+
use Magento\Bundle\Test\Fixture\Link as BundleSelectionFixture;
12+
use Magento\Bundle\Test\Fixture\Option as BundleOptionFixture;
13+
use Magento\Bundle\Test\Fixture\Product as BundleProductFixture;
14+
use Magento\Catalog\Test\Fixture\Product as ProductFixture;
15+
use Magento\Quote\Model\QuoteIdToMaskedQuoteIdInterface;
16+
use Magento\Quote\Test\Fixture\GuestCart as GuestCartFixture;
17+
use Magento\TestFramework\Fixture\DataFixture;
18+
use Magento\TestFramework\Fixture\DataFixtureStorage;
19+
use Magento\TestFramework\Fixture\DataFixtureStorageManager;
20+
use Magento\TestFramework\Helper\Bootstrap;
1021
use Magento\TestFramework\TestCase\GraphQlAbstract;
1122

1223
class BundleProductMainPriceTest extends GraphQlAbstract
1324
{
25+
/**
26+
* @var QuoteIdToMaskedQuoteIdInterface
27+
*/
28+
private $quoteIdToMaskedId;
29+
30+
/**
31+
* @var DataFixtureStorage
32+
*/
33+
private $fixtures;
34+
35+
protected function setUp(): void
36+
{
37+
$objectManager = Bootstrap::getObjectManager();
38+
$this->quoteIdToMaskedId = $objectManager->get(QuoteIdToMaskedQuoteIdInterface::class);
39+
$this->fixtures = DataFixtureStorageManager::getStorage();
40+
}
41+
1442
public function getQuery()
1543
{
1644
$productSku = 'fixed_bundle_product_with_special_price';
@@ -129,4 +157,71 @@ public function testBundleProductPriceDetails(): void
129157
$this->assertEquals(40.0, $priceDetails['main_final_price']);
130158
$this->assertEquals(20, $priceDetails['discount_percentage']);
131159
}
160+
161+
#[
162+
DataFixture(ProductFixture::class, ['sku' => 'simple1', 'price' => 10], as:'p1'),
163+
DataFixture(ProductFixture::class, ['sku' => 'simple2', 'price' => 20], as:'p2'),
164+
DataFixture(BundleSelectionFixture::class, ['sku' => '$p1.sku$'], as:'link1'),
165+
DataFixture(BundleSelectionFixture::class, ['sku' => '$p2.sku$'], as:'link2'),
166+
DataFixture(BundleOptionFixture::class, ['title' => 'Checkbox Options', 'type' => 'checkbox',
167+
'required' => 1,'product_links' => ['$link1$', '$link2$']], 'opt1'),
168+
DataFixture(BundleOptionFixture::class, ['title' => 'Checkbox Options', 'type' => 'checkbox',
169+
'required' => 1,'product_links' => ['$link1$', '$link2$']], 'opt2'),
170+
DataFixture(
171+
BundleProductFixture::class,
172+
['sku' => 'bundle-product-multiselect-checkbox-options', '_options' => ['$opt1$', '$opt2$']],
173+
as:'bp1'
174+
),
175+
DataFixture(GuestCartFixture::class, as: 'guestCart'),
176+
DataFixture(
177+
AddBundleProductToCart::class,
178+
[
179+
'cart_id' => '$guestCart.id$',
180+
'product_id' => '$bp1.id$',
181+
'selections' => [['$p1.id$'], ['$p2.id$']],
182+
'qty' => 2
183+
]
184+
)
185+
]
186+
public function testCartBundleProductPriceDetails()
187+
{
188+
$guestCart = $this->fixtures->get('guestCart');
189+
$guestQuoteMaskedId = $this->quoteIdToMaskedId->execute((int)$guestCart->getId());
190+
191+
$cartQuery = $this->getGuestCartQuery($guestQuoteMaskedId);
192+
$cartResponse = $this->graphQlMutation($cartQuery);
193+
$productPriceDetails = $cartResponse['cart']['itemsV2']['items'][0]['product']['price_details'];
194+
self::assertArrayHasKey('main_price', $productPriceDetails);
195+
self::assertArrayHasKey('main_final_price', $productPriceDetails);
196+
self::assertArrayHasKey('discount_percentage', $productPriceDetails);
197+
self::assertEquals(0, $productPriceDetails['main_price']);
198+
self::assertEquals(30, $productPriceDetails['main_final_price']);
199+
self::assertEquals(0, $productPriceDetails['discount_percentage']);
200+
}
201+
202+
private function getGuestCartQuery(string $maskedId): string
203+
{
204+
return <<<QUERY
205+
{
206+
cart(cart_id: "{$maskedId}") {
207+
itemsV2 {
208+
items {
209+
product {
210+
sku
211+
... on BundleProduct {
212+
dynamic_price
213+
price_view
214+
price_details {
215+
main_price
216+
main_final_price
217+
discount_percentage
218+
}
219+
}
220+
}
221+
}
222+
}
223+
}
224+
}
225+
QUERY;
226+
}
132227
}

0 commit comments

Comments
 (0)