mirror of
https://github.com/bdnugget/magento2.git
synced 2026-11-08 01:37:36 +00:00
422 lines
14 KiB
PHP
422 lines
14 KiB
PHP
<?php
|
|
/**
|
|
* Copyright © Magento, Inc. All rights reserved.
|
|
* See COPYING.txt for license details.
|
|
*/
|
|
declare(strict_types=1);
|
|
|
|
namespace Magento\Customer\Test\Unit\Model;
|
|
|
|
use Magento\Customer\Api\AddressRepositoryInterface;
|
|
use Magento\Customer\Api\CustomerMetadataInterface;
|
|
use Magento\Customer\Api\CustomerRepositoryInterface;
|
|
use Magento\Customer\Api\Data\CustomerInterface;
|
|
use Magento\Customer\Api\Data\ValidationResultsInterfaceFactory;
|
|
use Magento\Customer\Helper\View;
|
|
use Magento\Customer\Model\AccountConfirmation;
|
|
use Magento\Customer\Model\AccountManagement;
|
|
use Magento\Customer\Model\AccountManagementApi;
|
|
use Magento\Customer\Model\AddressRegistry;
|
|
use Magento\Customer\Model\Config\Share;
|
|
use Magento\Customer\Model\CustomerFactory;
|
|
use Magento\Customer\Model\CustomerRegistry;
|
|
use Magento\Customer\Model\Data\CustomerSecure;
|
|
use Magento\Customer\Model\Metadata\Validator;
|
|
use Magento\Customer\Model\ResourceModel\Visitor\CollectionFactory;
|
|
use Magento\Directory\Model\AllowedCountries;
|
|
use Magento\Framework\Api\ExtensibleDataObjectConverter;
|
|
use Magento\Framework\Api\SearchCriteriaBuilder;
|
|
use Magento\Framework\App\Config\ScopeConfigInterface;
|
|
use Magento\Framework\Authorization;
|
|
use Magento\Framework\DataObjectFactory;
|
|
use Magento\Framework\Encryption\EncryptorInterface;
|
|
use Magento\Framework\Event\ManagerInterface;
|
|
use Magento\Framework\Exception\AuthorizationException;
|
|
use Magento\Framework\Exception\LocalizedException;
|
|
use Magento\Framework\Intl\DateTimeFactory;
|
|
use Magento\Framework\Mail\Template\TransportBuilder;
|
|
use Magento\Framework\Math\Random;
|
|
use Magento\Framework\Reflection\DataObjectProcessor;
|
|
use Magento\Framework\Registry;
|
|
use Magento\Framework\Session\SaveHandlerInterface;
|
|
use Magento\Framework\Session\SessionManagerInterface;
|
|
use Magento\Framework\Stdlib\StringUtils;
|
|
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
|
|
use Magento\Store\Api\Data\StoreInterface;
|
|
use Magento\Store\Model\StoreManagerInterface;
|
|
use PHPUnit\Framework\MockObject\MockObject;
|
|
use PHPUnit\Framework\TestCase;
|
|
use Psr\Log\LoggerInterface;
|
|
|
|
/**
|
|
* Test for validating anonymous request for synchronous operations containing group id.
|
|
*
|
|
* @SuppressWarnings(PHPMD.TooManyFields)
|
|
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
|
|
*/
|
|
class AccountManagementApiTest extends TestCase
|
|
{
|
|
/**
|
|
* @var AccountManagement
|
|
*/
|
|
private $accountManagementMock;
|
|
|
|
/**
|
|
* @var AccountManagementApi
|
|
*/
|
|
private $accountManagement;
|
|
|
|
/**
|
|
* @var ObjectManagerHelper
|
|
*/
|
|
private $objectManagerHelper;
|
|
|
|
/**
|
|
* @var CustomerFactory|MockObject
|
|
*/
|
|
private $customerFactory;
|
|
|
|
/**
|
|
* @var ManagerInterface|MockObject
|
|
*/
|
|
private $manager;
|
|
|
|
/**
|
|
* @var StoreManagerInterface|MockObject
|
|
*/
|
|
private $storeManager;
|
|
|
|
/**
|
|
* @var Random|MockObject
|
|
*/
|
|
private $random;
|
|
|
|
/**
|
|
* @var Validator|MockObject
|
|
*/
|
|
private $validator;
|
|
|
|
/**
|
|
* @var ValidationResultsInterfaceFactory|MockObject
|
|
*/
|
|
private $validationResultsInterfaceFactory;
|
|
|
|
/**
|
|
* @var AddressRepositoryInterface|MockObject
|
|
*/
|
|
private $addressRepository;
|
|
|
|
/**
|
|
* @var CustomerMetadataInterface|MockObject
|
|
*/
|
|
private $customerMetadata;
|
|
|
|
/**
|
|
* @var CustomerRegistry|MockObject
|
|
*/
|
|
private $customerRegistry;
|
|
|
|
/**
|
|
* @var LoggerInterface|MockObject
|
|
*/
|
|
private $logger;
|
|
|
|
/**
|
|
* @var EncryptorInterface|MockObject
|
|
*/
|
|
private $encryptor;
|
|
|
|
/**
|
|
* @var Share|MockObject
|
|
*/
|
|
private $share;
|
|
|
|
/**
|
|
* @var StringUtils|MockObject
|
|
*/
|
|
private $string;
|
|
|
|
/**
|
|
* @var CustomerRepositoryInterface|MockObject
|
|
*/
|
|
private $customerRepository;
|
|
|
|
/**
|
|
* @var ScopeConfigInterface|MockObject
|
|
*/
|
|
private $scopeConfig;
|
|
|
|
/**
|
|
* @var TransportBuilder|MockObject
|
|
*/
|
|
private $transportBuilder;
|
|
|
|
/**
|
|
* @var DataObjectProcessor|MockObject
|
|
*/
|
|
private $dataObjectProcessor;
|
|
|
|
/**
|
|
* @var Registry|MockObject
|
|
*/
|
|
private $registry;
|
|
|
|
/**
|
|
* @var View|MockObject
|
|
*/
|
|
private $customerViewHelper;
|
|
|
|
/**
|
|
* @var \Magento\Framework\Stdlib\DateTime|MockObject
|
|
*/
|
|
private $dateTime;
|
|
|
|
/**
|
|
* @var \Magento\Customer\Model\Customer|MockObject
|
|
*/
|
|
private $customer;
|
|
|
|
/**
|
|
* @var DataObjectFactory|MockObject
|
|
*/
|
|
private $objectFactory;
|
|
|
|
/**
|
|
* @var ExtensibleDataObjectConverter|MockObject
|
|
*/
|
|
private $extensibleDataObjectConverter;
|
|
|
|
/**
|
|
* @var DateTimeFactory|MockObject
|
|
*/
|
|
private $dateTimeFactory;
|
|
|
|
/**
|
|
* @var AccountConfirmation|MockObject
|
|
*/
|
|
private $accountConfirmation;
|
|
|
|
/**
|
|
* @var MockObject|SessionManagerInterface
|
|
*/
|
|
private $sessionManager;
|
|
|
|
/**
|
|
* @var MockObject|CollectionFactory
|
|
*/
|
|
private $visitorCollectionFactory;
|
|
|
|
/**
|
|
* @var MockObject|SaveHandlerInterface
|
|
*/
|
|
private $saveHandler;
|
|
|
|
/**
|
|
* @var MockObject|AddressRegistry
|
|
*/
|
|
private $addressRegistryMock;
|
|
|
|
/**
|
|
* @var MockObject|SearchCriteriaBuilder
|
|
*/
|
|
private $searchCriteriaBuilderMock;
|
|
|
|
/**
|
|
* @var AllowedCountries|MockObject
|
|
*/
|
|
private $allowedCountriesReader;
|
|
|
|
/**
|
|
* @var Authorization|MockObject
|
|
*/
|
|
private $authorizationMock;
|
|
|
|
/**
|
|
* @var CustomerSecure|MockObject
|
|
*/
|
|
private $customerSecure;
|
|
|
|
/**
|
|
* @var StoreInterface|MockObject
|
|
*/
|
|
private $storeMock;
|
|
|
|
/**
|
|
* @inheritDoc
|
|
* @SuppressWarnings(PHPMD.ExcessiveMethodLength)
|
|
*/
|
|
protected function setUp(): void
|
|
{
|
|
$this->customerFactory = $this->createPartialMock(CustomerFactory::class, ['create']);
|
|
$this->manager = $this->getMockForAbstractClass(ManagerInterface::class);
|
|
$this->storeManager = $this->getMockForAbstractClass(StoreManagerInterface::class);
|
|
$this->random = $this->createMock(Random::class);
|
|
$this->validator = $this->createMock(Validator::class);
|
|
$this->validationResultsInterfaceFactory = $this->createMock(
|
|
ValidationResultsInterfaceFactory::class
|
|
);
|
|
$this->addressRepository = $this->getMockForAbstractClass(AddressRepositoryInterface::class);
|
|
$this->customerMetadata = $this->getMockForAbstractClass(CustomerMetadataInterface::class);
|
|
$this->customerRegistry = $this->createMock(CustomerRegistry::class);
|
|
|
|
$this->logger = $this->getMockForAbstractClass(LoggerInterface::class);
|
|
$this->encryptor = $this->getMockForAbstractClass(EncryptorInterface::class);
|
|
$this->share = $this->createMock(Share::class);
|
|
$this->string = $this->createMock(StringUtils::class);
|
|
$this->customerRepository = $this->getMockForAbstractClass(CustomerRepositoryInterface::class);
|
|
$this->scopeConfig = $this->getMockBuilder(ScopeConfigInterface::class)
|
|
->disableOriginalConstructor()
|
|
->getMockForAbstractClass();
|
|
$this->transportBuilder = $this->createMock(TransportBuilder::class);
|
|
$this->dataObjectProcessor = $this->createMock(DataObjectProcessor::class);
|
|
$this->registry = $this->createMock(Registry::class);
|
|
$this->customerViewHelper = $this->createMock(View::class);
|
|
$this->dateTime = $this->createMock(\Magento\Framework\Stdlib\DateTime::class);
|
|
$this->customer = $this->createMock(\Magento\Customer\Model\Customer::class);
|
|
$this->objectFactory = $this->createMock(DataObjectFactory::class);
|
|
$this->addressRegistryMock = $this->createMock(AddressRegistry::class);
|
|
$this->extensibleDataObjectConverter = $this->createMock(
|
|
ExtensibleDataObjectConverter::class
|
|
);
|
|
$this->allowedCountriesReader = $this->createMock(AllowedCountries::class);
|
|
$this->customerSecure = $this->getMockBuilder(CustomerSecure::class)
|
|
->onlyMethods(['addData', 'setData'])
|
|
->addMethods(['setRpToken', 'setRpTokenCreatedAt'])
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$this->dateTimeFactory = $this->createMock(DateTimeFactory::class);
|
|
$this->accountConfirmation = $this->createMock(AccountConfirmation::class);
|
|
$this->searchCriteriaBuilderMock = $this->createMock(SearchCriteriaBuilder::class);
|
|
|
|
$this->visitorCollectionFactory = $this->getMockBuilder(CollectionFactory::class)
|
|
->disableOriginalConstructor()
|
|
->onlyMethods(['create'])
|
|
->getMock();
|
|
$this->sessionManager = $this->getMockBuilder(SessionManagerInterface::class)
|
|
->disableOriginalConstructor()
|
|
->getMockForAbstractClass();
|
|
$this->saveHandler = $this->getMockBuilder(SaveHandlerInterface::class)
|
|
->disableOriginalConstructor()
|
|
->getMockForAbstractClass();
|
|
$this->authorizationMock = $this->createMock(Authorization::class);
|
|
$this->objectManagerHelper = new ObjectManagerHelper($this);
|
|
$this->accountManagement = $this->objectManagerHelper->getObject(
|
|
AccountManagementApi::class,
|
|
[
|
|
'customerFactory' => $this->customerFactory,
|
|
'eventManager' => $this->manager,
|
|
'storeManager' => $this->storeManager,
|
|
'mathRandom' => $this->random,
|
|
'validator' => $this->validator,
|
|
'validationResultsDataFactory' => $this->validationResultsInterfaceFactory,
|
|
'addressRepository' => $this->addressRepository,
|
|
'customerMetadataService' => $this->customerMetadata,
|
|
'customerRegistry' => $this->customerRegistry,
|
|
'logger' => $this->logger,
|
|
'encryptor' => $this->encryptor,
|
|
'configShare' => $this->share,
|
|
'stringHelper' => $this->string,
|
|
'customerRepository' => $this->customerRepository,
|
|
'scopeConfig' => $this->scopeConfig,
|
|
'transportBuilder' => $this->transportBuilder,
|
|
'dataProcessor' => $this->dataObjectProcessor,
|
|
'registry' => $this->registry,
|
|
'customerViewHelper' => $this->customerViewHelper,
|
|
'dateTime' => $this->dateTime,
|
|
'customerModel' => $this->customer,
|
|
'objectFactory' => $this->objectFactory,
|
|
'extensibleDataObjectConverter' => $this->extensibleDataObjectConverter,
|
|
'dateTimeFactory' => $this->dateTimeFactory,
|
|
'accountConfirmation' => $this->accountConfirmation,
|
|
'sessionManager' => $this->sessionManager,
|
|
'saveHandler' => $this->saveHandler,
|
|
'visitorCollectionFactory' => $this->visitorCollectionFactory,
|
|
'searchCriteriaBuilder' => $this->searchCriteriaBuilderMock,
|
|
'addressRegistry' => $this->addressRegistryMock,
|
|
'allowedCountriesReader' => $this->allowedCountriesReader,
|
|
'authorization' => $this->authorizationMock
|
|
]
|
|
);
|
|
$this->accountManagementMock = $this->createMock(AccountManagement::class);
|
|
|
|
$this->storeMock = $this->getMockBuilder(
|
|
StoreInterface::class
|
|
)->disableOriginalConstructor()
|
|
->getMock();
|
|
}
|
|
|
|
/**
|
|
* Verify that only authorized request will be able to change groupId
|
|
*
|
|
* @param int $groupId
|
|
* @param int $customerId
|
|
* @param bool $isAllowed
|
|
* @param int $willThrowException
|
|
* @return void
|
|
* @throws AuthorizationException
|
|
* @throws LocalizedException
|
|
* @dataProvider customerDataProvider
|
|
*/
|
|
public function testBeforeCreateAccount(
|
|
int $groupId,
|
|
int $customerId,
|
|
bool $isAllowed,
|
|
int $willThrowException
|
|
): void {
|
|
if ($willThrowException) {
|
|
$this->expectException(AuthorizationException::class);
|
|
} else {
|
|
$this->expectNotToPerformAssertions();
|
|
}
|
|
$this->authorizationMock
|
|
->expects($this->once())
|
|
->method('isAllowed')
|
|
->with('Magento_Customer::manage')
|
|
->willReturn($isAllowed);
|
|
|
|
$customer = $this->getMockBuilder(CustomerInterface::class)
|
|
->addMethods(['setData'])
|
|
->getMockForAbstractClass();
|
|
$customer->method('getGroupId')->willReturn($groupId);
|
|
$customer->method('getId')->willReturn($customerId);
|
|
$customer->method('getWebsiteId')->willReturn(2);
|
|
$customer->method('getStoreId')->willReturn(1);
|
|
$customer->method('setData')->willReturn(1);
|
|
|
|
$this->customerRepository->method('get')->willReturn($customer);
|
|
$this->customerRepository->method('getById')->with($customerId)->willReturn($customer);
|
|
$this->customerRepository->method('save')->willReturn($customer);
|
|
|
|
if (!$willThrowException) {
|
|
$this->accountManagementMock->method('createAccountWithPasswordHash')->willReturn($customer);
|
|
$this->storeMock->expects($this->any())->method('getId')->willReturnOnConsecutiveCalls(2, 1);
|
|
$this->random->method('getUniqueHash')->willReturn('testabc');
|
|
$date = $this->getMockBuilder(\DateTime::class)
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$this->dateTimeFactory->expects(static::once())
|
|
->method('create')
|
|
->willReturn($date);
|
|
$date->expects(static::once())
|
|
->method('format')
|
|
->with('Y-m-d H:i:s')
|
|
->willReturn('2015-01-01 00:00:00');
|
|
$this->customerRegistry->method('retrieveSecureData')->willReturn($this->customerSecure);
|
|
$this->storeManager->method('getStores')
|
|
->willReturn([$this->storeMock]);
|
|
}
|
|
$this->accountManagement->createAccount($customer);
|
|
}
|
|
|
|
/**
|
|
* @return array
|
|
*/
|
|
public function customerDataProvider(): array
|
|
{
|
|
return [
|
|
[3, 1, false, 1],
|
|
[3, 1, true, 0]
|
|
];
|
|
}
|
|
}
|