<?php
/**
 * Copyright © Magento, Inc. All rights reserved.
 * See COPYING.txt for license details.
 */
namespace Magento\Sales\Test\Unit\Model\Order\Email;

use \Magento\Sales\Model\Order\Email\SenderBuilder;

class SenderBuilderTest extends \PHPUnit_Framework_TestCase
{
    /**
     * @var SenderBuilder
     */
    private $senderBuilder;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $templateContainerMock;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $identityContainerMock;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $transportBuilder;

    /**
     * @var \PHPUnit_Framework_MockObject_MockObject
     */
    private $storeMock;

    /**
     * @inheritdoc
     */
    protected function setUp()
    {
        $templateId = 'test_template_id';
        $templateOptions = ['option1', 'option2'];
        $templateVars = ['var1', 'var2'];
        $emailIdentity = 'email_identity_test';
        $emailCopyTo = ['example@mail.com'];

        $this->templateContainerMock = $this->getMock(
            \Magento\Sales\Model\Order\Email\Container\Template::class,
            ['getTemplateVars', 'getTemplateOptions', 'getTemplateId'],
            [],
            '',
            false
        );

        $this->storeMock = $this->getMock(
            \Magento\Store\Model\Store::class,
            ['getStoreId', '__wakeup'],
            [],
            '',
            false
        );

        $this->identityContainerMock = $this->getMock(
            \Magento\Sales\Model\Order\Email\Container\ShipmentIdentity::class,
            [
                'getEmailIdentity', 'getCustomerEmail',
                'getCustomerName', 'getTemplateOptions', 'getEmailCopyTo',
                'getCopyMethod', 'getStore',
            ],
            [],
            '',
            false
        );

        $this->transportBuilder = $this->getMock(
            \Magento\Framework\Mail\Template\TransportBuilder::class,
            [
                'addTo', 'addBcc', 'getTransport',
                'setTemplateIdentifier', 'setTemplateOptions', 'setTemplateVars',
                'setFrom',
            ],
            [],
            '',
            false
        );

        $this->templateContainerMock->expects($this->once())
            ->method('getTemplateId')
            ->will($this->returnValue($templateId));
        $this->transportBuilder->expects($this->once())
            ->method('setTemplateIdentifier')
            ->with($this->equalTo($templateId));
        $this->templateContainerMock->expects($this->once())
            ->method('getTemplateOptions')
            ->will($this->returnValue($templateOptions));
        $this->transportBuilder->expects($this->once())
            ->method('setTemplateOptions')
            ->with($this->equalTo($templateOptions));
        $this->templateContainerMock->expects($this->once())
            ->method('getTemplateVars')
            ->will($this->returnValue($templateVars));
        $this->transportBuilder->expects($this->once())
            ->method('setTemplateVars')
            ->with($this->equalTo($templateVars));

        $this->identityContainerMock->expects($this->once())
            ->method('getEmailIdentity')
            ->will($this->returnValue($emailIdentity));
        $this->identityContainerMock->expects($this->once())
            ->method('getStore')
            ->will($this->returnValue($this->storeMock));
        $this->transportBuilder->expects($this->once())
            ->method('setFrom')
            ->with($this->equalTo($emailIdentity));

        $this->identityContainerMock->expects($this->once())
            ->method('getEmailCopyTo')
            ->will($this->returnValue($emailCopyTo));

        $this->senderBuilder = new SenderBuilder(
            $this->templateContainerMock,
            $this->identityContainerMock,
            $this->transportBuilder
        );
    }

    public function testSend()
    {
        $customerName = 'test_name';
        $customerEmail = 'test_email';
        $transportMock = $this->getMock(
            \Magento\Sales\Test\Unit\Model\Order\Email\Stub\TransportInterfaceMock::class,
            [],
            [],
            '',
            false
        );

        $this->identityContainerMock->expects($this->once())
            ->method('getEmailCopyTo')
            ->will($this->returnValue(['example@mail.com']));
        $this->identityContainerMock->expects($this->once())
            ->method('getCopyMethod')
            ->will($this->returnValue('bcc'));
        $this->identityContainerMock->expects($this->once())
            ->method('getCustomerEmail')
            ->will($this->returnValue($customerEmail));
        $this->identityContainerMock->expects($this->once())
            ->method('getCustomerName')
            ->will($this->returnValue($customerName));
        $this->transportBuilder->expects($this->once())
            ->method('addTo')
            ->with($this->equalTo($customerEmail), $this->equalTo($customerName));

        $this->transportBuilder->expects($this->once())
            ->method('getTransport')
            ->will($this->returnValue($transportMock));

        $this->senderBuilder->send();
    }

    public function testSendCopyTo()
    {
        $transportMock = $this->getMock(
            \Magento\Sales\Test\Unit\Model\Order\Email\Stub\TransportInterfaceMock::class,
            [],
            [],
            '',
            false
        );
        $this->identityContainerMock->expects($this->once())
            ->method('getCopyMethod')
            ->will($this->returnValue('copy'));
        $this->identityContainerMock->expects($this->never())
            ->method('getCustomerEmail');
        $this->identityContainerMock->expects($this->never())
            ->method('getCustomerName');
        $this->transportBuilder->expects($this->once())
            ->method('addTo')
            ->with($this->equalTo('example@mail.com'));

        $this->transportBuilder->expects($this->once())
            ->method('getTransport')
            ->will($this->returnValue($transportMock));

        $this->senderBuilder->sendCopyTo();
    }
}
