Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Test coverage for PR #27589 (E-mail templates) #27606

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@
<!--@vars {
"var store.frontend_name":"Store Name",
"var store_email":"Store Email",
"var store_phone":"Store Phone"
"var store_phone":"Store Phone",
"var customer.name":"Customer Name"
} @-->
{{template config_path="design/email/header_template"}}

<p class="greeting">{{trans "Hello,"}}</p>
<br>

<p class="greeting">{{trans "%name," name=$customer.name}}</p>
<p>
{{trans "We have received a request to change the following information associated with your account at %store_name: email." store_name=$store.frontend_name}}
{{trans 'If you have not authorized this action, please contact us immediately at <a href="mailto:%store_email">%store_email</a>' store_email=$store_email |raw}}{{depend store_phone}} {{trans 'or call us at <a href="tel:%store_phone">%store_phone</a>' store_phone=$store_phone |raw}}{{/depend}}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@
<!--@vars {
"var store.frontend_name":"Store Name",
"var store_email":"Store Email",
"var store_phone":"Store Phone"
"var store_phone":"Store Phone",
"var customer.name":"Customer Name"
} @-->
{{template config_path="design/email/header_template"}}

<p class="greeting">{{trans "Hello,"}}</p>
<br>

<p class="greeting">{{trans "%name," name=$customer.name}}</p>
<p>
{{trans "We have received a request to change the following information associated with your account at %store_name: email, password." store_name=$store.frontend_name}}
{{trans 'If you have not authorized this action, please contact us immediately at <a href="mailto:%store_email">%store_email</a>' store_email=$store_email |raw}}{{depend store_phone}} {{trans 'or call us at <a href="tel:%store_phone">%store_phone</a>' store_phone=$store_phone |raw}}{{/depend}}.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,13 +9,12 @@
"var customer.name":"Customer Name",
"var store.frontend_name":"Store Name",
"var store_email":"Store Email",
"var store_phone":"Store Phone"
"var store_phone":"Store Phone",
"var customer.name":"Customer Name"
} @-->
{{template config_path="design/email/header_template"}}

<p class="greeting">{{trans "Hello,"}}</p>
<br>

<p class="greeting">{{trans "%name," name=$customer.name}}</p>
<p>
{{trans "We have received a request to change the following information associated with your account at %store_name: password." store_name=$store.frontend_name}}
{{trans 'If you have not authorized this action, please contact us immediately at <a href="mailto:%store_email">%store_email</a>' store_email=$store_email |raw}}{{depend store_phone}} {{trans 'or call us at <a href="tel:%store_phone">%store_phone</a>' store_phone=$store_phone |raw}}{{/depend}}.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,204 @@
<?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\Model\Session;
use Magento\Framework\App\Request\Http as HttpRequest;
use Magento\Framework\Data\Form\FormKey;
use Magento\Framework\Mail\EmailMessage;
use Magento\Framework\Message\MessageInterface;
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
use Magento\TestFramework\TestCase\AbstractController;

/**
* Set of tests to verify e-mail templates delivered to Customers
*
* @magentoAppArea frontend
*/
class EmailTemplateTest extends AbstractController
{
private const FIXTURE_CUSTOMER_EMAIL = 'customer@example.com';
private const FIXTURE_CUSTOMER_FIRSTNAME = 'John';
private const FIXTURE_CUSTOMER_LASTNAME = 'Smith';
private const FIXTURE_CUSTOMER_ID = 1;
private const FIXTURE_CUSTOMER_PASSWORD = 'password';
private const EXPECTED_GREETING = self::FIXTURE_CUSTOMER_FIRSTNAME . ' ' . self::FIXTURE_CUSTOMER_LASTNAME . ',';

/**
* @var TransportBuilderMock
*/
private $transportBuilderMock;

/**
* @var Session
*/
private $session;

/**
* @var FormKey
*/
private $formKey;

protected function setUp()
{
parent::setUp();
$this->transportBuilderMock = $this->_objectManager->get(TransportBuilderMock::class);
$this->session = $this->_objectManager->get(Session::class);
$this->formKey = $this->_objectManager->get(FormKey::class);
}

/**
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoConfigFixture current_store customer/captcha/enable 0
*/
public function testForgotPasswordEmailTemplateGreeting()
{
$this->getRequest()->setMethod(HttpRequest::METHOD_POST)
->setPostValue(['email' => self::FIXTURE_CUSTOMER_EMAIL]);
$this->dispatch('customer/account/forgotPasswordPost');

$this->assertSameGreeting(self::EXPECTED_GREETING, $this->transportBuilderMock->getSentMessage());
}

/**
* Covers Magento_Customer::view/frontend/email/change_email.html
*
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoConfigFixture current_store customer/captcha/enable 0
*/
public function testCustomerEmailChangeNotificationTemplateGreeting()
{
$this->loginByCustomerId(self::FIXTURE_CUSTOMER_ID);

$this->sendAccountEditRequest([
'email' => 'new.email@example.com',
'change_email' => 1,
]);

$this->assertRedirect($this->stringContains('customer/account/'));
$this->assertSessionMessages(
$this->equalTo(['You saved the account information.']),
MessageInterface::TYPE_SUCCESS
);

$this->assertSameGreeting(self::EXPECTED_GREETING, $this->transportBuilderMock->getSentMessage());
}

/**
* Covers Magento_Customer::view/frontend/email/change_email_and_password.html
*
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoConfigFixture current_store customer/captcha/enable 0
*/
public function testCustomerEmailAndPasswordChangeNotificationTemplateGreeting()
{
$this->loginByCustomerId(self::FIXTURE_CUSTOMER_ID);

$this->sendAccountEditRequest([
'email' => 'new.email@example.com',
'change_email' => 1,
'change_password' => 1,
'password' => 'new-Password1',
'password_confirmation' => 'new-Password1',
]);

$this->assertRedirect($this->stringContains('customer/account/'));
$this->assertSessionMessages(
$this->equalTo(['You saved the account information.']),
MessageInterface::TYPE_SUCCESS
);

$this->assertSameGreeting(self::EXPECTED_GREETING, $this->transportBuilderMock->getSentMessage());
}

/**
* Covers Magento_Customer::view/frontend/email/change_password.html
*
* @magentoDataFixture Magento/Customer/_files/customer.php
* @magentoConfigFixture current_store customer/captcha/enable 0
*/
public function testCustomerPasswordChangeNotificationTemplateGreeting()
{
$this->loginByCustomerId(self::FIXTURE_CUSTOMER_ID);

$this->sendAccountEditRequest([
'change_password' => 1,
'password' => 'new-Password1',
'password_confirmation' => 'new-Password1',
]);

$this->assertRedirect($this->stringContains('customer/account/'));
$this->assertSessionMessages(
$this->equalTo(['You saved the account information.']),
MessageInterface::TYPE_SUCCESS
);

$this->assertSameGreeting(self::EXPECTED_GREETING, $this->transportBuilderMock->getSentMessage());
}

/**
* Wraps Customer Edit POST request
*
* @param array $customData
*/
private function sendAccountEditRequest(array $customData): void
{
$basicData = [
'form_key' => $this->formKey->getFormKey(),
'firstname' => self::FIXTURE_CUSTOMER_FIRSTNAME,
'lastname' => self::FIXTURE_CUSTOMER_LASTNAME,
'current_password' => self::FIXTURE_CUSTOMER_PASSWORD
];

$this->getRequest()->setMethod(HttpRequest::METHOD_POST)
->setPostValue(array_merge($basicData, $customData));

$this->dispatch('customer/account/editPost');
}

/**
* Verifies if `<p class="greeting"/>` text contents equals the expected one.
*
* @param string $expectedGreeting
* @param EmailMessage $message
*/
private function assertSameGreeting(string $expectedGreeting, EmailMessage $message)
{
$messageContent = $this->getMessageRawContent($message);
$emailDom = new \DOMDocument();
$emailDom->loadHTML($messageContent);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We can introduce new "assert class" and put in
https://github.com/magento/magento2/tree/2.4-develop/dev/tests/integration/framework/Magento/TestFramework
Assert namespace.

We achieve 2 goals:

  • working with DOM will be encapsulated ;
  • we can reuse the "assert" in the other testcases;

Thanks

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm going to create separate ticket for that point.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'm going to create separate ticket for that point.

Please link this and a new ticket.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


$emailXpath = new \DOMXPath($emailDom);
$greeting = $emailXpath->query('//p[@class="greeting"]');

$this->assertSame(1, $greeting->length);
$this->assertSame($expectedGreeting, $greeting->item(0)->textContent);
}

/**
* Returns raw content of provided message
*
* @param EmailMessage $message
* @return string
*/
private function getMessageRawContent(EmailMessage $message): string
{
$emailParts = $message->getBody()->getParts();
return current($emailParts)->getRawContent();
}

/**
* Performs Customer log in
*
* @param int $customerId
*/
private function loginByCustomerId(int $customerId): void
{
$this->session->loginById($customerId);
}
}