Skip to content

Commit 4686577

Browse files
committed
Merge remote-tracking branch 'origin/MC-19260' into 2.3-develop-pr31
2 parents e95cca3 + 49efcb1 commit 4686577

File tree

5 files changed

+173
-9
lines changed

5 files changed

+173
-9
lines changed

app/code/Magento/SalesRule/Model/Validator.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,8 @@ public function canApplyRules(AbstractItem $item)
243243
public function reset(Address $address)
244244
{
245245
$this->validatorUtility->resetRoundingDeltas();
246+
$address->setBaseSubtotalWithDiscount($address->getBaseSubtotal());
247+
$address->setSubtotalWithDiscount($address->getSubtotal());
246248
if ($this->_isFirstTimeResetRun) {
247249
$address->setAppliedRuleIds('');
248250
$address->getQuote()->setAppliedRuleIds('');

dev/tests/integration/testsuite/Magento/SalesRule/Model/Rule/Action/Discount/CartFixedTest.php

Lines changed: 103 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,24 @@
1010
use Magento\Catalog\Api\Data\ProductInterface;
1111
use Magento\Catalog\Model\Product;
1212
use Magento\Catalog\Model\ProductRepository;
13+
use Magento\Framework\Api\SearchCriteriaBuilder;
14+
use Magento\Quote\Api\CartRepositoryInterface;
1315
use Magento\Quote\Api\Data\CartItemInterface;
1416
use Magento\Quote\Api\GuestCartItemRepositoryInterface;
1517
use Magento\Quote\Api\GuestCartManagementInterface;
1618
use Magento\Quote\Api\GuestCartTotalRepositoryInterface;
1719
use Magento\Quote\Api\GuestCouponManagementInterface;
20+
use Magento\Quote\Model\Quote;
21+
use Magento\Quote\Model\QuoteIdMask;
22+
use Magento\Sales\Api\Data\OrderInterface;
23+
use Magento\Sales\Api\OrderRepositoryInterface;
1824
use Magento\TestFramework\Helper\Bootstrap;
1925

2026
/**
2127
* Tests for Magento\SalesRule\Model\Rule\Action\Discount\CartFixed.
28+
*
29+
* @magentoAppArea frontend
30+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
2231
*/
2332
class CartFixedTest extends \PHPUnit\Framework\TestCase
2433
{
@@ -37,14 +46,33 @@ class CartFixedTest extends \PHPUnit\Framework\TestCase
3746
*/
3847
private $couponManagement;
3948

49+
/**
50+
* @var \Magento\Framework\ObjectManagerInterface
51+
*/
52+
private $objectManager;
53+
54+
/**
55+
* @var SearchCriteriaBuilder
56+
*/
57+
private $criteriaBuilder;
58+
59+
/**
60+
* @var CartRepositoryInterface
61+
*/
62+
private $quoteRepository;
63+
4064
/**
4165
* @inheritdoc
4266
*/
4367
protected function setUp()
4468
{
45-
$this->cartManagement = Bootstrap::getObjectManager()->create(GuestCartManagementInterface::class);
46-
$this->couponManagement = Bootstrap::getObjectManager()->create(GuestCouponManagementInterface::class);
47-
$this->cartItemRepository = Bootstrap::getObjectManager()->create(GuestCartItemRepositoryInterface::class);
69+
$objectManager = Bootstrap::getObjectManager();
70+
$this->cartManagement = $objectManager->create(GuestCartManagementInterface::class);
71+
$this->couponManagement = $objectManager->create(GuestCouponManagementInterface::class);
72+
$this->cartItemRepository = $objectManager->create(GuestCartItemRepositoryInterface::class);
73+
$this->criteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
74+
$this->quoteRepository = $objectManager->get(CartRepositoryInterface::class);
75+
$this->objectManager = $objectManager;
4876
}
4977

5078
/**
@@ -53,6 +81,7 @@ protected function setUp()
5381
* @param array $productPrices
5482
* @return void
5583
* @magentoDbIsolation enabled
84+
* @magentoAppIsolation enabled
5685
* @magentoDataFixture Magento/SalesRule/_files/coupon_cart_fixed_discount.php
5786
* @dataProvider applyFixedDiscountDataProvider
5887
*/
@@ -82,6 +111,56 @@ public function testApplyFixedDiscount(array $productPrices): void
82111
$this->assertEquals($expectedDiscount, $total->getBaseDiscountAmount());
83112
}
84113

114+
/**
115+
* Applies fixed discount amount on whole cart and created order with it
116+
*
117+
* @magentoDbIsolation enabled
118+
* @magentoAppIsolation enabled
119+
* @magentoConfigFixture default_store carriers/freeshipping/active 1
120+
* @magentoDataFixture Magento/Sales/_files/quote.php
121+
* @magentoDataFixture Magento/SalesRule/_files/coupon_cart_fixed_subtotal_with_discount.php
122+
*/
123+
public function testOrderWithFixedDiscount(): void
124+
{
125+
$expectedGrandTotal = 5;
126+
127+
$quote = $this->getQuote();
128+
$quote->getShippingAddress()
129+
->setShippingMethod('freeshipping_freeshipping')
130+
->setCollectShippingRates(true);
131+
$quote->setCouponCode('CART_FIXED_DISCOUNT_15');
132+
$quote->collectTotals();
133+
$this->quoteRepository->save($quote);
134+
135+
$this->assertEquals($expectedGrandTotal, $quote->getGrandTotal());
136+
137+
/** @var \Magento\Quote\Model\QuoteIdMask $quoteIdMask */
138+
$quoteIdMask = $this->objectManager->create(QuoteIdMask::class);
139+
$quoteIdMask->load($quote->getId(), 'quote_id');
140+
Bootstrap::getInstance()->reinitialize();
141+
$cartManagement = Bootstrap::getObjectManager()->create(GuestCartManagementInterface::class);
142+
$cartManagement->placeOrder($quoteIdMask->getMaskedId());
143+
$order = $this->getOrder('test01');
144+
$this->assertEquals($expectedGrandTotal, $order->getGrandTotal());
145+
}
146+
147+
/**
148+
* Load cart from fixture.
149+
*
150+
* @return Quote
151+
*/
152+
private function getQuote(): Quote
153+
{
154+
$searchCriteria = $this->criteriaBuilder->addFilter('reserved_order_id', 'test01')->create();
155+
$carts = $this->quoteRepository->getList($searchCriteria)
156+
->getItems();
157+
if (!$carts) {
158+
throw new \RuntimeException('Cart from fixture not found');
159+
}
160+
161+
return array_shift($carts);
162+
}
163+
85164
/**
86165
* @return array
87166
*/
@@ -150,4 +229,25 @@ private function createProduct(float $price): ProductInterface
150229

151230
return $productRepository->save($product);
152231
}
232+
233+
/**
234+
* Gets order entity by increment id.
235+
*
236+
* @param string $incrementId
237+
* @return OrderInterface
238+
*/
239+
private function getOrder(string $incrementId): OrderInterface
240+
{
241+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
242+
$searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
243+
$searchCriteria = $searchCriteriaBuilder->addFilter('increment_id', $incrementId)
244+
->create();
245+
246+
/** @var OrderRepositoryInterface $repository */
247+
$repository = $this->objectManager->get(OrderRepositoryInterface::class);
248+
$items = $repository->getList($searchCriteria)
249+
->getItems();
250+
251+
return array_pop($items);
252+
}
153253
}

dev/tests/integration/testsuite/Magento/SalesRule/_files/coupon_cart_fixed_discount_rollback.php

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,32 @@
55
*/
66
declare(strict_types=1);
77

8+
use Magento\Framework\Api\SearchCriteriaBuilder;
9+
use Magento\Framework\Registry;
10+
use Magento\SalesRule\Api\RuleRepositoryInterface;
11+
use Magento\SalesRule\Model\Rule;
812
use Magento\TestFramework\Helper\Bootstrap;
913

10-
/** @var Magento\Framework\Registry $registry */
11-
$registry = Bootstrap::getObjectManager()->get(\Magento\Framework\Registry::class);
14+
$objectManager = Bootstrap::getObjectManager();
1215

13-
/** @var Magento\SalesRule\Model\Rule $rule */
14-
$rule = $registry->registry('cart_rule_fixed_discount_coupon');
15-
if ($rule) {
16-
$rule->delete();
16+
/** @var Registry $registry */
17+
$registry = $objectManager->get(Registry::class);
18+
$registry->unregister('isSecureArea');
19+
$registry->register('isSecureArea', true);
20+
21+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
22+
$searchCriteriaBuilder = $objectManager->get(SearchCriteriaBuilder::class);
23+
$searchCriteria = $searchCriteriaBuilder->addFilter('name', '15$ fixed discount on whole cart')
24+
->create();
25+
/** @var RuleRepositoryInterface $ruleRepository */
26+
$ruleRepository = $objectManager->get(RuleRepositoryInterface::class);
27+
$items = $ruleRepository->getList($searchCriteria)
28+
->getItems();
29+
/** @var Rule $salesRule */
30+
$salesRule = array_pop($items);
31+
if ($salesRule !== null) {
32+
$ruleRepository->deleteById($salesRule->getRuleId());
1733
}
34+
35+
$registry->unregister('isSecureArea');
36+
$registry->register('isSecureArea', false);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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+
include __DIR__ . '/coupon_cart_fixed_discount.php';
9+
10+
use Magento\SalesRule\Model\ResourceModel\Rule as ResourceModel;
11+
use Magento\SalesRule\Model\Rule\Condition\Address;
12+
use Magento\SalesRule\Model\Rule\Condition\Combine;
13+
14+
$salesRule->getConditions()->loadArray(
15+
[
16+
'type' => Combine::class,
17+
'attribute' => null,
18+
'operator' => null,
19+
'value' => '1',
20+
'is_value_processed' => null,
21+
'aggregator' => 'any',
22+
'conditions' =>
23+
[
24+
[
25+
'type' => Address::class,
26+
'attribute' => 'base_subtotal_with_discount',
27+
'operator' => '>=',
28+
'value' => 9,
29+
'is_value_processed' => false
30+
],
31+
],
32+
]
33+
);
34+
$salesRule->setDiscountAmount(5);
35+
$objectManager->get(ResourceModel::class)->save($salesRule);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
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+
include __DIR__ . '/coupon_cart_fixed_discount_rollback.php';

0 commit comments

Comments
 (0)