magento2-docker/dev/tests/integration/testsuite/Magento/Customer/Controller/Adminhtml/IndexTest.php

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
);
}
}