Skip to content

Commit 61e8edd

Browse files
committed
ACP2E-4248: [GraphQl] cart query cart item discount issue on virtual quotes
1 parent 2f23435 commit 61e8edd

File tree

1 file changed

+126
-16
lines changed

1 file changed

+126
-16
lines changed

dev/tests/api-functional/testsuite/Magento/QuoteGraphQl/Model/DiscountsTest.php

Lines changed: 126 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@
1515
use Magento\Quote\Test\Fixture\AddProductToCart as AddProductToCartFixture;
1616
use Magento\Quote\Test\Fixture\CustomerCart;
1717
use Magento\Quote\Test\Fixture\QuoteIdMask;
18+
use Magento\SalesRule\Model\Rule;
19+
use Magento\SalesRule\Model\Rule\Condition\Product;
20+
use Magento\SalesRule\Model\Rule\Condition\Product\Combine;
1821
use Magento\SalesRule\Test\Fixture\Rule as SalesRuleFixture;
1922
use Magento\TestFramework\Fixture\DataFixture;
2023
use Magento\TestFramework\Fixture\DataFixtureStorageManager;
@@ -74,40 +77,100 @@ public function testDiscountsNonVirtualQuote()
7477
}
7578

7679
#[
77-
DataFixture(VirtualProductFixture::class, as: 'product'),
80+
DataFixture(
81+
VirtualProductFixture::class,
82+
['sku' => 'virtual111', 'price' => 100, 'category_ids' => [2]],
83+
as: 'product1'
84+
),
85+
DataFixture(
86+
VirtualProductFixture::class,
87+
['sku' => 'virtual222', 'price' => 100, 'category_ids' => [2]],
88+
as: 'product2'
89+
),
7890
DataFixture(Customer::class, ['email' => 'customer@example.com'], as: 'customer'),
7991
DataFixture(CustomerCart::class, ['customer_id' => '$customer.id$'], as: 'cart'),
80-
DataFixture(AddProductToCartFixture::class, ['cart_id' => '$cart.id$', 'product_id' => '$product.id$']),
81-
DataFixture(QuoteIdMask::class, ['cart_id' => '$cart.id$'], as: 'quoteIdMask'),
82-
DataFixture(SalesRuleFixture::class, ['discount_amount' => 10, 'simple_action' => 'by_percent'], as: 'rule')
92+
DataFixture(AddProductToCartFixture::class, ['cart_id' => '$cart.id$', 'product_id' => '$product1.id$']),
93+
DataFixture(AddProductToCartFixture::class, ['cart_id' => '$cart.id$', 'product_id' => '$product2.id$']),
94+
DataFixture(QuoteIdMask::class, ['cart_id' => '$cart.id$'], as: 'quoteIdMask')
8395
]
8496
/**
85-
* Test discounts resolver for a virtual quote
97+
* Test discounts resolver for a virtual quote with conditional discount on specific SKU
8698
*/
8799
public function testDiscountsVirtualQuote()
88100
{
89-
$maskedQuoteId = DataFixtureStorageManager::getStorage()->get('quoteIdMask')->getMaskedId();
90-
$query = $this->getCartDiscountsQuery($maskedQuoteId);
101+
// Using SalesRule DataFixture is not working for this case
102+
$objectManager = Bootstrap::getObjectManager();
103+
/** @var Rule $rule */
104+
$rule = $objectManager->create(Rule::class);
105+
$rule->setName('10% off for virtual222')
106+
->setIsActive(1)
107+
->setSimpleAction('by_percent');
108+
$rule->loadPost([
109+
'name' => '10% off for virtual222',
110+
'is_active' => 1,
111+
'simple_action' => 'by_percent',
112+
'discount_amount' => 10,
113+
'website_ids' => [1],
114+
'customer_group_ids' => [0, 1, 2, 3],
115+
'actions' => [
116+
1 => [
117+
'type' => Combine::class,
118+
'attribute' => null,
119+
'operator' => null,
120+
'value' => '1',
121+
'is_value_processed' => null,
122+
'aggregator' => 'all',
123+
'actions' => [
124+
1 => [
125+
'type' => Product::class,
126+
'attribute' => 'sku',
127+
'operator' => '==',
128+
'value' => 'virtual222',
129+
'is_value_processed' => false,
130+
]
131+
]
132+
]
133+
],
134+
]);
135+
$rule->save();
136+
$quoteIdMask = DataFixtureStorageManager::getStorage()->get('quoteIdMask');
137+
$maskedQuoteId = $quoteIdMask->getMaskedId();
138+
$query = $this->getCartDiscountsQueryWithItems($maskedQuoteId);
91139
$response = $this->graphQlQuery(
92140
$query,
93141
[],
94142
'',
95143
$this->getHeaderMap()
96144
);
97145
$cartData = $response['cart'];
98-
$discounts = $cartData['prices']['discounts'] ?? [];
99-
$this->assertNotEmpty($discounts);
100-
$this->assertCount(1, $discounts);
101-
$discount = $discounts[0];
146+
$this->assertCount(2, $cartData['items']);
147+
$virtual1Item = null;
148+
$virtual2Item = null;
149+
foreach ($cartData['items'] as $item) {
150+
if ($item['product']['sku'] === 'virtual111') {
151+
$virtual1Item = $item;
152+
} elseif ($item['product']['sku'] === 'virtual222') {
153+
$virtual2Item = $item;
154+
}
155+
}
156+
157+
$this->assertNotNull($virtual1Item, 'virtual1 item not found in cart');
158+
$this->assertNotNull($virtual2Item, 'virtual2 item not found in cart');
159+
$this->assertEmpty($virtual1Item['prices']['discounts'], 'virtual111 should not have any discounts');
160+
$this->assertNotEmpty($virtual2Item['prices']['discounts'], 'virtual222 should have discounts');
161+
$this->assertCount(1, $virtual2Item['prices']['discounts']);
162+
$discount = $virtual2Item['prices']['discounts'][0];
102163
$this->assertArrayHasKey('label', $discount);
103164
$this->assertArrayHasKey('amount', $discount);
104165
$this->assertArrayHasKey('value', $discount['amount']);
105-
$this->assertArrayHasKey('currency', $discount['amount']);
106-
$this->assertArrayHasKey('applied_to', $discount);
107166
$this->assertEquals('Discount', $discount['label']);
108-
$this->assertGreaterThan(0, $discount['amount']['value']);
109-
$this->assertEquals('USD', $discount['amount']['currency']);
110-
$this->assertEquals('ITEM', $discount['applied_to']);
167+
$this->assertEquals(10, $discount['amount']['value']);
168+
$cartDiscounts = $cartData['prices']['discounts'] ?? [];
169+
$this->assertNotEmpty($cartDiscounts, 'Cart should have discounts');
170+
$this->assertCount(1, $cartDiscounts);
171+
$this->assertEquals('Discount', $cartDiscounts[0]['label']);
172+
$this->assertEquals('ITEM', $cartDiscounts[0]['applied_to']);
173+
$this->assertEquals(10, $cartDiscounts[0]['amount']['value']);
111174
}
112175

113176
#[
@@ -161,6 +224,53 @@ private function getCartDiscountsQuery(string $maskedQuoteId): string
161224
QUERY;
162225
}
163226

227+
/**
228+
* Get cart discounts query with items
229+
*
230+
* @param string $maskedQuoteId
231+
* @return string
232+
*/
233+
private function getCartDiscountsQueryWithItems(string $maskedQuoteId): string
234+
{
235+
return <<<QUERY
236+
query {
237+
cart(cart_id: "{$maskedQuoteId}") {
238+
items {
239+
product {
240+
sku
241+
name
242+
}
243+
prices {
244+
price {
245+
value
246+
}
247+
row_total {
248+
value
249+
}
250+
discounts {
251+
label
252+
amount {
253+
value
254+
currency
255+
}
256+
}
257+
}
258+
}
259+
prices {
260+
discounts {
261+
label
262+
amount {
263+
value
264+
currency
265+
}
266+
applied_to
267+
}
268+
}
269+
}
270+
}
271+
QUERY;
272+
}
273+
164274
/**
165275
* Get bearer authorization header
166276
*

0 commit comments

Comments
 (0)