353 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			353 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
declare(strict_types=1);
 | 
						|
 | 
						|
namespace Magento\Customer\Controller\Account;
 | 
						|
 | 
						|
use Magento\Customer\Api\CustomerRepositoryInterface;
 | 
						|
use Magento\Customer\Api\Data\CustomerInterface;
 | 
						|
use Magento\Customer\Model\CustomerRegistry;
 | 
						|
use Magento\Customer\Model\Delegation\Storage as DelegatedStorage;
 | 
						|
use Magento\Framework\App\Http;
 | 
						|
use Magento\Framework\App\Request\Http as HttpRequest;
 | 
						|
use Magento\Framework\Exception\NoSuchEntityException;
 | 
						|
use Magento\Framework\Message\MessageInterface;
 | 
						|
use Magento\Framework\Stdlib\CookieManagerInterface;
 | 
						|
use Magento\Framework\UrlInterface;
 | 
						|
use Magento\Sales\Model\Order;
 | 
						|
use Magento\Sales\Model\Order\Item as OrderItem;
 | 
						|
use Magento\Store\Model\StoreManagerInterface;
 | 
						|
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
 | 
						|
use Magento\TestFramework\Request;
 | 
						|
use Magento\TestFramework\TestCase\AbstractController;
 | 
						|
use Magento\Theme\Controller\Result\MessagePlugin;
 | 
						|
 | 
						|
/**
 | 
						|
 * Tests from customer account create post action.
 | 
						|
 *
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class CreatePostTest extends AbstractController
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var TransportBuilderMock
 | 
						|
     */
 | 
						|
    private $transportBuilderMock;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var StoreManagerInterface
 | 
						|
     */
 | 
						|
    private $storeManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CustomerRepositoryInterface
 | 
						|
     */
 | 
						|
    private $customerRepository;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CustomerRegistry
 | 
						|
     */
 | 
						|
    private $customerRegistry;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var CookieManagerInterface
 | 
						|
     */
 | 
						|
    private $cookieManager;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @var UrlInterface
 | 
						|
     */
 | 
						|
    private $urlBuilder;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritdoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        parent::setUp();
 | 
						|
 | 
						|
        $this->transportBuilderMock = $this->_objectManager->get(TransportBuilderMock::class);
 | 
						|
        $this->storeManager = $this->_objectManager->get(StoreManagerInterface::class);
 | 
						|
        $this->customerRepository = $this->_objectManager->get(CustomerRepositoryInterface::class);
 | 
						|
        $this->customerRegistry = $this->_objectManager->get(CustomerRegistry::class);
 | 
						|
        $this->cookieManager = $this->_objectManager->get(CookieManagerInterface::class);
 | 
						|
        $this->urlBuilder = $this->_objectManager->get(UrlInterface::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Tests that without form key user account won't be created
 | 
						|
     * and user will be redirected on account creation page again.
 | 
						|
     *
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testNoFormKeyCreatePostAction(): void
 | 
						|
    {
 | 
						|
        $this->fillRequestWithAccountData('test1@email.com');
 | 
						|
        $this->getRequest()->setPostValue('form_key', null);
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
 | 
						|
        $this->assertCustomerNotExists('test1@email.com');
 | 
						|
        $this->assertRedirect($this->stringEndsWith('customer/account/create/'));
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->stringContains((string)__('Invalid Form Key. Please refresh the page.')),
 | 
						|
            MessageInterface::TYPE_ERROR
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Check that DateTime option is NOT changed after creating Customer account for which guest order was placed.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     * @magentoDataFixture Magento/Sales/_files/guest_order_with_product_and_custom_options.php
 | 
						|
     */
 | 
						|
    public function testCreateCustomerAccountAfterIssuingGuestOrder(): void
 | 
						|
    {
 | 
						|
        /** @var Order $order */
 | 
						|
        $order = $this->_objectManager->create(Order::class);
 | 
						|
        $order->loadByIncrementId('100000001');
 | 
						|
 | 
						|
        /** @var CustomerInterface $customer */
 | 
						|
        $customer = $this->_objectManager->create(CustomerInterface::class);
 | 
						|
 | 
						|
        /** @var DelegatedStorage $delegatedStorage */
 | 
						|
        $delegatedStorage = $this->_objectManager->get(DelegatedStorage::class);
 | 
						|
        $delegatedStorage->storeNewOperation($customer, ['__sales_assign_order_id' => $order->getId()]);
 | 
						|
 | 
						|
        $this->fillRequestWithAccountData('customer@example.com');
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
 | 
						|
        $this->assertRedirect($this->stringEndsWith('customer/account/'));
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual(
 | 
						|
                (string)__('Thank you for registering with %1.', $this->storeManager->getStore()->getFrontendName())
 | 
						|
            ),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
 | 
						|
        $expectedResult = [
 | 
						|
            'year' => '2021',
 | 
						|
            'month' => '9',
 | 
						|
            'day' => '9',
 | 
						|
            'hour' => '2',
 | 
						|
            'minute' => '2',
 | 
						|
            'day_part' => 'am',
 | 
						|
            'date_internal' => '2021-09-09 02:02:00',
 | 
						|
        ];
 | 
						|
        /** @var OrderItem $orderItem */
 | 
						|
        $orderItem = $order->getItemsCollection()->getFirstItem();
 | 
						|
        $actualResult = current($orderItem->getBuyRequest()->getOptions());
 | 
						|
        $this->assertIsArray($actualResult);
 | 
						|
        $this->assertEquals($expectedResult, $actualResult);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoConfigFixture current_website customer/create_account/confirm 0
 | 
						|
     * @magentoConfigFixture current_store customer/create_account/default_group 1
 | 
						|
     * @magentoConfigFixture current_store customer/create_account/generate_human_friendly_id 0
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testNoConfirmCreatePostAction(): void
 | 
						|
    {
 | 
						|
        $this->fillRequestWithAccountData('test1@email.com');
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
        $this->assertRedirect($this->stringEndsWith('customer/account/'));
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual(
 | 
						|
                (string)__('Thank you for registering with %1.', $this->storeManager->getStore()->getFrontendName())
 | 
						|
            ),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
        $customer = $this->customerRegistry->retrieveByEmail('test1@email.com');
 | 
						|
        //Assert customer group
 | 
						|
        $this->assertEquals(1, $customer->getDataModel()->getGroupId());
 | 
						|
        //Assert customer increment id generation
 | 
						|
        $this->assertNull($customer->getData('increment_id'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoConfigFixture current_website customer/create_account/confirm 0
 | 
						|
     * @magentoConfigFixture current_store customer/create_account/default_group 2
 | 
						|
     * @magentoConfigFixture current_store customer/create_account/generate_human_friendly_id 1
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testCreatePostWithCustomConfiguration(): void
 | 
						|
    {
 | 
						|
        $this->fillRequestWithAccountData('test@email.com');
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
        $this->assertRedirect($this->stringEndsWith('customer/account/'));
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual(
 | 
						|
                (string)__('Thank you for registering with %1.', $this->storeManager->getStore()->getFrontendName())
 | 
						|
            ),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
        $customer = $this->customerRegistry->retrieveByEmail('test@email.com');
 | 
						|
        //Assert customer group
 | 
						|
        $this->assertEquals(2, $customer->getDataModel()->getGroupId());
 | 
						|
        //Assert customer increment id generation
 | 
						|
        $this->assertNotNull($customer->getData('increment_id'));
 | 
						|
        $this->assertMatchesRegularExpression('/\d{8}/', $customer->getData('increment_id'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     * @magentoAppIsolation enabled
 | 
						|
     * @magentoConfigFixture current_website customer/create_account/confirm 1
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testWithConfirmCreatePostAction(): void
 | 
						|
    {
 | 
						|
        $email = 'test2@email.com';
 | 
						|
        $this->fillRequestWithAccountData($email);
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
        $this->assertRedirect($this->stringContains('customer/account/index/'));
 | 
						|
        $message = 'You must confirm your account.'
 | 
						|
            . ' Please check your email for the confirmation link or <a href="%1">click here</a> for a new link.';
 | 
						|
        $url = $this->urlBuilder->getUrl('customer/account/confirmation', ['_query' => ['email' => $email]]);
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual((string)__($message, $url)),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testExistingEmailCreatePostAction(): void
 | 
						|
    {
 | 
						|
        $this->fillRequestWithAccountData('customer@example.com');
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
        $this->assertRedirect($this->stringContains('customer/account/create/'));
 | 
						|
        $message = 'There is already an account with this email address.'
 | 
						|
            . ' If you are sure that it is your email address, <a href="%1">click here</a> '
 | 
						|
            . 'to get your password and access your account.';
 | 
						|
        $url = $this->urlBuilder->getUrl('customer/account/forgotpassword');
 | 
						|
        $this->assertSessionMessages($this->containsEqual((string)__($message, $url)), MessageInterface::TYPE_ERROR);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Register Customer with email confirmation.
 | 
						|
     *
 | 
						|
     * @magentoAppArea frontend
 | 
						|
     * @magentoConfigFixture current_website customer/create_account/confirm 1
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    public function testRegisterCustomerWithEmailConfirmation(): void
 | 
						|
    {
 | 
						|
        $email = 'test_example@email.com';
 | 
						|
        $this->fillRequestWithAccountData($email);
 | 
						|
        $this->dispatch('customer/account/createPost');
 | 
						|
        $this->assertRedirect($this->stringContains('customer/account/index/'));
 | 
						|
        $message = 'You must confirm your account.'
 | 
						|
            . ' Please check your email for the confirmation link or <a href="%1">click here</a> for a new link.';
 | 
						|
        $url = $this->urlBuilder->getUrl('customer/account/confirmation', ['_query' => ['email' => $email]]);
 | 
						|
        $this->assertSessionMessages($this->containsEqual((string)__($message, $url)), MessageInterface::TYPE_SUCCESS);
 | 
						|
        /** @var CustomerInterface $customer */
 | 
						|
        $customer = $this->customerRepository->get($email);
 | 
						|
        $confirmation = $customer->getConfirmation();
 | 
						|
        $sendMessage = $this->transportBuilderMock->getSentMessage();
 | 
						|
        $this->assertNotNull($sendMessage);
 | 
						|
        $rawMessage = $sendMessage->getBody()->getParts()[0]->getRawContent();
 | 
						|
        $this->assertStringContainsString(
 | 
						|
            (string)__(
 | 
						|
                'You must confirm your %customer_email email before you can sign in (link is only valid once):',
 | 
						|
                ['customer_email' => $email]
 | 
						|
            ),
 | 
						|
            $rawMessage
 | 
						|
        );
 | 
						|
        $this->assertStringContainsString(
 | 
						|
            sprintf('customer/account/confirm/?id=%s&key=%s', $customer->getId(), $confirmation),
 | 
						|
            $rawMessage
 | 
						|
        );
 | 
						|
        $this->resetRequest();
 | 
						|
        $this->getRequest()
 | 
						|
            ->setParam('id', $customer->getId())
 | 
						|
            ->setParam('key', $confirmation);
 | 
						|
        $this->dispatch('customer/account/confirm');
 | 
						|
        $this->assertRedirect($this->stringContains('customer/account/index/'));
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->containsEqual(
 | 
						|
                (string)__('Thank you for registering with %1.', $this->storeManager->getStore()->getFrontendName())
 | 
						|
            ),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
        $this->assertEmpty($this->customerRepository->get($email)->getConfirmation());
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Fills request with customer data.
 | 
						|
     *
 | 
						|
     * @param string $email
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    private function fillRequestWithAccountData(string $email): void
 | 
						|
    {
 | 
						|
        $this->getRequest()
 | 
						|
            ->setMethod(HttpRequest::METHOD_POST)
 | 
						|
            ->setParam(CustomerInterface::FIRSTNAME, 'firstname1')
 | 
						|
            ->setParam(CustomerInterface::LASTNAME, 'lastname1')
 | 
						|
            ->setParam(CustomerInterface::EMAIL, $email)
 | 
						|
            ->setParam('password', '_Password1')
 | 
						|
            ->setParam('password_confirmation', '_Password1')
 | 
						|
            ->setParam('telephone', '5123334444')
 | 
						|
            ->setParam('street', ['1234 fake street', ''])
 | 
						|
            ->setParam('city', 'Austin')
 | 
						|
            ->setParam('postcode', '78701')
 | 
						|
            ->setParam('country_id', 'US')
 | 
						|
            ->setParam('default_billing', '1')
 | 
						|
            ->setParam('default_shipping', '1')
 | 
						|
            ->setParam('is_subscribed', '0')
 | 
						|
            ->setPostValue('create_address', true);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Asserts that customer does not exists.
 | 
						|
     *
 | 
						|
     * @param string $email
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    private function assertCustomerNotExists(string $email): void
 | 
						|
    {
 | 
						|
        $this->expectException(NoSuchEntityException::class);
 | 
						|
        $this->expectExceptionMessage(
 | 
						|
            (string)__(
 | 
						|
                'No such entity with %fieldName = %fieldValue, %field2Name = %field2Value',
 | 
						|
                [
 | 
						|
                    'fieldName' => 'email',
 | 
						|
                    'fieldValue' => $email,
 | 
						|
                    'field2Name' => 'websiteId',
 | 
						|
                    'field2Value' => 1
 | 
						|
                ]
 | 
						|
            )
 | 
						|
        );
 | 
						|
        $this->assertNull($this->customerRepository->get($email));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Clears request.
 | 
						|
     *
 | 
						|
     * @return void
 | 
						|
     */
 | 
						|
    protected function resetRequest(): void
 | 
						|
    {
 | 
						|
        parent::resetRequest();
 | 
						|
        $this->cookieManager->deleteCookie(MessagePlugin::MESSAGES_COOKIES_NAME);
 | 
						|
        $this->_objectManager->removeSharedInstance(Http::class);
 | 
						|
        $this->_objectManager->removeSharedInstance(Request::class);
 | 
						|
    }
 | 
						|
}
 |