magento2-docker/dev/tests/integration/testsuite/Magento/Framework/Mail/EmailMessageTest.php

292 lines
9.1 KiB
PHP
Executable File

<?php
/**
* Copyright © Magento, Inc. All rights reserved.
* See COPYING.txt for license details.
*/
declare(strict_types=1);
namespace Magento\Framework\Mail;
use Magento\Framework\Exception\MailException;
use Magento\Framework\ObjectManagerInterface;
use Magento\TestFramework\Helper\Bootstrap;
use PHPUnit\Framework\TestCase;
/**
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
*/
class EmailMessageTest extends TestCase
{
private const ATTACHMENT_FILE_NAME = 'di.xml';
private const XML_TYPE = 'text/xml';
/**
* @var ObjectManagerInterface
*/
private $di;
/**
* @var MimePartInterfaceFactory
*/
private $mimePartFactory;
/**
* @var MimeMessageInterfaceFactory
*/
private $mimeMessageFactory;
/**
* @var AddressConverter
*/
private $messageConverter;
/**
* @var EmailMessageInterfaceFactory
*/
private $messageFactory;
/**
* @var AddressFactory
*/
private $addressFactory;
/**
* @var array
*/
private $addressList = [
'to' => [
['email' => 'to@adobe.com', 'name' => 'Addressee']
],
'replyTo' => ['email' => 'replyTo@adobe.com', 'name' => 'Reply To Address'],
'from' => 'from@adobe.com',
'sender' => ['email' => 'sender@adobe.com', 'name' => 'Sender'],
'cc' => [
'cc1@adobe.com' => 'CC 1 Address',
'cc2@adobe.com' => 'CC 2 Address',
'cc3@adobe.com' => 'CC 3 Address',
],
'bcc' => ['bcc1@adobe.com', 'bcc2@adobe.com'],
];
/**
* @var string
*/
private $subject = 'Test=20subject';
/**
* @var string
*/
private $description = 'Test description';
/**
*
* @return void
*/
protected function setUp(): void
{
$this->di = Bootstrap::getObjectManager();
$this->mimePartFactory = $this->di->get(MimePartInterfaceFactory::class);
$this->mimeMessageFactory = $this->di->get(MimeMessageInterfaceFactory::class);
$this->messageConverter = $this->di->get(AddressConverter::class);
$this->messageFactory = $this->di->get(EmailMessageInterfaceFactory::class);
}
/**
* @return array
*/
public function getEmailMessageDataProvider(): array
{
return [
[
'Content Test',
MimeInterface::TYPE_TEXT
], [
'<h1>Html message</h1>',
MimeInterface::TYPE_HTML
]
];
}
/**
* Tests Email Message with Addresses
*
* @dataProvider getEmailMessageDataProvider
* @param $content
* @param $type
* @return void
* @throws MailException
*/
public function testEmailMessage($content, $type): void
{
$mimePart = $this->mimePartFactory->create(
[
'content' => $content,
'description' => $this->description,
'type' => $type
]
);
$mimeMessage = $this->mimeMessageFactory->create(
[
'parts' => [$mimePart]
]
);
$this->addressFactory = $this->di->get(AddressFactory::class);
/** @var Address $addressTo */
$to = [
$this->addressFactory->create(
[
'email' => $this->addressList['to'][0]['email'],
'name' => $this->addressList['to'][0]['name']
]
)
];
$from = [$this->messageConverter->convert($this->addressList['from'])];
$cc = $this->messageConverter->convertMany($this->addressList['cc']);
$replyTo = [
$this->messageConverter->convert(
$this->addressList['replyTo']['email'],
$this->addressList['replyTo']['name']
)
];
$bcc = $this->messageConverter->convertMany($this->addressList['bcc']);
$sender = $this->messageConverter->convert(
$this->addressList['sender']['email'],
$this->addressList['sender']['name']
);
$data = [
'body' => $mimeMessage,
'subject' => $this->subject,
'from' => $from,
'to' => $to,
'cc' => $cc,
'replyTo' => $replyTo,
'bcc' => $bcc,
'sender' => $sender,
];
$message = $this->messageFactory->create($data);
$this->assertStringContainsString($content, $message->toString());
$this->assertStringContainsString('Content-Type: ' . $type, $message->toString());
$senderString = 'Sender: =?utf-8?Q?'
. str_replace(' ', '=20', $sender->getName())
. '?= <'
. $sender->getEmail()
. '>';
$this->assertStringContainsString($senderString, $message->toString());
$this->assertStringContainsString('From: ' . $from[0]->getEmail(), $message->toString());
$replyToString = 'Reply-To: =?utf-8?Q?'
. str_replace(' ', '=20', $replyTo[0]->getName())
. '?= <'
. $replyTo[0]->getEmail()
. '>';
$this->assertStringContainsString($replyToString, $message->toString());
$toString = 'To: =?utf-8?Q?'
. str_replace(' ', '=20', $to[0]->getName())
. '?= <'
. $to[0]->getEmail()
. '>';
$this->assertStringContainsString($toString, $message->toString());
$ccString = 'Cc: =?utf-8?Q?'
. str_replace(' ', '=20', $cc[0]->getName())
. '?= <'
. $cc[0]->getEmail()
. '>';
$this->assertStringContainsString($ccString, $message->toString());
$this->assertStringContainsString('Bcc: ' . $bcc[0]->getEmail(), $message->toString());
$contentDescription = 'Content-Description: =?UTF-8?Q?'
. str_replace(' ', '=20', $this->description)
. '?=';
$this->assertStringContainsString($contentDescription, $message->toString());
$this->assertStringContainsString(
'Subject: =?UTF-8?Q?' . $this->subject,
quoted_printable_decode($message->toString())
);
$this->assertStringContainsString($content, $message->toString());
//tests address factory
$this->assertInstanceOf(Address::class, $message->getTo()[0]);
//tests address converter convert method
$this->assertInstanceOf(Address::class, $message->getFrom()[0]);
//tests address converter convertMany method
$this->assertInstanceOf(Address::class, $message->getCc()[0]);
}
/**
* Test Email Message with Xml Attachment
*
* @return void
*/
public function testEmailMessageWithAttachment(): void
{
$mimePartMain = $this->mimePartFactory->create(
[
'content' => 'Test',
'description' => $this->description,
'type' => MimeInterface::TYPE_TEXT
]
);
$mimePartAttachment = $this->mimePartFactory->create(
[
'content' => $this->getXmlContent(),
'disposition' => MimeInterface::DISPOSITION_ATTACHMENT,
'fileName' => self::ATTACHMENT_FILE_NAME,
'encoding' => MimeInterface::ENCODING_8BIT,
'type' => self::XML_TYPE
]
);
$mimeMessage = $this->mimeMessageFactory->create(
[
'parts' => [$mimePartMain, $mimePartAttachment]
]
);
$this->addressFactory = $this->di->get(AddressFactory::class);
/** @var Address $addressTo */
$addressTo = $this->addressFactory
->create(
[
'email' => $this->addressList['to'][0]['email'],
'name' => $this->addressList['to'][0]['name']
]
);
$data = [
'body' => $mimeMessage,
'subject' => $this->subject,
'to' => [$addressTo],
'encoding' => '',
];
$message = $this->messageFactory->create($data);
$this->assertStringContainsString($this->getXmlContent(), $message->toString());
$this->assertStringContainsString('Content-Type: ' . self::XML_TYPE, $message->toString());
$contentDisposition = 'Content-Disposition: ' . MimeInterface::DISPOSITION_ATTACHMENT
. '; filename="' . self::ATTACHMENT_FILE_NAME . '"';
$this->assertStringContainsString($contentDisposition, $message->toString());
}
/**
* Provides xml content
*
* @return string
*/
private function getXmlContent(): string
{
return '<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
<type name="Magento\Framework\Console\CommandList">
<arguments>
<argument name="commands" xsi:type="array">
<item name="furman_test_command_testbed" xsi:type="object">Furman\Test\Command\Testbed</item>
</argument>
</arguments>
</type>
</config>
';
}
}