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/Catalog/Model/Indexer/

Upload File :
current_dir [ Writeable ] document_root [ Writeable ]

 

Current File : /home/corals/old/dev/tests/integration/testsuite/Magento/Catalog/Model/Indexer/FlatTest.php
<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Catalog\Model\Indexer;

use Magento\TestFramework\Helper\Bootstrap;

/**
 * @magentoAppIsolation enabled
 * @magentoDbIsolation enabled
 */
class FlatTest extends \Magento\TestFramework\Indexer\TestCase
{
    /**
     * @var int
     */
    private static $defaultCategoryId = 2;

    /**
     * @var int
     */
    protected static $categoryOne;

    /**
     * @var int
     */
    protected static $categoryTwo;

    /**
     * List of attribute codes
     *
     * @var string[]
     */
    protected static $attributeCodes = [];

    /**
     * List of attribute values
     * Data loaded from EAV
     *
     * @var string[]
     */
    protected static $attributeValues = [];

    /**
     * List of attributes to exclude
     *
     * @var string[]
     */
    protected static $attributesToExclude = ['url_path', 'display_mode'];

    /**
     * @var int
     * @deprecated
     */
    protected static $totalBefore = 0;

    public static function setUpBeforeClass(): void
    {
        self::loadAttributeCodes();

        $db = Bootstrap::getInstance()->getBootstrap()
            ->getApplication()
            ->getDbInstance();
        if (!$db->isDbDumpExists()) {
            throw new \LogicException('DB dump does not exist.');
        }
        $db->restoreFromDbDump();

        parent::setUpBeforeClass();
    }

    public function testEntityItemsBefore()
    {
        $category = $this->instantiateCategoryModel();
        $result = $category->getCollection()->getAllIds();
        $this->assertNotEmpty($result);
        $this->assertIsArray($result);
    }

    /**
     * Reindex All
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     * @magentoAppArea frontend
     *
     * @magentoDbIsolation disabled
     */
    public function testReindexAll()
    {
        /** @var  $indexer \Magento\Framework\Indexer\IndexerInterface */
        $indexer = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
            \Magento\Indexer\Model\Indexer::class
        );
        $indexer->load('catalog_category_flat');
        $indexer->reindexAll();
        $this->assertTrue($indexer->isValid());

        $category = $this->getLoadedDefaultCategory();
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $category->getResource());
        $this->checkCategoryData($category);
    }

    /**
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     * @magentoAppArea frontend
     */
    public function testFlatItemsBefore()
    {
        $category = $this->getLoadedDefaultCategory();
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $category->getResource());

        $result = $category->getAllChildren(true);
        $this->assertNotEmpty($result);
        $this->assertCount(1, $result);
    }

    /**
     * Populate EAV category data`
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     *
     * @magentoDbIsolation disabled
     */
    public function testCreateCategory()
    {
        $this->createSubCategoriesInDefaultCategory();

        $result = $this->getLoadedDefaultCategory()->getCollection()->getItems();
        $this->assertIsArray($result);

        $this->assertEquals(self::$defaultCategoryId, $result[self::$categoryOne]->getParentId());
        $this->assertEquals(self::$categoryOne, $result[self::$categoryTwo]->getParentId());

        $this->removeSubCategoriesInDefaultCategory();
    }

    /**
     * Test for reindex row action
     * Check that category data created at testCreateCategory() were syncing to flat structure
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     * @magentoAppArea frontend
     *
     * @magentoDbIsolation disabled
     */
    public function testFlatAfterCreate()
    {
        $this->createSubCategoriesInDefaultCategory();

        $category = $this->getLoadedDefaultCategory();
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $category->getResource());

        $result = $category->getAllChildren(true);
        $this->assertNotEmpty($result);
        $this->assertCount(3, $result);
        $this->assertContains(self::$categoryOne, $result);

        $categoryOne = $this->getLoadedCategory(self::$categoryOne);
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $categoryOne->getResource());

        $result = $categoryOne->getAllChildren(true);
        $this->assertNotEmpty($result);
        $this->assertCount(2, $result);
        $this->assertContains(self::$categoryTwo, $result);
        $this->checkCategoryData($categoryOne);

        $categoryTwo = $this->getLoadedCategory(self::$categoryTwo);
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $categoryTwo->getResource());

        $this->assertEquals(self::$categoryOne, $categoryTwo->getParentId());
        $this->checkCategoryData($categoryTwo);

        $this->removeSubCategoriesInDefaultCategory();
    }

    /**
     * Move category and populate EAV category data
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     *
     * @magentoDbIsolation disabled
     */
    public function testMoveCategory()
    {
        $this->moveSubCategoriesInDefaultCategory();
        $categoryTwo = $this->getLoadedCategory(self::$categoryTwo);
        $this->assertEquals($categoryTwo->getData('parent_id'), self::$defaultCategoryId);

        $this->removeSubCategoriesInDefaultCategory();
    }

    /**
     * Test for reindex list action
     * Check that category data created at testMoveCategory() were syncing to flat structure
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     * @magentoAppArea frontend
     *
     * @magentoDbIsolation disabled
     */
    public function testFlatAfterMove()
    {
        $this->moveSubCategoriesInDefaultCategory();

        $category = $this->getLoadedDefaultCategory();
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $category->getResource());
        $this->checkCategoryData($category);

        $result = $category->getAllChildren(true);
        $this->assertNotEmpty($result);
        $this->assertCount(3, $result);

        $categoryOne = $this->getLoadedCategory(self::$categoryOne);
        $this->checkCategoryData($categoryOne);

        $categoryTwo = $this->getLoadedCategory(self::$categoryTwo);
        $this->checkCategoryData($categoryTwo);

        $this->removeSubCategoriesInDefaultCategory();
    }

    /**
     * Delete created categories at testCreateCategory()
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     * @magentoAppArea adminhtml
     */
    public function testDeleteCategory()
    {
        $countBeforeModification = count($this->instantiateCategoryModel()->getCollection()->getAllIds());

        $this->deleteSubCategoriesInDefaultCategory();

        $category = $this->instantiateCategoryModel();
        $result = $category->getCollection()->getAllIds();
        $this->assertNotEmpty($result);
        $this->assertIsArray($result);
        $this->assertCount($countBeforeModification, $result);
    }

    /**
     * Test for reindex row action
     * Check that category data deleted at testDeleteCategory() were syncing to flat structure
     *
     * @magentoConfigFixture current_store catalog/frontend/flat_catalog_category true
     * @magentoAppArea frontend
     * @magentoDbIsolation disabled
     */
    public function testFlatAfterDeleted()
    {
        $this->deleteSubCategoriesInDefaultCategory();

        $category = $this->getLoadedDefaultCategory();
        $this->assertInstanceOf(\Magento\Catalog\Model\ResourceModel\Category\Flat::class, $category->getResource());

        $result = $category->getAllChildren(true);
        $this->assertNotEmpty($result);
        $this->assertCount(1, $result);
    }

    /**
     * Populate attribute values from category
     * Data loaded from EAV
     *
     * @param \Magento\Catalog\Model\Category $category
     */
    protected static function loadAttributeValues(\Magento\Catalog\Model\Category $category)
    {
        foreach (self::$attributeCodes as $attributeCode) {
            self::$attributeValues[$category->getId()][$attributeCode] = $category->getData($attributeCode);
        }
    }

    /**
     * Populate attribute codes for category entity
     * Data loaded from EAV
     *
     */
    protected static function loadAttributeCodes()
    {
        /** @var \Magento\Catalog\Model\Config $catalogConfig */
        $catalogConfig = \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
            \Magento\Catalog\Model\Config::class
        );
        $attributeCodes = $catalogConfig->getEntityAttributeCodes(\Magento\Catalog\Model\Category::ENTITY);

        foreach ($attributeCodes as $attributeCode) {
            if (in_array($attributeCode, self::$attributesToExclude)) {
                continue;
            }
            self::$attributeCodes[] = $attributeCode;
        }
    }

    /**
     * Check EAV and flat data
     *
     * @param \Magento\Catalog\Model\Category $category
     */
    protected function checkCategoryData(\Magento\Catalog\Model\Category $category)
    {
        foreach (self::$attributeCodes as $attributeCode) {
            $this->assertEquals(
                self::$attributeValues[$category->getId()][$attributeCode],
                $category->getData($attributeCode),
                "Data for {$category->getId()} attribute code [{$attributeCode}] is wrong"
            );
        }
    }

    /**
     * @return \Magento\Catalog\Model\Category
     */
    private function getLoadedDefaultCategory()
    {
        $category = $this->getLoadedCategory(self::$defaultCategoryId);

        return $category;
    }

    /**
     * @param int $categoryId
     * @return \Magento\Catalog\Model\Category
     */
    private function getLoadedCategory($categoryId)
    {
        $category = $this->instantiateCategoryModel();
        $category->load($categoryId);
        self::loadAttributeValues($category);
        return $category;
    }

    /**
     * @return \Magento\Catalog\Model\Category
     */
    private function instantiateCategoryModel()
    {
        return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->create(
            \Magento\Catalog\Model\Category::class
        );
    }

    /**
     * Invoke business logic:
     * - create child category in the Default category
     * - create child category in category created in previous step
     */
    private function createSubCategoriesInDefaultCategory()
    {
        $this->executeWithFlatEnabledInAdminArea(
            function () {
                $category = $this->getLoadedDefaultCategory();

                $categoryOne = $this->instantiateCategoryModel();
                $categoryOne->setName('Category One')->setPath($category->getPath())->setIsActive(true);
                $category->getResource()->save($categoryOne);
                self::$categoryOne = $categoryOne->getId();

                $categoryTwo = $this->instantiateCategoryModel();
                $categoryTwo->setName('Category Two')->setPath($categoryOne->getPath())->setIsActive(true);
                $category->getResource()->save($categoryTwo);
                self::$categoryTwo = $categoryTwo->getId();
            }
        );
    }

    /**
     * Invoke business logic:
     * - create child category in the Default category
     * - create child category in category created in previous step
     * - move category created on previous step to default category
     */
    private function moveSubCategoriesInDefaultCategory()
    {
        $this->executeWithFlatEnabledInAdminArea(
            function () {
                $this->createSubCategoriesInDefaultCategory();
                $categoryTwo = $this->getLoadedCategory(self::$categoryTwo);
                $categoryTwo->move(self::$defaultCategoryId, self::$categoryOne);
            }
        );
    }

    /**
     * Invoke business logic:
     * - create child category in the Default category
     * - create child category in category created in previous step
     * - delete created categories
     */
    private function deleteSubCategoriesInDefaultCategory()
    {
        $this->executeWithFlatEnabledInAdminArea(
            function () {
                $this->createSubCategoriesInDefaultCategory();
                $this->removeSubCategoriesInDefaultCategory();
            }
        );
    }

    /**
     * Invoke business logic:
     * - delete created categories
     */
    private function removeSubCategoriesInDefaultCategory()
    {
        $this->executeWithFlatEnabledInAdminArea(
            function () {
                $category = $this->instantiateCategoryModel();
                $category->load(self::$categoryTwo);
                $category->delete();
                $category->load(self::$categoryOne);
                $category->delete();
            }
        );
    }

    /**
     * Execute callable in an adminhtml area with enabled flat catalog.
     * After execution area and config option for flat catalog would be restored.
     *
     * @param callable $task
     */
    private function executeWithFlatEnabledInAdminArea(callable $task)
    {
        $app = \Magento\TestFramework\Helper\Bootstrap::getInstance()->getBootstrap()->getApplication();

        $invocationConfigValue = $this->getActiveConfigInstance()->getValue(
            'catalog/frontend/flat_catalog_category',
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
        );
        $invocationArea = $app->getArea();

        $this->switchAppArea($app, 'adminhtml');
        $this->getActiveConfigInstance()->setValue(
            'catalog/frontend/flat_catalog_category',
            true,
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
        );
        call_user_func($task);
        $this->switchAppArea($app, $invocationArea);
        $this->getActiveConfigInstance()->setValue(
            'catalog/frontend/flat_catalog_category',
            $invocationConfigValue,
            \Magento\Store\Model\ScopeInterface::SCOPE_STORE
        );
    }

    /**
     * Change application area if necessary
     *
     * @param \Magento\TestFramework\Application $app
     * @param string $expectedArea
     */
    private function switchAppArea(\Magento\TestFramework\Application $app, $expectedArea)
    {
        if ($app->getArea() === $expectedArea) {
            return;
        }

        $app->reinitialize();
        if ($app->getArea() === $expectedArea) {
            return;
        }
        $app->loadArea($expectedArea);
    }

    /**
     * Retrieve config object instance that is currently in use by application
     *
     * @return \Magento\Framework\App\Config\MutableScopeConfigInterface
     */
    private function getActiveConfigInstance()
    {
        return \Magento\TestFramework\Helper\Bootstrap::getObjectManager()->get(
            \Magento\Framework\App\Config\MutableScopeConfigInterface::class
        );
    }
}

Spamworldpro Mini