180 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			180 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Customer\Model\Plugin;
 | 
						|
 | 
						|
use Magento\Customer\Api\Data\GroupInterfaceFactory;
 | 
						|
use Magento\Customer\Api\GroupRepositoryInterface;
 | 
						|
use Magento\Customer\Model\ResourceModel\GroupExcludedWebsite;
 | 
						|
use Magento\Framework\Api\SearchCriteriaBuilder;
 | 
						|
use Magento\Framework\Exception\LocalizedException;
 | 
						|
use Magento\Framework\App\ResourceConnection;
 | 
						|
use Magento\Framework\ObjectManagerInterface;
 | 
						|
use Magento\Store\Api\WebsiteRepositoryInterface;
 | 
						|
use Magento\Store\Model\ResourceModel\Website as WebsiteResourceModel;
 | 
						|
use Magento\Store\Model\Website;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\Framework\Registry;
 | 
						|
 | 
						|
/**
 | 
						|
 * Checks that removal of website also deletes it from the customer group excluded website table.
 | 
						|
 * @magentoAppArea adminhtml
 | 
						|
 */
 | 
						|
class DeleteCustomerGroupExcludedWebsiteTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    private const GROUP_CODE = 'Humans';
 | 
						|
    private const STORE_WEBSITE_CODE = 'custom_website';
 | 
						|
 | 
						|
    /** @var ObjectManagerInterface */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /** @var GroupRepositoryInterface */
 | 
						|
    private $groupRepository;
 | 
						|
 | 
						|
    /** @var GroupInterfaceFactory */
 | 
						|
    private $groupFactory;
 | 
						|
 | 
						|
    /** @var WebsiteResourceModel */
 | 
						|
    private $websiteResourceModel;
 | 
						|
 | 
						|
    /** @var ResourceConnection */
 | 
						|
    private $resourceConnection;
 | 
						|
 | 
						|
    /** @var \Magento\Customer\Api\Data\GroupExtensionInterfaceFactory */
 | 
						|
    private $groupExtensionInterfaceFactory;
 | 
						|
 | 
						|
    /** @var WebsiteRepositoryInterface */
 | 
						|
    private $websiteRepository;
 | 
						|
 | 
						|
    /** @var Registry */
 | 
						|
    private $registry;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->groupRepository = $this->objectManager->create(GroupRepositoryInterface::class);
 | 
						|
        $this->groupFactory = $this->objectManager->create(GroupInterfaceFactory::class);
 | 
						|
        $this->websiteResourceModel = $this->objectManager->get(WebsiteResourceModel::class);
 | 
						|
        $this->resourceConnection = $this->objectManager->get(ResourceConnection::class);
 | 
						|
        $this->groupExtensionInterfaceFactory = $this->objectManager
 | 
						|
            ->get(\Magento\Customer\Api\Data\GroupExtensionInterfaceFactory::class);
 | 
						|
        $this->websiteRepository = $this->objectManager->create(WebsiteRepositoryInterface::class);
 | 
						|
        $this->registry = $this->objectManager->create(Registry::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        /** Marks area as secure so Product repository would allow group removal */
 | 
						|
        $isSecuredAreaSystemState = $this->registry->registry('isSecuredArea');
 | 
						|
        $this->registry->unregister('isSecureArea');
 | 
						|
        $this->registry->register('isSecureArea', true);
 | 
						|
 | 
						|
        /** Remove customer group */
 | 
						|
        $groupId = $this->findGroupIdWithCode(self::GROUP_CODE);
 | 
						|
        $group = $this->groupRepository->getById($groupId);
 | 
						|
        $this->groupRepository->delete($group);
 | 
						|
 | 
						|
        /** Revert mark area secured */
 | 
						|
        $this->registry->unregister('isSecuredArea');
 | 
						|
        $this->registry->register('isSecuredArea', $isSecuredAreaSystemState);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test that deletion of website also deletes this website from customer group excluded websites.
 | 
						|
     * @magentoDbIsolation disabled
 | 
						|
     */
 | 
						|
    public function testDeleteExcludedWebsiteAfterWebsiteDelete(): void
 | 
						|
    {
 | 
						|
        /** Create website */
 | 
						|
        /** @var Website $website */
 | 
						|
        $website = $this->objectManager->create(Website::class);
 | 
						|
        $website->setName('custom website for delete excluded website test')
 | 
						|
            ->setCode(self::STORE_WEBSITE_CODE);
 | 
						|
        $website->isObjectNew(true);
 | 
						|
        $this->websiteResourceModel->save($website);
 | 
						|
        $websiteId = $this->websiteRepository->get(self::STORE_WEBSITE_CODE)->getId();
 | 
						|
 | 
						|
        /** Create a new customer group */
 | 
						|
        $group = $this->groupFactory->create()
 | 
						|
            ->setId(null)
 | 
						|
            ->setCode(self::GROUP_CODE)
 | 
						|
            ->setTaxClassId(3);
 | 
						|
        $groupId = $this->groupRepository->save($group)->getId();
 | 
						|
        self::assertNotNull($groupId);
 | 
						|
 | 
						|
        /** Exclude website from customer group */
 | 
						|
        $group = $this->groupRepository->getById($groupId);
 | 
						|
        $customerGroupExtensionAttributes = $this->groupExtensionInterfaceFactory->create();
 | 
						|
        $customerGroupExtensionAttributes->setExcludeWebsiteIds([$websiteId]);
 | 
						|
        $group->setExtensionAttributes($customerGroupExtensionAttributes);
 | 
						|
        $this->groupRepository->save($group);
 | 
						|
 | 
						|
        /** Check that excluded website is in customer group excluded website table */
 | 
						|
        $connection = $this->resourceConnection->getConnection();
 | 
						|
        $selectExcludedWebsite = $connection->select();
 | 
						|
        /** @var GroupExcludedWebsite $groupExcludedWebsiteResource */
 | 
						|
        $groupExcludedWebsiteResource = $this->objectManager->create(GroupExcludedWebsite::class);
 | 
						|
        $selectExcludedWebsite->from($groupExcludedWebsiteResource->getMainTable())
 | 
						|
            ->where('website_id = ?', $websiteId);
 | 
						|
        $excludedWebsites = $connection->fetchAll($selectExcludedWebsite);
 | 
						|
        self::assertCount(1, $excludedWebsites);
 | 
						|
 | 
						|
        /** Marks area as secure so Product repository would allow website removal */
 | 
						|
        $registry = $this->objectManager->get(Registry::class);
 | 
						|
        $isSecuredAreaSystemState = $registry->registry('isSecuredArea');
 | 
						|
        $registry->unregister('isSecureArea');
 | 
						|
        $registry->register('isSecureArea', true);
 | 
						|
        /** Remove website by id */
 | 
						|
        /** @var \Magento\Store\Model\Website $website */
 | 
						|
        $website = $this->objectManager->create(\Magento\Store\Model\Website::class);
 | 
						|
        $website->load((int)$websiteId);
 | 
						|
        $website->delete();
 | 
						|
 | 
						|
        /** Revert mark area secured */
 | 
						|
        $registry->unregister('isSecuredArea');
 | 
						|
        $registry->register('isSecuredArea', $isSecuredAreaSystemState);
 | 
						|
 | 
						|
        /** Check that excluded website is no longer in customer group excluded website table */
 | 
						|
        $selectExcludedWebsite = $connection->select();
 | 
						|
        /** @var GroupExcludedWebsite $groupExcludedWebsiteResource */
 | 
						|
        $groupExcludedWebsiteResource = $this->objectManager->create(GroupExcludedWebsite::class);
 | 
						|
        $selectExcludedWebsite->from($groupExcludedWebsiteResource->getMainTable())
 | 
						|
            ->where('website_id = ?', $websiteId);
 | 
						|
        $excludedWebsites = $connection->fetchAll($selectExcludedWebsite);
 | 
						|
        self::assertCount(0, $excludedWebsites);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Find the customer group with a given code.
 | 
						|
     *
 | 
						|
     * @param string $code
 | 
						|
     * @return int
 | 
						|
     * @throws LocalizedException
 | 
						|
     */
 | 
						|
    private function findGroupIdWithCode(string $code): int
 | 
						|
    {
 | 
						|
        /** @var GroupRepositoryInterface $groupRepository */
 | 
						|
        $groupRepository = $this->objectManager->create(GroupRepositoryInterface::class);
 | 
						|
        /** @var SearchCriteriaBuilder $searchBuilder */
 | 
						|
        $searchBuilder = $this->objectManager->create(SearchCriteriaBuilder::class);
 | 
						|
 | 
						|
        foreach ($groupRepository->getList($searchBuilder->create())->getItems() as $group) {
 | 
						|
            if ($group->getCode() === $code) {
 | 
						|
                return (int)$group->getId();
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return -1;
 | 
						|
    }
 | 
						|
}
 |