306 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			306 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
<?php
 | 
						|
/**
 | 
						|
 * Copyright © Magento, Inc. All rights reserved.
 | 
						|
 * See COPYING.txt for license details.
 | 
						|
 */
 | 
						|
 | 
						|
namespace Magento\Customer\Controller\Adminhtml;
 | 
						|
 | 
						|
use Magento\Backend\Block\Template\Context;
 | 
						|
use Magento\Backend\Model\Session;
 | 
						|
use Magento\Customer\Api\CustomerNameGenerationInterface;
 | 
						|
use Magento\Customer\Api\CustomerRepositoryInterface;
 | 
						|
use Magento\Customer\Model\EmailNotification;
 | 
						|
use Magento\Framework\Acl\Builder;
 | 
						|
use Magento\Framework\App\Area;
 | 
						|
use Magento\Framework\Mail\Template\TransportBuilder;
 | 
						|
use Magento\Framework\Mail\TransportInterface;
 | 
						|
use Magento\Framework\Message\MessageInterface;
 | 
						|
use Magento\TestFramework\Bootstrap;
 | 
						|
use Magento\TestFramework\Helper\Bootstrap as BootstrapHelper;
 | 
						|
use Magento\Framework\App\Request\Http as HttpRequest;
 | 
						|
use Magento\TestFramework\TestCase\AbstractBackendController;
 | 
						|
use PHPUnit\Framework\MockObject\MockObject;
 | 
						|
 | 
						|
/**
 | 
						|
 * @magentoAppArea adminhtml
 | 
						|
 * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
 | 
						|
 */
 | 
						|
class IndexTest extends AbstractBackendController
 | 
						|
{
 | 
						|
    /**
 | 
						|
     * @var string
 | 
						|
     */
 | 
						|
    private $baseControllerUrl = 'backend/customer/index/';
 | 
						|
 | 
						|
    /** @var CustomerRepositoryInterface */
 | 
						|
    private $customerRepository;
 | 
						|
 | 
						|
    /** @var CustomerNameGenerationInterface */
 | 
						|
    private $customerViewHelper;
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function setUp(): void
 | 
						|
    {
 | 
						|
        parent::setUp();
 | 
						|
        $this->customerRepository = $this->_objectManager->get(CustomerRepositoryInterface::class);
 | 
						|
        $this->customerViewHelper = $this->_objectManager->get(CustomerNameGenerationInterface::class);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @inheritDoc
 | 
						|
     */
 | 
						|
    protected function tearDown(): void
 | 
						|
    {
 | 
						|
        /**
 | 
						|
         * Unset customer data
 | 
						|
         */
 | 
						|
        $this->_objectManager->get(Session::class)->setCustomerData(null);
 | 
						|
 | 
						|
        /**
 | 
						|
         * Unset messages
 | 
						|
         */
 | 
						|
        $this->_objectManager->get(Session::class)->getMessages(true);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Ensure that an email is sent during inlineEdit action
 | 
						|
     *
 | 
						|
     * @magentoConfigFixture current_store customer/account_information/change_email_template change_email_template
 | 
						|
     * @magentoConfigFixture current_store customer/password/forgot_email_identity support
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer_sample.php
 | 
						|
     */
 | 
						|
    public function testInlineEditChangeEmail()
 | 
						|
    {
 | 
						|
        $customerId = 1;
 | 
						|
        $newEmail = 'newcustomer@example.com';
 | 
						|
        $transportBuilderMock = $this->prepareEmailMock(
 | 
						|
            2,
 | 
						|
            'change_email_template',
 | 
						|
            [
 | 
						|
                'name' => 'CustomerSupport',
 | 
						|
                'email' => 'support@example.com',
 | 
						|
            ],
 | 
						|
            $customerId,
 | 
						|
            $newEmail
 | 
						|
        );
 | 
						|
        $this->addEmailMockToClass($transportBuilderMock, EmailNotification::class);
 | 
						|
        $post = [
 | 
						|
            'items' => [
 | 
						|
                $customerId => [
 | 
						|
                    'middlename' => 'test middlename',
 | 
						|
                    'group_id' => 1,
 | 
						|
                    'website_id' => 1,
 | 
						|
                    'firstname' => 'test firstname',
 | 
						|
                    'lastname' => 'test lastname',
 | 
						|
                    'email' => $newEmail,
 | 
						|
                    'password' => 'password',
 | 
						|
                ],
 | 
						|
            ]
 | 
						|
        ];
 | 
						|
        $this->getRequest()->setParam('ajax', true)->setParam('isAjax', true);
 | 
						|
        $this->getRequest()->setPostValue($post)->setMethod(HttpRequest::METHOD_POST);
 | 
						|
        $this->getRequest()->setParam('id', 1);
 | 
						|
        $this->dispatch('backend/customer/index/inlineEdit');
 | 
						|
 | 
						|
        /**
 | 
						|
         * Check that no errors were generated and set to session
 | 
						|
         */
 | 
						|
        $this->assertSessionMessages($this->isEmpty(), MessageInterface::TYPE_ERROR);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer_sample.php
 | 
						|
     */
 | 
						|
    public function testEditAction()
 | 
						|
    {
 | 
						|
        $this->getRequest()->setParam('id', 1);
 | 
						|
        $this->dispatch('backend/customer/index/edit');
 | 
						|
        $body = $this->getResponse()->getBody();
 | 
						|
 | 
						|
        // verify
 | 
						|
        $this->assertStringContainsString('<h1 class="page-title">test firstname test lastname</h1>', $body);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test new customer form page.
 | 
						|
     */
 | 
						|
    public function testNewAction()
 | 
						|
    {
 | 
						|
        $this->dispatch('backend/customer/index/edit');
 | 
						|
        $body = $this->getResponse()->getBody();
 | 
						|
 | 
						|
        // verify
 | 
						|
        $this->assertStringContainsString('<h1 class="page-title">New Customer</h1>', $body);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Test the editing of a new customer that has not been saved but the page has been reloaded
 | 
						|
     */
 | 
						|
    public function te1stNewActionWithCustomerData()
 | 
						|
    {
 | 
						|
        $customerData = [
 | 
						|
            'customer_id' => 0,
 | 
						|
            'customer' => [
 | 
						|
                'created_in' => false,
 | 
						|
                'disable_auto_group_change' => false,
 | 
						|
                'email' => false,
 | 
						|
                'firstname' => false,
 | 
						|
                'group_id' => false,
 | 
						|
                'lastname' => false,
 | 
						|
                'website_id' => false,
 | 
						|
                'customer_address' => [],
 | 
						|
            ],
 | 
						|
        ];
 | 
						|
        $context = BootstrapHelper::getObjectManager()->get(Context::class);
 | 
						|
        $context->getBackendSession()->setCustomerData($customerData);
 | 
						|
        $this->testNewAction();
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     */
 | 
						|
    public function testResetPasswordActionNoCustomerId()
 | 
						|
    {
 | 
						|
        // No customer ID in post, will just get redirected to base
 | 
						|
        $this->getRequest()->setMethod(HttpRequest::METHOD_GET);
 | 
						|
        $this->dispatch('backend/customer/index/resetPassword');
 | 
						|
        $this->assertRedirect($this->stringContains($this->baseControllerUrl));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDbIsolation enabled
 | 
						|
     */
 | 
						|
    public function testResetPasswordActionBadCustomerId()
 | 
						|
    {
 | 
						|
        // Bad customer ID in post, will just get redirected to base
 | 
						|
        $this->getRequest()->setMethod(HttpRequest::METHOD_GET);
 | 
						|
        $this->getRequest()->setPostValue(['customer_id' => '789']);
 | 
						|
        $this->dispatch('backend/customer/index/resetPassword');
 | 
						|
        $this->assertRedirect($this->stringContains($this->baseControllerUrl));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testResetPasswordActionSuccess()
 | 
						|
    {
 | 
						|
        $this->getRequest()->setPostValue(['customer_id' => '1']);
 | 
						|
        $this->getRequest()->setMethod(HttpRequest::METHOD_GET);
 | 
						|
        $this->dispatch('backend/customer/index/resetPassword');
 | 
						|
        $this->assertSessionMessages(
 | 
						|
            $this->equalTo(['The customer will receive an email with a link to reset password.']),
 | 
						|
            MessageInterface::TYPE_SUCCESS
 | 
						|
        );
 | 
						|
        $this->assertRedirect($this->stringContains($this->baseControllerUrl . 'edit'));
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testAclDeleteActionAllow()
 | 
						|
    {
 | 
						|
        $this->getRequest()->setParam('id', 1);
 | 
						|
        $this->dispatch('backend/customer/index/edit');
 | 
						|
        $body = $this->getResponse()->getBody();
 | 
						|
        $this->assertStringContainsString('Delete Customer', $body);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    public function testAclDeleteActionDeny()
 | 
						|
    {
 | 
						|
        $resource= 'Magento_Customer::delete';
 | 
						|
        $this->_objectManager->get(Builder::class)
 | 
						|
            ->getAcl()
 | 
						|
            ->deny(Bootstrap::ADMIN_ROLE_ID, $resource);
 | 
						|
        $this->getRequest()->setParam('id', 1);
 | 
						|
        $this->dispatch('backend/customer/index/edit');
 | 
						|
        $body = $this->getResponse()->getBody();
 | 
						|
        $this->assertStringNotContainsString('Delete Customer', $body);
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * Prepare email mock to test emails.
 | 
						|
     *
 | 
						|
     * @param int $occurrenceNumber
 | 
						|
     * @param string $templateId
 | 
						|
     * @param array $sender
 | 
						|
     * @param int $customerId
 | 
						|
     * @param string|null $newEmail
 | 
						|
     * @return MockObject
 | 
						|
     * @magentoDataFixture Magento/Customer/_files/customer.php
 | 
						|
     */
 | 
						|
    protected function prepareEmailMock(
 | 
						|
        int $occurrenceNumber,
 | 
						|
        string $templateId,
 | 
						|
        array $sender,
 | 
						|
        int $customerId,
 | 
						|
        $newEmail = null
 | 
						|
    ) : MockObject {
 | 
						|
        $area = Area::AREA_FRONTEND;
 | 
						|
        $customer = $this->customerRepository->getById($customerId);
 | 
						|
        $storeId = $customer->getStoreId();
 | 
						|
        $name = $this->customerViewHelper->getCustomerName($customer);
 | 
						|
 | 
						|
        $transportMock = $this->getMockBuilder(TransportInterface::class)
 | 
						|
            ->setMethods(['sendMessage'])
 | 
						|
            ->getMockForAbstractClass();
 | 
						|
        $transportMock->expects($this->exactly($occurrenceNumber))
 | 
						|
            ->method('sendMessage');
 | 
						|
        $transportBuilderMock = $this->getMockBuilder(TransportBuilder::class)
 | 
						|
            ->disableOriginalConstructor()
 | 
						|
            ->setMethods(
 | 
						|
                [
 | 
						|
                    'addTo',
 | 
						|
                    'setFrom',
 | 
						|
                    'setTemplateIdentifier',
 | 
						|
                    'setTemplateVars',
 | 
						|
                    'setTemplateOptions',
 | 
						|
                    'getTransport',
 | 
						|
                ]
 | 
						|
            )
 | 
						|
            ->getMock();
 | 
						|
        $transportBuilderMock->method('setTemplateIdentifier')
 | 
						|
            ->with($templateId)
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setTemplateOptions')
 | 
						|
            ->with(['area' => $area, 'store' => $storeId])
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setTemplateVars')
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('setFrom')
 | 
						|
            ->with($sender)
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->method('addTo')
 | 
						|
            ->with($this->logicalOr($customer->getEmail(), $newEmail), $name)
 | 
						|
            ->willReturnSelf();
 | 
						|
        $transportBuilderMock->expects($this->exactly($occurrenceNumber))
 | 
						|
            ->method('getTransport')
 | 
						|
            ->willReturn($transportMock);
 | 
						|
 | 
						|
        return $transportBuilderMock;
 | 
						|
    }
 | 
						|
 | 
						|
    /**
 | 
						|
     * @param MockObject $transportBuilderMock
 | 
						|
     * @param string $className
 | 
						|
     */
 | 
						|
    protected function addEmailMockToClass(
 | 
						|
        MockObject $transportBuilderMock,
 | 
						|
        $className
 | 
						|
    ) {
 | 
						|
        $mocked = $this->_objectManager->create(
 | 
						|
            $className,
 | 
						|
            ['transportBuilder' => $transportBuilderMock]
 | 
						|
        );
 | 
						|
        $this->_objectManager->addSharedInstance(
 | 
						|
            $mocked,
 | 
						|
            $className
 | 
						|
        );
 | 
						|
    }
 | 
						|
}
 |