Your IP : 216.73.216.220


Current Path : /home/rtorresani/www/vendor/magento/module-adobe-ims/Test/Unit/Block/Adminhtml/
Upload File :
Current File : //home/rtorresani/www/vendor/magento/module-adobe-ims/Test/Unit/Block/Adminhtml/SignInTest.php

<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
declare(strict_types=1);

namespace Magento\AdobeIms\Test\Unit\Block\Adminhtml;

use Magento\AdobeIms\Block\Adminhtml\SignIn as SignInBlock;
use Magento\AdobeImsApi\Api\ConfigInterface;
use Magento\AdobeImsApi\Api\ConfigProviderInterface;
use Magento\AdobeImsApi\Api\Data\UserProfileInterface;
use Magento\AdobeImsApi\Api\UserAuthorizedInterface;
use Magento\AdobeImsApi\Api\UserProfileRepositoryInterface;
use Magento\Authorization\Model\UserContextInterface;
use Magento\Backend\Block\Template\Context;
use Magento\Framework\Exception\NoSuchEntityException;
use Magento\Framework\Serialize\Serializer\JsonHexTag;
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
use Magento\Framework\UrlInterface;
use PHPUnit\Framework\MockObject\MockObject;
use PHPUnit\Framework\TestCase;

/**
 * Config data test.
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 */
class SignInTest extends TestCase
{
    private const PROFILE_URL = 'https://url.test/';
    private const LOGOUT_URL = 'https://url.test/';
    private const AUTH_URL = '';
    private const RESPONSE_REGEXP_PATTERN = 'auth\\[code=(success|error);message=(.+)\\]';
    private const RESPONSE_CODE_INDEX = 1;
    private const RESPONSE_MESSAGE_INDEX = 2;
    private const RESPONSE_SUCCESS_CODE = 'success';
    private const RESPONSE_ERROR_CODE = 'error';

    /**
     * @var UserContextInterface|MockObject
     */
    private $userContextMock;

    /**
     * @var UserAuthorizedInterface|MockObject
     */
    private $userAuthorizedMock;

    /**
     * @var UserProfileRepositoryInterface|MockObject
     */
    private $userProfileRepositoryMock;

    /**
     * @var JsonHexTag|MockObject
     */
    private $jsonHexTag;

    /**
     * @var SignInBlock;
     */
    private $signInBlock;

    /**
     * Prepare test objects.
     */
    protected function setUp(): void
    {
        $configMock = $this->createMock(ConfigInterface::class);
        $configMock->expects($this->once())
            ->method('getAuthUrl')
            ->willReturn(self::AUTH_URL);

        $urlBuilderMock = $this->createMock(UrlInterface::class);
        $urlBuilderMock->method('getUrl')
            ->willReturn(self::PROFILE_URL);
        $contextMock = $this->createMock(Context::class);
        $contextMock->method('getUrlBuilder')
            ->willReturn($urlBuilderMock);

        $this->userContextMock = $this->createMock(UserContextInterface::class);
        $this->userAuthorizedMock = $this->createMock(UserAuthorizedInterface::class);
        $this->userProfileRepositoryMock = $this->createMock(UserProfileRepositoryInterface::class);
        $this->jsonHexTag = $this->createMock(JsonHexTag::class);

        $objectManager = new ObjectManager($this);
        $this->signInBlock = $objectManager->getObject(
            SignInBlock::class,
            [
                'config' => $configMock,
                'context' => $contextMock,
                'userContext' => $this->userContextMock,
                'userAuthorized' => $this->userAuthorizedMock,
                'userProfileRepository' => $this->userProfileRepositoryMock,
                'json' => $this->jsonHexTag
            ]
        );
    }

    /**
     * @dataProvider userDataProvider
     * @param int $userId
     * @param bool $userExists
     * @param array $userData
     * @param array $configProviderData
     * @param array $expectedData
     */
    public function testGetComponentJsonConfig(
        int $userId,
        bool $userExists,
        array $userData,
        array $configProviderData,
        array $expectedData
    ): void {
        $this->userAuthorizedMock->expects($this->once())
            ->method('execute')
            ->willReturn($userData['isAuthorized']);

        $userProfile = $this->createMock(UserProfileInterface::class);
        $userProfile->method('getName')->willReturn($userData['name']);
        $userProfile->method('getEmail')->willReturn($userData['email']);
        $userProfile->method('getImage')->willReturn($userData['image']);

        $this->userContextMock->expects($this->any())
            ->method('getUserId')
            ->willReturn($userId);

        $userRepositoryWillReturn = $userExists
            ? $this->returnValue($userProfile)
            : $this->throwException(new NoSuchEntityException());
        $this->userProfileRepositoryMock
            ->method('getByUserId')
            ->with($userId)
            ->will($userRepositoryWillReturn);

        $configProviderMock = $this->createMock(ConfigProviderInterface::class);
        $configProviderMock->expects($this->any())
            ->method('get')
            ->willReturn($configProviderData);
        $this->signInBlock->setData('configProviders', [$configProviderMock]);

        $serializedResult = 'Some result';
        $this->jsonHexTag->expects($this->once())
            ->method('serialize')
            ->with($expectedData)
            ->willReturn($serializedResult);

        $this->assertEquals($serializedResult, $this->signInBlock->getComponentJsonConfig());
    }

    /**
     * Returns default component config
     *
     * @param array $userData
     * @return array
     */
    private function getDefaultComponentConfig(array $userData): array
    {
        return [
            'component' => 'Magento_AdobeIms/js/signIn',
            'template' => 'Magento_AdobeIms/signIn',
            'profileUrl' => self::PROFILE_URL,
            'logoutUrl' => self::LOGOUT_URL,
            'user' => $userData,
            'isGlobalSignInEnabled' => false,
            'loginConfig' => [
                'url' => self::AUTH_URL,
                'callbackParsingParams' => [
                    'regexpPattern' => self::RESPONSE_REGEXP_PATTERN,
                    'codeIndex' => self::RESPONSE_CODE_INDEX,
                    'messageIndex' => self::RESPONSE_MESSAGE_INDEX,
                    'successCode' => self::RESPONSE_SUCCESS_CODE,
                    'errorCode' => self::RESPONSE_ERROR_CODE
                ]
            ]
        ];
    }

    /**
     * Returns config from an additional config provider
     *
     * @return array
     */
    private function getConfigProvideConfig(): array
    {
        return [
            'component' => 'Magento_AdobeIms/js/test',
            'template' => 'Magento_AdobeIms/test',
            'profileUrl' => '',
            'logoutUrl' => '',
            'user' => [],
            'loginConfig' => [
                'url' => 'https://sometesturl.test',
                'callbackParsingParams' => [
                    'regexpPattern' => self::RESPONSE_REGEXP_PATTERN,
                    'codeIndex' => self::RESPONSE_CODE_INDEX,
                    'messageIndex' => self::RESPONSE_MESSAGE_INDEX,
                    'successCode' => self::RESPONSE_SUCCESS_CODE,
                    'errorCode' => self::RESPONSE_ERROR_CODE
                ]
            ]
        ];
    }

    /**
     * Get default user data for an assertion
     *
     * @return array
     */
    private function getDefaultUserData(): array
    {
        return [
            'isAuthorized' => false,
            'name' => '',
            'email' => '',
            'image' => '',
        ];
    }

    /**
     * @return array
     */
    public function userDataProvider(): array
    {
        return [
            'Existing authorized user' => [
                11,
                true,
                [
                    'isAuthorized' => true,
                    'name' => 'John',
                    'email' => 'john@email.com',
                    'image' => 'image.png'
                ],
                [],
                $this->getDefaultComponentConfig([
                    'isAuthorized' => true,
                    'name' => 'John',
                    'email' => 'john@email.com',
                    'image' => 'image.png'
                ])
            ],
            'Existing non-authorized user' => [
                12,
                true,
                [
                    'isAuthorized' => false,
                    'name' => 'John',
                    'email' => 'john@email.com',
                    'image' => 'image.png'
                ],
                [],
                $this->getDefaultComponentConfig($this->getDefaultUserData()),
            ],
            'Non-existing user' => [
                13,
                false, //user doesn't exist
                [
                    'isAuthorized' => true,
                    'name' => 'John',
                    'email' => 'john@email.com',
                    'image' => 'image.png'
                ],
                [],
                $this->getDefaultComponentConfig($this->getDefaultUserData()),
            ],
            'Existing user with additional config provider' => [
                14,
                true,
                [
                    'isAuthorized' => false,
                    'name' => 'John',
                    'email' => 'john@email.com',
                    'image' => 'image.png'
                ],
                $this->getConfigProvideConfig(),
                array_replace_recursive(
                    $this->getDefaultComponentConfig($this->getDefaultUserData()),
                    $this->getConfigProvideConfig()
                )
            ]
        ];
    }
}