magento2-docker/dev/tests/integration/testsuite/Magento/SalesRule/Model/Quote/DiscountTest.php

168 lines
5.3 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\SalesRule\Model\Quote;
use Magento\Framework\Api\SearchCriteriaBuilder;
use Magento\Framework\ObjectManagerInterface;
use Magento\Quote\Api\CartRepositoryInterface;
use Magento\Quote\Model\Quote;
use Magento\Quote\Model\Quote\Item;
use Magento\SalesRule\Test\Fixture\ProductCondition as ProductConditionFixture;
use Magento\SalesRule\Test\Fixture\Rule as RuleFixture;
use Magento\TestFramework\Fixture\AppIsolation;
use Magento\TestFramework\Fixture\DataFixture;
use Magento\TestFramework\Helper\Bootstrap;
use PHPUnit\Framework\TestCase;
/**
* Test discount totals calculation model
*/
class DiscountTest extends TestCase
{
/**
* @var ObjectManagerInterface
*/
private $objectManager;
/**
* @var SearchCriteriaBuilder
*/
private $criteriaBuilder;
/**
* @var CartRepositoryInterface
*/
private $quoteRepository;
/**
* @inheritDoc
*/
protected function setUp(): void
{
parent::setUp();
$this->objectManager = Bootstrap::getObjectManager();
$this->criteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
$this->quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
}
/**
* @magentoDataFixture Magento/Checkout/_files/quote_with_bundle_product_with_dynamic_price.php
* @dataProvider bundleProductWithDynamicPriceAndCartPriceRuleDataProvider
* @param string $coupon
* @param array $discounts
* @param float $totalDiscount
* @return void
*/
#[
AppIsolation(true),
DataFixture(
ProductConditionFixture::class,
['attribute' => 'sku', 'value' => 'bundle_product_with_dynamic_price'],
'cond1'
),
DataFixture(
ProductConditionFixture::class,
['attribute' => 'sku', 'value' => 'simple1'],
'cond2'
),
DataFixture(
ProductConditionFixture::class,
['attribute' => 'sku', 'value' => 'simple2'],
'cond3'
),
DataFixture(
RuleFixture::class,
['coupon_code' => 'bundle_cc', 'discount_amount' => 50, 'actions' => ['$cond1$']],
'rule1'
),
DataFixture(
RuleFixture::class,
['coupon_code' => 'simple1_cc', 'discount_amount' => 50, 'actions' => ['$cond2$']],
'rule2'
),
DataFixture(
RuleFixture::class,
['coupon_code' => 'simple2_cc', 'discount_amount' => 50, 'actions' => ['$cond3$']],
'rule3'
),
]
public function testBundleProductWithDynamicPriceAndCartPriceRule(
string $coupon,
array $discounts,
float $totalDiscount
): void {
$quote = $this->getQuote('quote_with_bundle_product_with_dynamic_price');
$quote->setCouponCode($coupon);
$quote->collectTotals();
$this->quoteRepository->save($quote);
$this->assertEquals(21.98, $quote->getBaseSubtotal());
$this->assertEquals($totalDiscount, $quote->getShippingAddress()->getDiscountAmount());
$items = $quote->getAllItems();
$this->assertCount(3, $items);
/** @var Item $item*/
$item = array_shift($items);
$this->assertEquals('bundle_product_with_dynamic_price-simple1-simple2', $item->getSku());
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
$item = array_shift($items);
$this->assertEquals('simple1', $item->getSku());
$this->assertEquals(5.99, $item->getPrice());
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
$item = array_shift($items);
$this->assertEquals('simple2', $item->getSku());
$this->assertEquals(15.99, $item->getPrice());
$this->assertEquals($discounts[$item->getSku()], $item->getDiscountAmount());
}
/**
* @return array
*/
public function bundleProductWithDynamicPriceAndCartPriceRuleDataProvider(): array
{
return [
[
'bundle_cc',
[
'bundle_product_with_dynamic_price-simple1-simple2' => 0,
'simple1' => 3,
'simple2' => 7.99,
],
-10.99
],
[
'simple1_cc',
[
'bundle_product_with_dynamic_price-simple1-simple2' => 0,
'simple1' => 3,
'simple2' => 0,
],
-3
],
[
'simple2_cc',
[
'bundle_product_with_dynamic_price-simple1-simple2' => 0,
'simple1' => 0,
'simple2' => 8,
],
-8
]
];
}
/**
* @param string $reservedOrderId
* @return Quote
*/
private function getQuote(string $reservedOrderId): Quote
{
$searchCriteria = $this->criteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
->create();
$carts = $this->quoteRepository->getList($searchCriteria)
->getItems();
return array_shift($carts);
}
}