236 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			236 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Analytics\Cron;
 | 
						|
 | 
						|
use Laminas\Http\Response;
 | 
						|
use Magento\Analytics\Model\Config\Backend\Baseurl\SubscriptionUpdateHandler;
 | 
						|
use Magento\Analytics\Model\Connector\Http\Client\Curl as CurlClient;
 | 
						|
use Magento\Analytics\Model\Connector\Http\ClientInterface;
 | 
						|
use Magento\Config\Model\PreparedValueFactory;
 | 
						|
use Magento\Config\Model\ResourceModel\Config\Data as ConfigDataResource;
 | 
						|
use Magento\Framework\App\Config\ScopeConfigInterface;
 | 
						|
use Magento\Framework\FlagManager;
 | 
						|
use Magento\Store\Model\Store;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
use Magento\TestFramework\ObjectManager;
 | 
						|
 | 
						|
/**
 | 
						|
 * @magentoAppArea adminhtml
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class UpdateTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var ObjectManager
 | 
						|
     */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var PreparedValueFactory
 | 
						|
     */
 | 
						|
    private $preparedValueFactory;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ConfigDataResource
 | 
						|
     */
 | 
						|
    private $configValueResourceModel;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var Update
 | 
						|
     */
 | 
						|
    private $updateCron;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ClientInterface|\PHPUnit\Framework\MockObject\MockObject
 | 
						|
     */
 | 
						|
    private $httpClient;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var FlagManager
 | 
						|
     */
 | 
						|
    private $flagManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var ScopeConfigInterface
 | 
						|
     */
 | 
						|
    private $scopeConfig;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->httpClient = $this->getMockBuilder(ClientInterface::class)
 | 
						|
            ->getMockForAbstractClass();
 | 
						|
        $this->objectManager->addSharedInstance($this->httpClient, CurlClient::class);
 | 
						|
        $this->preparedValueFactory = $this->objectManager->get(PreparedValueFactory::class);
 | 
						|
        $this->configValueResourceModel = $this->objectManager->get(ConfigDataResource::class);
 | 
						|
        $this->updateCron = $this->objectManager->get(Update::class);
 | 
						|
        $this->scopeConfig = $this->objectManager->get(ScopeConfigInterface::class);
 | 
						|
        $this->flagManager = $this->objectManager->get(FlagManager::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoDataFixture Magento/Analytics/_files/enabled_subscription_with_invalid_token.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testSuccessfulAttemptExecute()
 | 
						|
    {
 | 
						|
        $this->saveConfigValue(
 | 
						|
            Store::XML_PATH_SECURE_BASE_URL,
 | 
						|
            'http://store.com/'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->mockRequestCall(201, 'URL has been changed');
 | 
						|
 | 
						|
        $this->updateCron->execute();
 | 
						|
        $this->assertEmpty($this->getUpdateCounterFlag());
 | 
						|
        $this->assertEmpty($this->getPreviousBaseUrlFlag());
 | 
						|
        $this->assertEmpty($this->getConfigValue(SubscriptionUpdateHandler::UPDATE_CRON_STRING_PATH));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoDataFixture Magento/Analytics/_files/enabled_subscription_with_invalid_token.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testUnsuccessfulAttemptExecute()
 | 
						|
    {
 | 
						|
        $this->saveConfigValue(
 | 
						|
            Store::XML_PATH_SECURE_BASE_URL,
 | 
						|
            'http://store.com/'
 | 
						|
        );
 | 
						|
 | 
						|
        $reverseCounter = $this->getUpdateCounterFlag();
 | 
						|
        $this->mockRequestCall(500, 'Unauthorized access');
 | 
						|
 | 
						|
        $this->updateCron->execute();
 | 
						|
        $this->assertEquals($reverseCounter - 1, $this->getUpdateCounterFlag());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoDataFixture Magento/Analytics/_files/enabled_subscription_with_invalid_token.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testLastUnsuccessfulAttemptExecute()
 | 
						|
    {
 | 
						|
        $this->saveConfigValue(
 | 
						|
            Store::XML_PATH_SECURE_BASE_URL,
 | 
						|
            'http://store.com/'
 | 
						|
        );
 | 
						|
 | 
						|
        $this->setUpdateCounterValue(1);
 | 
						|
        $this->mockRequestCall(500, 'Unauthorized access');
 | 
						|
 | 
						|
        $this->updateCron->execute();
 | 
						|
        $this->assertEmpty($this->getUpdateCounterFlag());
 | 
						|
        $this->assertEmpty($this->getPreviousBaseUrlFlag());
 | 
						|
        $this->assertEmpty($this->getConfigValue(SubscriptionUpdateHandler::UPDATE_CRON_STRING_PATH));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Save configuration value
 | 
						|
     *
 | 
						|
     * @param string $path The configuration path in format section/group/field_name
 | 
						|
     * @param string $value The configuration value
 | 
						|
     * @param string $scope The configuration scope (default, website, or store)
 | 
						|
     * @return void
 | 
						|
     * @throws \Magento\Framework\Exception\RuntimeException
 | 
						|
     * @throws \Magento\Framework\Exception\AlreadyExistsException
 | 
						|
     */
 | 
						|
    private function saveConfigValue(
 | 
						|
        string $path,
 | 
						|
        string $value,
 | 
						|
        string $scope = ScopeConfigInterface::SCOPE_TYPE_DEFAULT
 | 
						|
    ) {
 | 
						|
        $configValue = $this->preparedValueFactory->create(
 | 
						|
            $path,
 | 
						|
            $value,
 | 
						|
            $scope
 | 
						|
        );
 | 
						|
        $this->configValueResourceModel->save($configValue);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get configuration value
 | 
						|
     *
 | 
						|
     * @param string $path
 | 
						|
     * @param string $scopeType
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    private function getConfigValue(
 | 
						|
        string $path,
 | 
						|
        string $scopeType = ScopeConfigInterface::SCOPE_TYPE_DEFAULT
 | 
						|
    ) {
 | 
						|
        return $this->scopeConfig->getValue(
 | 
						|
            $path,
 | 
						|
            $scopeType
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get update counter flag value
 | 
						|
     *
 | 
						|
     * @return int|null
 | 
						|
     */
 | 
						|
    private function getUpdateCounterFlag(): ?int
 | 
						|
    {
 | 
						|
        return $this->flagManager
 | 
						|
            ->getFlagData(SubscriptionUpdateHandler::SUBSCRIPTION_UPDATE_REVERSE_COUNTER_FLAG_CODE);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Get previous URL flag value
 | 
						|
     *
 | 
						|
     * @return string|null
 | 
						|
     */
 | 
						|
    private function getPreviousBaseUrlFlag(): ?string
 | 
						|
    {
 | 
						|
        return $this->flagManager
 | 
						|
            ->getFlagData(SubscriptionUpdateHandler::PREVIOUS_BASE_URL_FLAG_CODE);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set response mock for the HTTP client
 | 
						|
     *
 | 
						|
     * @param int $responseCode
 | 
						|
     * @param string $responseMessage
 | 
						|
     */
 | 
						|
    private function mockRequestCall(int $responseCode, string $responseMessage): void
 | 
						|
    {
 | 
						|
        /** @var Response $response */
 | 
						|
        $response = $this->objectManager->create(Response::class);
 | 
						|
        $response->setStatusCode($responseCode);
 | 
						|
        $response->getHeaders()->addHeaderLine('Content-Type', 'application/json');
 | 
						|
        $response->setContent(json_encode(['message' => $responseMessage]));
 | 
						|
 | 
						|
        $this->httpClient
 | 
						|
            ->expects($this->once())
 | 
						|
            ->method('request')
 | 
						|
            ->willReturn($response);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set value for update counter flag
 | 
						|
     *
 | 
						|
     * @param int $value
 | 
						|
     */
 | 
						|
    private function setUpdateCounterValue(int $value): void
 | 
						|
    {
 | 
						|
        $this->flagManager
 | 
						|
            ->saveFlag(SubscriptionUpdateHandler::SUBSCRIPTION_UPDATE_REVERSE_COUNTER_FLAG_CODE, $value);
 | 
						|
    }
 | 
						|
}
 |