292 lines
		
	
	
		
			9.1 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			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>
 | 
						|
';
 | 
						|
    }
 | 
						|
}
 |