Skip to content

Commit 8b8f4dd

Browse files
committed
ACP2E-10: Incorrect Discount: Two Cart rules with and without coupon
1 parent c656811 commit 8b8f4dd

File tree

6 files changed

+167
-1
lines changed

6 files changed

+167
-1
lines changed
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
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\Checkout\Model\Type\Onepage;
9+
use Magento\Quote\Api\CartRepositoryInterface;
10+
use Magento\Quote\Api\Data\CartInterface;
11+
use Magento\Quote\Api\Data\CartInterfaceFactory;
12+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
13+
use Magento\TestFramework\Helper\Bootstrap;
14+
use Magento\Catalog\Api\ProductRepositoryInterface;
15+
16+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/multiple_products.php');
17+
18+
$objectManager = Bootstrap::getObjectManager();
19+
/** @var ProductRepositoryInterface $productRepository */
20+
$productRepository = Bootstrap::getObjectManager()
21+
->create(ProductRepositoryInterface::class);
22+
/** @var CartRepositoryInterface $quoteRepository */
23+
$quoteRepository = $objectManager->get(CartRepositoryInterface::class);
24+
/** @var CartInterface $quote */
25+
$quote = $objectManager->get(CartInterfaceFactory::class)->create();
26+
$quote->setIsActive(true)
27+
->setStoreId(1)
28+
->setCheckoutMethod(Onepage::METHOD_GUEST)
29+
->setReservedOrderId('test_quote_with_simple_products');
30+
$quote->addProduct($productRepository->get('simple1'), 1);
31+
$quote->addProduct($productRepository->get('simple2'), 1);
32+
$quoteRepository->save($quote);
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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\TestFramework\Helper\Bootstrap;
9+
use Magento\TestFramework\Workaround\Override\Fixture\Resolver;
10+
use Magento\Quote\Model\ResourceModel\Quote\Collection;
11+
use Magento\Quote\Model\Quote;
12+
use Magento\Framework\Registry;
13+
14+
/** @var Registry $registry */
15+
$registry = Bootstrap::getObjectManager()->get(Registry::class);
16+
$registry->unregister('isSecureArea');
17+
$registry->register('isSecureArea', true);
18+
19+
/** @var $order Quote */
20+
$quoteCollection = Bootstrap::getObjectManager()->create(Collection::class);
21+
foreach ($quoteCollection as $quote) {
22+
$quote->delete();
23+
}
24+
25+
Resolver::getInstance()->requireDataFixture('Magento/Catalog/_files/multiple_products_rollback.php');
26+
27+
$registry->unregister('isSecureArea');
28+
$registry->register('isSecureArea', false);

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,6 +493,38 @@ public function multishippingDataProvider(): array
493493
];
494494
}
495495

496+
/**
497+
* @magentoAppIsolation enabled
498+
* @magentoDataFixture Magento/SalesRule/_files/cart_rule_50_percent_off_no_condition.php
499+
* @magentoDataFixture Magento/SalesRule/_files/cart_fixed_10_discount.php
500+
* @magentoDataFixture Magento/Checkout/_files/quote_with_simple_products.php
501+
* @return void
502+
*/
503+
public function testDiscountsWhenByPercentRuleAppliedFirstAndCartFixedRuleSecond(): void
504+
{
505+
$totalDiscount = -20.99;
506+
$discounts = [
507+
'simple1' => 5.72,
508+
'simple2' => 15.27,
509+
];
510+
$quote = $this->getQuote('test_quote_with_simple_products');
511+
$quote->setCouponCode('2?ds5!2d');
512+
$quote->collectTotals();
513+
$this->quoteRepository->save($quote);
514+
$this->assertEquals(21.98, $quote->getBaseSubtotal());
515+
$this->assertEquals($totalDiscount, $quote->getShippingAddress()->getDiscountAmount());
516+
$items = $quote->getAllItems();
517+
$this->assertCount(2, $items);
518+
$item = array_shift($items);
519+
$this->assertEquals('simple1', $item->getSku());
520+
$this->assertEquals(5.99, $item->getPrice());
521+
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
522+
$item = array_shift($items);
523+
$this->assertEquals('simple2', $item->getSku());
524+
$this->assertEquals(15.99, $item->getPrice());
525+
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
526+
}
527+
496528
/**
497529
* Get list of orders by quote id.
498530
*
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
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\Customer\Model\GroupManagement;
9+
use Magento\SalesRule\Model\ResourceModel\Rule as RuleResourceModel;
10+
use Magento\SalesRule\Model\Rule;
11+
use Magento\Store\Model\StoreManagerInterface;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
14+
$objectManager = Bootstrap::getObjectManager();
15+
16+
/** @var Rule $salesRule */
17+
$salesRule = $objectManager->create(Rule::class);
18+
$salesRule->setData(
19+
[
20+
'name' => '10$ fixed discount on whole cart',
21+
'is_active' => 1,
22+
'customer_group_ids' => [GroupManagement::NOT_LOGGED_IN_ID],
23+
'coupon_type' => Rule::COUPON_TYPE_NO_COUPON,
24+
'conditions' => [],
25+
'simple_action' => Rule::CART_FIXED_ACTION,
26+
'discount_amount' => 10,
27+
'discount_step' => 10,
28+
'stop_rules_processing' => 0,
29+
'website_ids' => [
30+
$objectManager->get(StoreManagerInterface::class)->getWebsite()->getId(),
31+
],
32+
'store_labels' => [
33+
'store_id' => 0,
34+
'store_label' => '10$ fixed discount on whole cart',
35+
]
36+
]
37+
);
38+
$objectManager->get(RuleResourceModel::class)->save($salesRule);
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
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\Framework\Api\SearchCriteriaBuilder;
9+
use Magento\Framework\Registry;
10+
use Magento\SalesRule\Api\RuleRepositoryInterface;
11+
use Magento\SalesRule\Model\Rule;
12+
use Magento\TestFramework\Helper\Bootstrap;
13+
14+
$objectManager = Bootstrap::getObjectManager();
15+
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', '10$ 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());
33+
}
34+
35+
$registry->unregister('isSecureArea');
36+
$registry->register('isSecureArea', false);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
'simple_action' => 'by_percent',
2525
'discount_amount' => 50,
2626
'discount_step' => 0,
27-
'stop_rules_processing' => 1,
27+
'stop_rules_processing' => 0,
2828
'website_ids' => [
2929
\Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
3030
\Magento\Store\Model\StoreManagerInterface::class

0 commit comments

Comments
 (0)