861 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			861 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Magento\Customer\Model;
 | 
						|
 | 
						|
use Magento\Customer\Api\AccountManagementInterface;
 | 
						|
use Magento\Customer\Api\AddressRepositoryInterface;
 | 
						|
use Magento\Customer\Api\Data\AddressInterface;
 | 
						|
use Magento\Framework\App\Config\ScopeConfigInterface;
 | 
						|
use Magento\Framework\Exception\InputException;
 | 
						|
use Magento\Framework\Exception\NoSuchEntityException;
 | 
						|
use Magento\Framework\Exception\State\ExpiredException;
 | 
						|
use Magento\Framework\Reflection\DataObjectProcessor;
 | 
						|
use Magento\Framework\Session\SessionManagerInterface;
 | 
						|
use Magento\Framework\Stdlib\DateTime;
 | 
						|
use Magento\Framework\Url as UrlBuilder;
 | 
						|
use Magento\Store\Model\ScopeInterface;
 | 
						|
use Magento\Store\Model\StoreManagerInterface;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap;
 | 
						|
 | 
						|
/**
 | 
						|
 * Integration test for service layer \Magento\Customer\Model\AccountManagementTest
 | 
						|
 *
 | 
						|
 * @SuppressWarnings(PHPMD.TooManyMethods)
 | 
						|
 * @SuppressWarnings(PHPMD.ExcessivePublicCount)
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 * @magentoAppArea frontend
 | 
						|
 */
 | 
						|
class AccountManagementTest extends \PHPUnit\Framework\TestCase
 | 
						|
{
 | 
						|
    /** @var AccountManagementInterface */
 | 
						|
    private $accountManagement;
 | 
						|
 | 
						|
    /** @var AddressRepositoryInterface needed to setup tests */
 | 
						|
    private $addressRepository;
 | 
						|
 | 
						|
    /** @var \Magento\Framework\ObjectManagerInterface */
 | 
						|
    private $objectManager;
 | 
						|
 | 
						|
    /** @var AddressInterface[] */
 | 
						|
    private $_expectedAddresses;
 | 
						|
 | 
						|
    /** @var \Magento\Customer\Api\Data\AddressInterfaceFactory */
 | 
						|
    private $addressFactory;
 | 
						|
 | 
						|
    /** @var DataObjectProcessor */
 | 
						|
    private $dataProcessor;
 | 
						|
 | 
						|
    /** @var  \Magento\Framework\Api\DataObjectHelper */
 | 
						|
    protected $dataObjectHelper;
 | 
						|
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        $this->objectManager = Bootstrap::getObjectManager();
 | 
						|
        $this->accountManagement = $this->objectManager
 | 
						|
            ->create(\Magento\Customer\Api\AccountManagementInterface::class);
 | 
						|
        $this->addressRepository =
 | 
						|
            $this->objectManager->create(\Magento\Customer\Api\AddressRepositoryInterface::class);
 | 
						|
 | 
						|
        $this->addressFactory = $this->objectManager->create(\Magento\Customer\Api\Data\AddressInterfaceFactory::class);
 | 
						|
 | 
						|
        $regionFactory = $this->objectManager->create(\Magento\Customer\Api\Data\RegionInterfaceFactory::class);
 | 
						|
        $address = $this->addressFactory->create();
 | 
						|
        $address->setId('1')
 | 
						|
            ->setCountryId('US')
 | 
						|
            ->setCustomerId('1')
 | 
						|
            ->setPostcode('75477')
 | 
						|
            ->setRegion(
 | 
						|
                $regionFactory->create()->setRegionCode('AL')->setRegion('Alabama')->setRegionId(1)
 | 
						|
            )
 | 
						|
            ->setRegionId(1)
 | 
						|
            ->setCompany('CompanyName')
 | 
						|
            ->setStreet(['Green str, 67'])
 | 
						|
            ->setTelephone('3468676')
 | 
						|
            ->setCity('CityM')
 | 
						|
            ->setFirstname('John')
 | 
						|
            ->setLastname('Smith')
 | 
						|
            ->setIsDefaultShipping(true)
 | 
						|
            ->setIsDefaultBilling(true);
 | 
						|
 | 
						|
        $address2 = $this->addressFactory->create();
 | 
						|
        $address2->setId('2')
 | 
						|
            ->setCountryId('US')
 | 
						|
            ->setCustomerId('1')
 | 
						|
            ->setPostcode('47676')
 | 
						|
            ->setRegion(
 | 
						|
                $regionFactory->create()->setRegionCode('AL')->setRegion('Alabama')->setRegionId(1)
 | 
						|
            )
 | 
						|
            ->setRegionId(1)
 | 
						|
            ->setCompany('Company')
 | 
						|
            ->setStreet(['Black str, 48'])
 | 
						|
            ->setCity('CityX')
 | 
						|
            ->setTelephone('3234676')
 | 
						|
            ->setFirstname('John')
 | 
						|
            ->setLastname('Smith');
 | 
						|
 | 
						|
        $this->_expectedAddresses = [$address, $address2];
 | 
						|
 | 
						|
        $this->dataProcessor = $this->objectManager
 | 
						|
            ->create(\Magento\Framework\Reflection\DataObjectProcessor::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Clean up shared dependencies
 | 
						|
     */
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        $customerRegistry = $this->objectManager->get(\Magento\Customer\Model\CustomerRegistry::class);
 | 
						|
        $addressRegistry = $this->objectManager->get(\Magento\Customer\Model\AddressRegistry::class);
 | 
						|
        //Cleanup customer from registry
 | 
						|
        $customerRegistry->remove(1);
 | 
						|
        $addressRegistry->remove(1);
 | 
						|
        $addressRegistry->remove(2);
 | 
						|
        $resourceModel = $this->objectManager->get(\Magento\Customer\Model\ResourceModel\Visitor::class);
 | 
						|
        $resourceModel->getConnection()->delete($resourceModel->getMainTable());
 | 
						|
        parent::tearDown();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testLogin()
 | 
						|
    {
 | 
						|
        // Customer email and password are pulled from the fixture customer.php
 | 
						|
        $customer = $this->accountManagement->authenticate('customer@example.com', 'password');
 | 
						|
 | 
						|
        $this->assertSame('customer@example.com', $customer->getEmail());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testLoginWrongPassword()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\InvalidEmailOrPasswordException::class);
 | 
						|
 | 
						|
        // Customer email and password are pulled from the fixture customer.php
 | 
						|
        $this->accountManagement->authenticate('customer@example.com', 'wrongPassword');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test attempt to login with wrong user name.
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testLoginWrongUsername()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\InvalidEmailOrPasswordException::class);
 | 
						|
        $this->expectExceptionMessage('Invalid login or password.');
 | 
						|
 | 
						|
        // Customer email and password are pulled from the fixture customer.php
 | 
						|
        $this->accountManagement->authenticate('non_existing_user', '_Password123');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testChangePassword()
 | 
						|
    {
 | 
						|
        /** @var SessionManagerInterface $session */
 | 
						|
        $session = $this->objectManager->get(SessionManagerInterface::class);
 | 
						|
        $customerId = 1;
 | 
						|
        $time = time();
 | 
						|
 | 
						|
        $session->start();
 | 
						|
 | 
						|
        // open new session
 | 
						|
        $activeSessionId = uniqid("active-$time-");
 | 
						|
        $this->startNewSession($activeSessionId);
 | 
						|
        $activeVisitor = $this->createVisitorSession($activeSessionId, $customerId);
 | 
						|
        $session->setVisitorData($activeVisitor->getData());
 | 
						|
 | 
						|
        // open new session
 | 
						|
        $currentSessionId = uniqid("current-$time-");
 | 
						|
        $this->startNewSession($currentSessionId);
 | 
						|
        $currentVisitor = $this->createVisitorSession($currentSessionId, $customerId);
 | 
						|
        $session->setVisitorData($currentVisitor->getData());
 | 
						|
 | 
						|
        $this->assertNull($this->getCustomerCutoff($customerId), 'Customer cutoff session should not be set.');
 | 
						|
        // change password
 | 
						|
        $this->accountManagement->changePassword('customer@example.com', 'password', 'new_Password123');
 | 
						|
        $this->assertEquals(
 | 
						|
            $currentSessionId,
 | 
						|
            $session->getSessionId(),
 | 
						|
            'Current session was renewed'
 | 
						|
        );
 | 
						|
 | 
						|
        // open customer active session
 | 
						|
        $this->startNewSession($activeSessionId);
 | 
						|
        $this->assertNotNull($this->getCustomerCutoff($customerId), 'Customer cutoff session should be set.');
 | 
						|
        // Make sure current visitor session is updated.
 | 
						|
        $this->assertLessThanOrEqual(
 | 
						|
            $this->getCustomerCutoff($customerId),
 | 
						|
            $this->getVisitorCreatedAt($activeVisitor->getId())
 | 
						|
        );
 | 
						|
        $this->assertGreaterThan(
 | 
						|
            $this->getCustomerCutoff($customerId),
 | 
						|
            $this->getVisitorCreatedAt($currentVisitor->getId())
 | 
						|
        );
 | 
						|
 | 
						|
        $this->accountManagement->authenticate('customer@example.com', 'new_Password123');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testChangePasswordWrongPassword()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\InvalidEmailOrPasswordException::class);
 | 
						|
        $this->expectExceptionMessage('The password doesn\'t match this account. Verify the password and try again.');
 | 
						|
 | 
						|
        $this->accountManagement->changePassword('customer@example.com', 'wrongPassword', 'new_Password123');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test change password on the wrong user
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testChangePasswordWrongUser()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\InvalidEmailOrPasswordException::class);
 | 
						|
        $this->expectExceptionMessage('Invalid login or password.');
 | 
						|
 | 
						|
        $this->accountManagement->changePassword('wrong.email@example.com', '_Password123', 'new_Password123');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     */
 | 
						|
    public function testActivateAccount()
 | 
						|
    {
 | 
						|
        /** @var \Magento\Customer\Model\Customer $customerModel */
 | 
						|
        $customerModel = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
 | 
						|
        $customerModel->load(1);
 | 
						|
        // Assert in just one test that the fixture is working
 | 
						|
        $this->assertNotNull($customerModel->getConfirmation(), 'New customer needs to be confirmed');
 | 
						|
 | 
						|
        $this->accountManagement->activate($customerModel->getEmail(), $customerModel->getConfirmation());
 | 
						|
 | 
						|
        $customerModel = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
 | 
						|
        $customerModel->load(1);
 | 
						|
        $this->assertNull($customerModel->getConfirmation(), 'Customer should be considered confirmed now');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
 | 
						|
     */
 | 
						|
    public function testActivateCustomerConfirmationKeyWrongKey()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\State\InputMismatchException::class);
 | 
						|
 | 
						|
        /** @var \Magento\Customer\Model\Customer $customerModel */
 | 
						|
        $customerModel = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
 | 
						|
        $customerModel->load(1);
 | 
						|
        $key = $customerModel->getConfirmation();
 | 
						|
 | 
						|
        try {
 | 
						|
            $this->accountManagement->activate($customerModel->getEmail(), $key . $key);
 | 
						|
            $this->fail('Expected exception was not thrown');
 | 
						|
        } catch (InputException $ie) {
 | 
						|
            $this->assertEquals('', $ie->getMessage());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
 | 
						|
     */
 | 
						|
    public function testActivateCustomerWrongAccount()
 | 
						|
    {
 | 
						|
        /** @var \Magento\Customer\Model\Customer $customerModel */
 | 
						|
        $customerModel = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
 | 
						|
        $customerModel->load(1);
 | 
						|
        $key = $customerModel->getConfirmation();
 | 
						|
        try {
 | 
						|
            $this->accountManagement->activate('1234' . $customerModel->getEmail(), $key);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (NoSuchEntityException $nsee) {
 | 
						|
            $this->assertEquals(
 | 
						|
                'No such entity with email = 1234customer@needAconfirmation.com, websiteId = 1',
 | 
						|
                $nsee->getMessage()
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     */
 | 
						|
    public function testActivateCustomerAlreadyActive()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\State\InvalidTransitionException::class);
 | 
						|
 | 
						|
        /** @var \Magento\Customer\Model\Customer $customerModel */
 | 
						|
        $customerModel = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
 | 
						|
        $customerModel->load(1);
 | 
						|
        $key = $customerModel->getConfirmation();
 | 
						|
        $this->accountManagement->activate($customerModel->getEmail(), $key);
 | 
						|
        // activate it one more time to produce an exception
 | 
						|
        $this->accountManagement->activate($customerModel->getEmail(), $key);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testValidateResetPasswordLinkToken()
 | 
						|
    {
 | 
						|
        $this->setResetPasswordData('token', 'Y-m-d H:i:s');
 | 
						|
        $this->accountManagement->validateResetPasswordLinkToken(1, 'token');
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testValidateResetPasswordLinkTokenExpired()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\State\ExpiredException::class);
 | 
						|
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $this->setResetPasswordData($resetToken, '1970-01-01 00:00:00');
 | 
						|
        $this->accountManagement->validateResetPasswordLinkToken(1, $resetToken);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testValidateResetPasswordLinkTokenInvalid()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $invalidToken = '0';
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
        try {
 | 
						|
            $this->accountManagement->validateResetPasswordLinkToken(1, $invalidToken);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (InputException $ie) {
 | 
						|
            $this->assertEquals('"%fieldName" is required. Enter and try again.', $ie->getRawMessage());
 | 
						|
            $this->assertEquals('"resetPasswordLinkToken" is required. Enter and try again.', $ie->getMessage());
 | 
						|
            $this->assertEquals('"resetPasswordLinkToken" is required. Enter and try again.', $ie->getLogMessage());
 | 
						|
            $this->assertEmpty($ie->getErrors());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testValidateResetPasswordLinkTokenWrongUser()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
 | 
						|
        try {
 | 
						|
            $this->accountManagement->validateResetPasswordLinkToken(4200, $resetToken);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (NoSuchEntityException $nsee) {
 | 
						|
            $this->assertEquals('No such entity with customerId = 4200', $nsee->getMessage());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test for resetPassword() method when reset for the second time
 | 
						|
     *
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordTokenSecondTime()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\State\InputMismatchException::class);
 | 
						|
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $password = 'new_Password123';
 | 
						|
        $email = 'customer@example.com';
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
        $this->assertTrue($this->accountManagement->resetPassword($email, $resetToken, $password));
 | 
						|
        $this->accountManagement->resetPassword($email, $resetToken, $password);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testValidateResetPasswordLinkTokenEmpty()
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $this->accountManagement->validateResetPasswordLinkToken(1, '');
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (InputException $ie) {
 | 
						|
            $this->assertEquals('"%fieldName" is required. Enter and try again.', $ie->getRawMessage());
 | 
						|
            $this->assertEquals('"resetPasswordLinkToken" is required. Enter and try again.', $ie->getMessage());
 | 
						|
            $this->assertEquals('"resetPasswordLinkToken" is required. Enter and try again.', $ie->getLogMessage());
 | 
						|
            $this->assertEmpty($ie->getErrors());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testValidateResetPasswordLinkTokenInvalidId()
 | 
						|
    {
 | 
						|
        $token = 'randomStr123';
 | 
						|
        $this->setResetPasswordData($token, 'Y-m-d H:i:s');
 | 
						|
        $this->expectException(\Magento\Framework\Exception\InputException::class);
 | 
						|
        $this->accountManagement->validateResetPasswordLinkToken(0, $token);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPassword()
 | 
						|
    {
 | 
						|
        /** @var SessionManagerInterface $session */
 | 
						|
        $session = $this->objectManager->get(SessionManagerInterface::class);
 | 
						|
        $time = time();
 | 
						|
        $customerId = 1;
 | 
						|
 | 
						|
        $session->start();
 | 
						|
 | 
						|
        // open new session
 | 
						|
        $activeSessionId = uniqid("active-$time-");
 | 
						|
        $this->startNewSession($activeSessionId);
 | 
						|
        $activeVisitor = $this->createVisitorSession($activeSessionId, $customerId);
 | 
						|
        $session->setVisitorData($activeVisitor->getData());
 | 
						|
 | 
						|
        // open new session
 | 
						|
        $currentSessionId = uniqid("current-$time-");
 | 
						|
        $this->startNewSession($currentSessionId);
 | 
						|
        $currentVisitor = $this->createVisitorSession($currentSessionId, $customerId);
 | 
						|
        $session->setVisitorData($currentVisitor->getData());
 | 
						|
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $password = 'new_Password123';
 | 
						|
 | 
						|
        $this->assertNull($this->getCustomerCutoff($customerId), 'Customer cutoff session should not be set.');
 | 
						|
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
        $this->assertTrue($this->accountManagement->resetPassword('customer@example.com', $resetToken, $password));
 | 
						|
 | 
						|
        $this->assertEquals(
 | 
						|
            $currentSessionId,
 | 
						|
            $session->getSessionId(),
 | 
						|
            'Current session was renewed'
 | 
						|
        );
 | 
						|
 | 
						|
        // open customer active session
 | 
						|
        $this->startNewSession($activeSessionId);
 | 
						|
        $this->assertNotNull($this->getCustomerCutoff($customerId), 'Customer cutoff session should be set.');
 | 
						|
        // Make sure current visitor session is updated.
 | 
						|
        $this->assertLessThanOrEqual(
 | 
						|
            $this->getCustomerCutoff($customerId),
 | 
						|
            $this->getVisitorCreatedAt($activeVisitor->getId())
 | 
						|
        );
 | 
						|
        $this->assertGreaterThan(
 | 
						|
            $this->getCustomerCutoff($customerId),
 | 
						|
            $this->getVisitorCreatedAt($currentVisitor->getId())
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordTokenExpired()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $password = 'new_Password123';
 | 
						|
 | 
						|
        $this->setResetPasswordData($resetToken, '1970-01-01 00:00:00');
 | 
						|
        try {
 | 
						|
            $this->accountManagement->resetPassword('customer@example.com', $resetToken, $password);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (ExpiredException $e) {
 | 
						|
            $this->assertEquals('The password token is expired. Reset and try again.', $e->getMessage());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     */
 | 
						|
    public function testResetPasswordTokenInvalid()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $invalidToken = '0';
 | 
						|
        $password = 'new_Password123';
 | 
						|
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
        try {
 | 
						|
            $this->accountManagement->resetPassword('customer@example.com', $invalidToken, $password);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (InputException $ie) {
 | 
						|
            $this->assertEquals('"%fieldName" is required. Enter and try again.', $ie->getRawMessage());
 | 
						|
            $this->assertEquals('"resetPasswordLinkToken" is required. Enter and try again.', $ie->getMessage());
 | 
						|
            $this->assertEquals('"resetPasswordLinkToken" is required. Enter and try again.', $ie->getLogMessage());
 | 
						|
            $this->assertEmpty($ie->getErrors());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordTokenWrongUser()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $password = 'new_Password123';
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
        try {
 | 
						|
            $this->accountManagement->resetPassword('invalid-customer@example.com', $resetToken, $password);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (NoSuchEntityException $nsee) {
 | 
						|
            $this->assertEquals(
 | 
						|
                'No such entity with email = invalid-customer@example.com, websiteId = 1',
 | 
						|
                $nsee->getMessage()
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordTokenInvalidUserEmail()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $password = 'new_Password123';
 | 
						|
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
 | 
						|
        try {
 | 
						|
            $this->accountManagement->resetPassword('invalid', $resetToken, $password);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (NoSuchEntityException $e) {
 | 
						|
            $this->assertEquals('No such entity with email = invalid, websiteId = 1', $e->getMessage());
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordWithoutEmail()
 | 
						|
    {
 | 
						|
        $resetToken = 'lsdj579slkj5987slkj595lkj';
 | 
						|
        $password = 'new_Password123';
 | 
						|
        $this->setResetPasswordData($resetToken, 'Y-m-d H:i:s');
 | 
						|
        $this->expectException(InputException::class);
 | 
						|
        $this->accountManagement->resetPassword(null, $resetToken, $password);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
 | 
						|
     */
 | 
						|
    public function testResendConfirmation()
 | 
						|
    {
 | 
						|
        $this->accountManagement->resendConfirmation('customer@needAconfirmation.com', 1);
 | 
						|
        //TODO assert
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/inactive_customer.php
 | 
						|
     */
 | 
						|
    public function testResendConfirmationBadWebsiteId()
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $this->accountManagement->resendConfirmation('customer@needAconfirmation.com', 'notAWebsiteId');
 | 
						|
        } catch (NoSuchEntityException $nsee) {
 | 
						|
            $this->assertEquals(
 | 
						|
                'No such entity with email = customer@needAconfirmation.com, websiteId = notAWebsiteId',
 | 
						|
                $nsee->getMessage()
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResendConfirmationNoEmail()
 | 
						|
    {
 | 
						|
        try {
 | 
						|
            $this->accountManagement->resendConfirmation('wrongemail@example.com', 1);
 | 
						|
            $this->fail('Expected exception not thrown.');
 | 
						|
        } catch (NoSuchEntityException $nsee) {
 | 
						|
            $this->assertEquals(
 | 
						|
                'No such entity with email = wrongemail@example.com, websiteId = 1',
 | 
						|
                $nsee->getMessage()
 | 
						|
            );
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResendConfirmationNotNeeded()
 | 
						|
    {
 | 
						|
        $this->expectException(\Magento\Framework\Exception\State\InvalidTransitionException::class);
 | 
						|
 | 
						|
        $this->accountManagement->resendConfirmation('customer@example.com', 1);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testIsEmailAvailable()
 | 
						|
    {
 | 
						|
        $scopeConfig = $this->objectManager->get(ScopeConfigInterface::class);
 | 
						|
        $guestLoginConfig = $scopeConfig->getValue(
 | 
						|
            AccountManagement::GUEST_CHECKOUT_LOGIN_OPTION_SYS_CONFIG,
 | 
						|
            ScopeInterface::SCOPE_WEBSITE,
 | 
						|
            1
 | 
						|
        );
 | 
						|
 | 
						|
        if (!$guestLoginConfig) {
 | 
						|
            $this->assertTrue($this->accountManagement->isEmailAvailable('customer@example.com', 1));
 | 
						|
        } else {
 | 
						|
            $this->assertFalse($this->accountManagement->isEmailAvailable('customer@example.com', 1));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testIsEmailAvailableNoWebsiteSpecified()
 | 
						|
    {
 | 
						|
        $scopeConfig = $this->objectManager->get(ScopeConfigInterface::class);
 | 
						|
        $guestLoginConfig = $scopeConfig->getValue(
 | 
						|
            AccountManagement::GUEST_CHECKOUT_LOGIN_OPTION_SYS_CONFIG,
 | 
						|
            ScopeInterface::SCOPE_WEBSITE,
 | 
						|
            1
 | 
						|
        );
 | 
						|
 | 
						|
        if (!$guestLoginConfig) {
 | 
						|
            $this->assertTrue($this->accountManagement->isEmailAvailable('customer@example.com'));
 | 
						|
        } else {
 | 
						|
            $this->assertFalse($this->accountManagement->isEmailAvailable('customer@example.com'));
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testIsEmailAvailableNoWebsiteSpecifiedNonExistent()
 | 
						|
    {
 | 
						|
        $this->assertTrue($this->accountManagement->isEmailAvailable('nonexistent@example.com'));
 | 
						|
    }
 | 
						|
 | 
						|
    public function testIsEmailAvailableNonExistentEmail()
 | 
						|
    {
 | 
						|
        $this->assertTrue($this->accountManagement->isEmailAvailable('nonexistent@example.com', 1));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture  Magento/Customer/_files/customer.php
 | 
						|
     * @magentoDataFixture  Magento/Customer/_files/customer_address.php
 | 
						|
     * @magentoDataFixture  Magento/Customer/_files/customer_two_addresses.php
 | 
						|
     */
 | 
						|
    public function testGetDefaultBillingAddress()
 | 
						|
    {
 | 
						|
        $customerId = 1;
 | 
						|
        $address = $this->accountManagement->getDefaultBillingAddress($customerId);
 | 
						|
 | 
						|
        $expected = $this->dataProcessor->buildOutputDataArray(
 | 
						|
            $this->_expectedAddresses[0],
 | 
						|
            \Magento\Customer\Api\Data\AddressInterface::class
 | 
						|
        );
 | 
						|
        $result = $this->dataProcessor->buildOutputDataArray(
 | 
						|
            $address,
 | 
						|
            \Magento\Customer\Api\Data\AddressInterface::class
 | 
						|
        );
 | 
						|
        /*
 | 
						|
         * TODO : Data builder / populateWithArray currently does not detect
 | 
						|
         * array type and returns street as string instead of array. Need to fix this.
 | 
						|
         */
 | 
						|
        unset($expected[AddressInterface::STREET]);
 | 
						|
        unset($result[AddressInterface::STREET]);
 | 
						|
        $this->assertEquals($expected, $result);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture  Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testSaveNewAddressDefaults()
 | 
						|
    {
 | 
						|
        $customerId = 1;
 | 
						|
        /** @var $addressShipping \Magento\Customer\Api\Data\AddressInterface */
 | 
						|
        $addressShipping = $this->_expectedAddresses[0]->setId(null);
 | 
						|
        $addressShipping->setIsDefaultShipping(true)->setIsDefaultBilling(false)->setCustomerId($customerId);
 | 
						|
        //TODO : Will be fixed as part of fixing populate. For now Region is set as Data Object instead of array
 | 
						|
        $addressShipping->setRegion($this->_expectedAddresses[0]->getRegion());
 | 
						|
 | 
						|
        /** @var $addressBilling \Magento\Customer\Api\Data\AddressInterface */
 | 
						|
        $addressBilling = $this->_expectedAddresses[1]->setId(null);
 | 
						|
        $addressBilling->setIsDefaultBilling(true)->setIsDefaultShipping(false)->setCustomerId($customerId);
 | 
						|
        //TODO : Will be fixed as part of fixing populate
 | 
						|
        $addressBilling->setRegion($this->_expectedAddresses[1]->getRegion());
 | 
						|
 | 
						|
        $addressShippingExpected = $this->addressRepository->save($addressShipping);
 | 
						|
        $addressBillingExpected = $this->addressRepository->save($addressBilling);
 | 
						|
        /** @var \Magento\Customer\Model\CustomerRegistry $customerRegistry */
 | 
						|
        $customerRegistry = $this->objectManager->get(\Magento\Customer\Model\CustomerRegistry::class);
 | 
						|
        $customerRegistry->remove(1);
 | 
						|
        // Call api under test
 | 
						|
        $shippingResponse = $this->accountManagement->getDefaultShippingAddress($customerId);
 | 
						|
        $billingResponse = $this->accountManagement->getDefaultBillingAddress($customerId);
 | 
						|
 | 
						|
        // Verify if the new Shipping address created is same as returned by the api under test :
 | 
						|
        // \Magento\Customer\Api\AccountManagementInterface::getDefaultShippingAddress
 | 
						|
        $addressShippingExpected = $this->dataProcessor->buildOutputDataArray(
 | 
						|
            $addressShippingExpected,
 | 
						|
            \Magento\Customer\Api\Data\AddressInterface::class
 | 
						|
        );
 | 
						|
        $shippingResponse = $this->dataProcessor->buildOutputDataArray(
 | 
						|
            $shippingResponse,
 | 
						|
            \Magento\Customer\Api\Data\AddressInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        // Response should have this set since we save as default shipping
 | 
						|
        $addressShippingExpected[AddressInterface::DEFAULT_SHIPPING] = true;
 | 
						|
        $this->assertEquals($addressShippingExpected, $shippingResponse);
 | 
						|
 | 
						|
        // Verify if the new Billing address created is same as returned by the api under test :
 | 
						|
        // \Magento\Customer\Api\AccountManagementInterface::getDefaultShippingAddress
 | 
						|
        $addressBillingExpected = $this->dataProcessor->buildOutputDataArray(
 | 
						|
            $addressBillingExpected,
 | 
						|
            \Magento\Customer\Api\Data\AddressInterface::class
 | 
						|
        );
 | 
						|
        $billingResponse = $this->dataProcessor->buildOutputDataArray(
 | 
						|
            $billingResponse,
 | 
						|
            \Magento\Customer\Api\Data\AddressInterface::class
 | 
						|
        );
 | 
						|
 | 
						|
        // Response should have this set since we save as default billing
 | 
						|
        $addressBillingExpected[AddressInterface::DEFAULT_BILLING] = true;
 | 
						|
        $this->assertEquals($addressBillingExpected, $billingResponse);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture  Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testGetDefaultAddressesForNonExistentAddress()
 | 
						|
    {
 | 
						|
        $customerId = 1;
 | 
						|
        $this->assertNull($this->accountManagement->getDefaultBillingAddress($customerId));
 | 
						|
        $this->assertNull($this->accountManagement->getDefaultShippingAddress($customerId));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test reset password for customer on second website when shared account is enabled
 | 
						|
     *
 | 
						|
     * When customer from second website initiate reset password on first website
 | 
						|
     * global scope should not be reinited to customer scope
 | 
						|
     *
 | 
						|
     * @magentoConfigFixture current_store customer/account_share/scope 0
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer_for_second_website.php
 | 
						|
     */
 | 
						|
    public function testInitiatePasswordResetForCustomerOnSecondWebsite()
 | 
						|
    {
 | 
						|
        $storeManager = $this->objectManager->get(StoreManagerInterface::class);
 | 
						|
        $store = $storeManager->getStore();
 | 
						|
 | 
						|
        $this->accountManagement->initiatePasswordReset(
 | 
						|
            'customer@example.com',
 | 
						|
            AccountManagement::EMAIL_RESET,
 | 
						|
            $storeManager->getWebsite()->getId()
 | 
						|
        );
 | 
						|
 | 
						|
        $this->assertEquals($store->getId(), $storeManager->getStore()->getId());
 | 
						|
        $urlBuilder = $this->objectManager->get(UrlBuilder::class);
 | 
						|
        // to init scope if it has not inited yet
 | 
						|
        $urlBuilder->setScope($urlBuilder->getData('scope'));
 | 
						|
        $scope = $urlBuilder->getData('scope');
 | 
						|
        $this->assertEquals($store->getId(), $scope->getId());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Set Rp data to Customer in fixture
 | 
						|
     *
 | 
						|
     * @param $resetToken
 | 
						|
     * @param $date
 | 
						|
     * @param int $customerIdFromFixture Which customer to use.
 | 
						|
     * @throws \Exception
 | 
						|
     */
 | 
						|
    protected function setResetPasswordData(
 | 
						|
        $resetToken,
 | 
						|
        $date,
 | 
						|
        int $customerIdFromFixture = 1
 | 
						|
    ) {
 | 
						|
        /** @var \Magento\Customer\Model\Customer $customerModel */
 | 
						|
        $customerModel = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
 | 
						|
        $customerModel->load($customerIdFromFixture);
 | 
						|
        $customerModel->setRpToken($resetToken);
 | 
						|
        $customerModel->setRpTokenCreatedAt(date($date));
 | 
						|
        $customerModel->save();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the customers cutoff value
 | 
						|
     *
 | 
						|
     * @param int $customerId
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    private function getCustomerCutoff(
 | 
						|
        int $customerId
 | 
						|
    ) {
 | 
						|
        $customerModel = $this->objectManager->get(\Magento\Customer\Model\ResourceModel\Customer::class);
 | 
						|
        return $customerModel->findSessionCutOff($customerId);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Returns the visitors created at value
 | 
						|
     *
 | 
						|
     * @param int $visitorId
 | 
						|
     * @return mixed
 | 
						|
     */
 | 
						|
    private function getVisitorCreatedAt(
 | 
						|
        int $visitorId
 | 
						|
    ) {
 | 
						|
        $visitorModel = $this->objectManager->get(\Magento\Customer\Model\ResourceModel\Visitor::class);
 | 
						|
        return $visitorModel->fetchCreatedAt($visitorId);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Starts a new session
 | 
						|
     *
 | 
						|
     * @param string $sessionId
 | 
						|
     */
 | 
						|
    private function startNewSession(string $sessionId): void
 | 
						|
    {
 | 
						|
        /** @var SessionManagerInterface $session */
 | 
						|
        $session = $this->objectManager->get(SessionManagerInterface::class);
 | 
						|
        // close session and cleanup session variable
 | 
						|
        $session->writeClose();
 | 
						|
        $session->clearStorage();
 | 
						|
        // open new session
 | 
						|
        $session->setSessionId($sessionId);
 | 
						|
        $session->start();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Creates a new visitor session
 | 
						|
     *
 | 
						|
     * @param string $sessionId
 | 
						|
     * @param int|null $customerId
 | 
						|
     * @return Visitor
 | 
						|
     * @throws \Exception
 | 
						|
     */
 | 
						|
    private function createVisitorSession(string $sessionId, ?int $customerId = null): Visitor
 | 
						|
    {
 | 
						|
        /** @var Visitor $visitor */
 | 
						|
        $visitor = Bootstrap::getObjectManager()->create(Visitor::class);
 | 
						|
        $visitor->setCustomerId($customerId);
 | 
						|
        $visitor->setSessionId($sessionId);
 | 
						|
        $visitor->setLastVisitAt((new \DateTime())->format(DateTime::DATETIME_PHP_FORMAT));
 | 
						|
        $visitor->save();
 | 
						|
        return $visitor;
 | 
						|
    }
 | 
						|
}
 |