168 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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);
 | 
						|
    }
 | 
						|
}
 |