![]() 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/vendor/magento/module-customer/Test/Unit/Model/ |
<?php declare(strict_types=1); /** * Unit test for customer service layer \Magento\Customer\Model\Customer * * Copyright © Magento, Inc. All rights reserved. * See COPYING.txt for license details. */ /** * Test class for \Magento\Customer\Model\Customer testing */ namespace Magento\Customer\Test\Unit\Model; use Magento\Customer\Api\Data\AddressInterface; use Magento\Customer\Api\Data\CustomerInterface; use Magento\Customer\Api\Data\CustomerInterfaceFactory; use Magento\Customer\Model\AccountConfirmation; use Magento\Customer\Model\Address as AddressModel; use Magento\Customer\Model\Customer; use Magento\Customer\Model\ResourceModel\Address\Collection as AddressCollection; use Magento\Customer\Model\ResourceModel\Address\CollectionFactory as AddressCollectionFactory; use Magento\Customer\Model\ResourceModel\Customer as CustomerResourceModel; use Magento\Eav\Model\Attribute; use Magento\Eav\Model\Config; use Magento\Framework\Api\AttributeValue; use Magento\Framework\Api\DataObjectHelper; use Magento\Framework\App\Config\ScopeConfigInterface; use Magento\Framework\Encryption\EncryptorInterface; use Magento\Framework\Exception\LocalizedException; use Magento\Framework\Mail\Template\TransportBuilder; use Magento\Framework\Mail\TransportInterface; use Magento\Framework\Math\Random; use Magento\Framework\Reflection\DataObjectProcessor; use Magento\Framework\Registry; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Store\Model\Store; use Magento\Store\Model\StoreManager; use Magento\Store\Model\Website; use PHPUnit\Framework\MockObject\MockObject; use PHPUnit\Framework\TestCase; /** * @SuppressWarnings(PHPMD.CouplingBetweenObjects) * @SuppressWarnings(PHPMD.TooManyFields) */ class CustomerTest extends TestCase { /** @var Customer */ protected $_model; /** @var Website|MockObject */ protected $_website; /** @var StoreManager|MockObject */ protected $_storeManager; /** @var Config|MockObject */ protected $_config; /** @var Attribute|MockObject */ protected $_attribute; /** @var ScopeConfigInterface|MockObject */ protected $_scopeConfigMock; /** @var TransportBuilder|MockObject */ protected $_transportBuilderMock; /** @var TransportInterface|MockObject */ protected $_transportMock; /** @var EncryptorInterface|MockObject */ protected $_encryptor; /** @var \Magento\Customer\Model\AttributeFactory|MockObject */ protected $attributeFactoryMock; /** @var \Magento\Customer\Model\Attribute|MockObject */ protected $attributeCustomerMock; /** @var Registry|MockObject */ protected $registryMock; /** @var CustomerResourceModel|MockObject */ protected $resourceMock; /** * @var DataObjectProcessor|MockObject */ private $dataObjectProcessor; /** * @var AccountConfirmation|MockObject */ private $accountConfirmation; /** * @var AddressCollectionFactory|MockObject */ private $addressesFactory; /** * @var CustomerInterfaceFactory|MockObject */ private $customerDataFactory; /** * @var DataObjectHelper|MockObject */ private $dataObjectHelper; /** * @var Random|MockObject */ private $mathRandom; /** * @inheritdoc */ protected function setUp(): void { $this->_website = $this->createMock(Website::class); $this->_config = $this->createMock(Config::class); $this->_attribute = $this->createMock(Attribute::class); $this->_storeManager = $this->createMock(StoreManager::class); $this->_scopeConfigMock = $this->getMockForAbstractClass(ScopeConfigInterface::class); $this->_transportBuilderMock = $this->createMock(TransportBuilder::class); $this->_transportMock = $this->getMockForAbstractClass(TransportInterface::class); $this->attributeFactoryMock = $this->createPartialMock( \Magento\Customer\Model\AttributeFactory::class, ['create'] ); $this->attributeCustomerMock = $this->createMock(\Magento\Customer\Model\Attribute::class); $this->resourceMock = $this->createPartialMock( CustomerResourceModel::class, // \Magento\Framework\DataObject::class, ['getIdFieldName'] ); $this->dataObjectProcessor = $this->createPartialMock( DataObjectProcessor::class, ['buildOutputDataArray'] ); $this->resourceMock->expects($this->any()) ->method('getIdFieldName') ->willReturn('id'); $this->registryMock = $this->createPartialMock(Registry::class, ['registry']); $this->_encryptor = $this->getMockForAbstractClass(EncryptorInterface::class); $helper = new ObjectManager($this); $this->accountConfirmation = $this->createMock(AccountConfirmation::class); $this->addressesFactory = $this->getMockBuilder(AddressCollectionFactory::class) ->disableOriginalConstructor() ->setMethods(['create']) ->getMock(); $this->customerDataFactory = $this->getMockBuilder(CustomerInterfaceFactory::class) ->disableOriginalConstructor() ->setMethods(['create']) ->getMock(); $this->dataObjectHelper = $this->getMockBuilder(DataObjectHelper::class) ->disableOriginalConstructor() ->setMethods(['populateWithArray']) ->getMock(); $this->mathRandom = $this->createMock(Random::class); $this->_model = $helper->getObject( \Magento\Customer\Model\Customer::class, [ 'storeManager' => $this->_storeManager, 'config' => $this->_config, 'transportBuilder' => $this->_transportBuilderMock, 'scopeConfig' => $this->_scopeConfigMock, 'encryptor' => $this->_encryptor, 'attributeFactory' => $this->attributeFactoryMock, 'registry' => $this->registryMock, 'resource' => $this->resourceMock, 'dataObjectProcessor' => $this->dataObjectProcessor, 'accountConfirmation' => $this->accountConfirmation, '_addressesFactory' => $this->addressesFactory, 'customerDataFactory' => $this->customerDataFactory, 'dataObjectHelper' => $this->dataObjectHelper, 'mathRandom' => $this->mathRandom, ] ); } public function testHashPassword() { $this->_encryptor->expects( $this->once() )->method( 'getHash' )->with( 'password', 'salt' )->willReturn( 'hash' ); $this->assertEquals('hash', $this->_model->hashPassword('password', 'salt')); } public function testSendNewAccountEmailException() { $this->expectException(LocalizedException::class); $this->expectExceptionMessage('The transactional account email type is incorrect. Verify and try again.'); $this->_model->sendNewAccountEmail('test'); } public function testSendNewAccountEmailWithoutStoreId() { $store = $this->createMock(Store::class); $website = $this->createMock(Website::class); $website->expects($this->once()) ->method('getStoreIds') ->willReturn([1, 2, 3, 4]); $this->_storeManager->expects($this->once()) ->method('getWebsite') ->with(1) ->willReturn($website); $this->_storeManager->expects($this->once()) ->method('getStore') ->with(1) ->willReturn($store); $this->_config->expects($this->exactly(3)) ->method('getAttribute') ->willReturn($this->_attribute); $this->_attribute->expects($this->exactly(3)) ->method('getIsVisible') ->willReturn(true); $methods = [ 'setTemplateIdentifier', 'setTemplateOptions', 'setTemplateVars', 'setFrom', 'addTo', ]; foreach ($methods as $method) { $this->_transportBuilderMock->expects($this->once()) ->method($method) ->willReturnSelf(); } $transportMock = $this->getMockForAbstractClass(TransportInterface::class); $transportMock->expects($this->once()) ->method('sendMessage') ->willReturnSelf(); $this->_transportBuilderMock->expects($this->once()) ->method('getTransport') ->willReturn($transportMock); $this->_model->setData( [ 'website_id' => 1, 'store_id' => 1, 'email' => '[email protected]', 'firstname' => 'FirstName', 'lastname' => 'LastName', 'middlename' => 'MiddleName', 'prefix' => 'Name Prefix', ] ); $this->_model->sendNewAccountEmail('registered'); } /** * @param $lockExpires * @param $expectedResult * @dataProvider isCustomerLockedDataProvider */ public function testIsCustomerLocked($lockExpires, $expectedResult) { $this->_model->setLockExpires($lockExpires); $this->assertEquals($expectedResult, $this->_model->isCustomerLocked()); } /** * @return array */ public function isCustomerLockedDataProvider() { return [ ['lockExpirationDate' => date("F j, Y", strtotime('-1 days')), 'expectedResult' => false], ['lockExpirationDate' => date("F j, Y", strtotime('+1 days')), 'expectedResult' => true] ]; } /** * @param int $customerId * @param int $websiteId * @param bool $isConfirmationRequired * @param bool $expected * @dataProvider dataProviderIsConfirmationRequired */ public function testIsConfirmationRequired( $customerId, $websiteId, $isConfirmationRequired, $expected ) { $customerEmail = '[email protected]'; $this->_model->setData('id', $customerId); $this->_model->setData('website_id', $websiteId); $this->_model->setData('email', $customerEmail); $this->accountConfirmation->expects($this->once()) ->method('isConfirmationRequired') ->with($websiteId, $customerId, $customerEmail) ->willReturn($isConfirmationRequired); $this->assertEquals($expected, $this->_model->isConfirmationRequired()); } /** * @return array */ public function dataProviderIsConfirmationRequired() { return [ [null, null, false, false], [1, 1, true, true], [1, null, true, true], ]; } public function testUpdateData() { $customerDataAttributes = [ 'attribute' => 'attribute', 'test1' => 'test1', 'test33' => 'test33', ]; $customer = $this->createPartialMock( \Magento\Customer\Model\Data\Customer::class, [ 'getCustomAttributes', 'getId', ] ); $attribute = $this->createPartialMock( AttributeValue::class, [ 'getAttributeCode', 'getValue', ] ); $this->dataObjectProcessor->expects($this->once()) ->method('buildOutputDataArray') ->withConsecutive( [$customer, CustomerInterface::class] )->willReturn($customerDataAttributes); $attribute->expects($this->exactly(3)) ->method('getAttributeCode') ->willReturn('test33'); $attribute->expects($this->exactly(2)) ->method('getValue') ->willReturn('test33'); $customer->expects($this->once()) ->method('getCustomAttributes') ->willReturn([$attribute->getAttributeCode() => $attribute]); $this->_model->updateData($customer); foreach ($customerDataAttributes as $key => $value) { $expectedResult[strtolower(trim(preg_replace('/([A-Z]|[0-9]+)/', "_$1", $key), '_'))] = $value; } $expectedResult[$attribute->getAttributeCode()] = $attribute->getValue(); $this->assertEquals($this->_model->getData(), $expectedResult); } /** * Test for the \Magento\Customer\Model\Customer::getDataModel() method */ public function testGetDataModel() { $customerId = 1; $this->_model->setEntityId($customerId); $this->_model->setId($customerId); $addressDataModel = $this->getMockForAbstractClass(AddressInterface::class); $address = $this->getMockBuilder(AddressModel::class) ->disableOriginalConstructor() ->setMethods(['setCustomer', 'getDataModel']) ->getMock(); $address->expects($this->atLeastOnce())->method('getDataModel')->willReturn($addressDataModel); $addresses = new \ArrayIterator([$address, $address]); $addressCollection = $this->getMockBuilder(AddressCollection::class) ->disableOriginalConstructor() ->setMethods(['setCustomerFilter', 'addAttributeToSelect', 'getIterator', 'getItems']) ->getMock(); $addressCollection->expects($this->atLeastOnce())->method('setCustomerFilter')->willReturnSelf(); $addressCollection->expects($this->atLeastOnce())->method('addAttributeToSelect')->willReturnSelf(); $addressCollection->expects($this->atLeastOnce())->method('getIterator') ->willReturn($addresses); $addressCollection->expects($this->atLeastOnce())->method('getItems') ->willReturn($addresses); $this->addressesFactory->expects($this->atLeastOnce())->method('create')->willReturn($addressCollection); $customerDataObject = $this->getMockForAbstractClass(CustomerInterface::class); $this->customerDataFactory->expects($this->atLeastOnce())->method('create')->willReturn($customerDataObject); $this->dataObjectHelper->expects($this->atLeastOnce())->method('populateWithArray') ->with($customerDataObject, $this->_model->getData(), CustomerInterface::class) ->willReturnSelf(); $customerDataObject->expects($this->atLeastOnce())->method('setAddresses') ->with([$addressDataModel, $addressDataModel]) ->willReturnSelf(); $customerDataObject->expects($this->atLeastOnce())->method('setId')->with($customerId)->willReturnSelf(); $this->_model->getDataModel(); $this->assertEquals($customerDataObject, $this->_model->getDataModel()); } /** * Check getRandomConfirmationKey use cryptographically secure function * * @return void */ public function testGetRandomConfirmationKey() : void { $this->mathRandom ->expects($this->once()) ->method('getRandomString') ->with(32) ->willReturn('random_string'); $this->_model->getRandomConfirmationKey(); } }