Skip to content

Commit 53821f5

Browse files
committed
Merge remote-tracking branch 'origin/MC-39135' into 2.4-develop-pr46
2 parents c0c4bcb + 738c507 commit 53821f5

File tree

2 files changed

+91
-23
lines changed

2 files changed

+91
-23
lines changed

app/code/Magento/Sales/Model/AdminOrder/EmailSender.php

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,13 @@
55
*/
66
namespace Magento\Sales\Model\AdminOrder;
77

8-
use Psr\Log\LoggerInterface as Logger;
8+
use Magento\Framework\Exception\MailException;
99
use Magento\Framework\Message\ManagerInterface;
1010
use Magento\Sales\Model\Order;
11+
use Magento\Sales\Model\Order\Email\Sender\InvoiceSender;
1112
use Magento\Sales\Model\Order\Email\Sender\OrderSender;
13+
use Magento\Sales\Model\Order\Invoice;
14+
use Psr\Log\LoggerInterface as Logger;
1215

1316
/**
1417
* Class EmailSender
@@ -30,21 +33,31 @@ class EmailSender
3033
*/
3134
protected $orderSender;
3235

36+
/**
37+
* @var InvoiceSender
38+
*/
39+
private $invoiceSender;
40+
3341
/**
3442
* @param ManagerInterface $messageManager
3543
* @param Logger $logger
3644
* @param OrderSender $orderSender
45+
* @param InvoiceSender $invoiceSender
3746
*/
38-
public function __construct(ManagerInterface $messageManager, Logger $logger, OrderSender $orderSender)
39-
{
47+
public function __construct(
48+
ManagerInterface $messageManager,
49+
Logger $logger,
50+
OrderSender $orderSender,
51+
InvoiceSender $invoiceSender
52+
) {
4053
$this->messageManager = $messageManager;
4154
$this->logger = $logger;
4255
$this->orderSender = $orderSender;
56+
$this->invoiceSender = $invoiceSender;
4357
}
4458

4559
/**
46-
* Send email about new order.
47-
* Process mail exception
60+
* Send email about new order and handle mail exception
4861
*
4962
* @param Order $order
5063
* @return bool
@@ -53,7 +66,8 @@ public function send(Order $order)
5366
{
5467
try {
5568
$this->orderSender->send($order);
56-
} catch (\Magento\Framework\Exception\MailException $exception) {
69+
$this->sendInvoiceEmail($order);
70+
} catch (MailException $exception) {
5771
$this->logger->critical($exception);
5872
$this->messageManager->addWarningMessage(
5973
__('You did not email your customer. Please check your email settings.')
@@ -63,4 +77,19 @@ public function send(Order $order)
6377

6478
return true;
6579
}
80+
81+
/**
82+
* Send email about invoice paying
83+
*
84+
* @param Order $order
85+
*/
86+
private function sendInvoiceEmail(Order $order): void
87+
{
88+
foreach ($order->getInvoiceCollection()->getItems() as $invoice) {
89+
/** @var Invoice $invoice */
90+
if ($invoice->getState() === Invoice::STATE_PAID) {
91+
$this->invoiceSender->send($invoice);
92+
}
93+
}
94+
}
6695
}

app/code/Magento/Sales/Test/Unit/Model/AdminOrder/EmailSenderTest.php

Lines changed: 56 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -11,66 +11,89 @@
1111
use Magento\Framework\Message\Manager;
1212
use Magento\Sales\Model\AdminOrder\EmailSender;
1313
use Magento\Sales\Model\Order;
14+
use Magento\Sales\Model\Order\Email\Sender\InvoiceSender;
1415
use Magento\Sales\Model\Order\Email\Sender\OrderSender;
16+
use Magento\Sales\Model\Order\Invoice;
17+
use Magento\Sales\Model\ResourceModel\Order\Invoice\Collection as InvoiceCollection;
1518
use PHPUnit\Framework\MockObject\MockObject;
1619
use PHPUnit\Framework\TestCase;
1720
use Psr\Log\LoggerInterface;
1821

22+
/**
23+
* Tests to sent order emails
24+
*/
1925
class EmailSenderTest extends TestCase
2026
{
2127
/**
22-
* @var MockObject
28+
* @var LoggerInterface|MockObject
2329
*/
24-
protected $orderMock;
30+
private $loggerMock;
2531

2632
/**
27-
* @var MockObject
33+
* @var Manager|MockObject
2834
*/
29-
protected $loggerMock;
35+
private $messageManagerMock;
3036

3137
/**
32-
* @var MockObject
38+
* @var OrderSender|MockObject
3339
*/
34-
protected $messageManagerMock;
40+
private $orderSenderMock;
3541

3642
/**
37-
* @var EmailSender
43+
* @var InvoiceSender|MockObject
3844
*/
39-
protected $emailSender;
45+
private $invoiceSenderMock;
4046

4147
/**
42-
* @var OrderSender
48+
* @var EmailSender
4349
*/
44-
protected $orderSenderMock;
50+
private $emailSender;
4551

4652
/**
47-
* Test setup
53+
* @inheritdoc
4854
*/
4955
protected function setUp(): void
5056
{
5157
$this->messageManagerMock = $this->createMock(Manager::class);
5258
$this->loggerMock = $this->getMockForAbstractClass(LoggerInterface::class);
53-
$this->orderMock = $this->createMock(Order::class);
5459
$this->orderSenderMock = $this->createMock(OrderSender::class);
60+
$this->invoiceSenderMock = $this->createMock(InvoiceSender::class);
5561

56-
$this->emailSender = new EmailSender($this->messageManagerMock, $this->loggerMock, $this->orderSenderMock);
62+
$this->emailSender = new EmailSender(
63+
$this->messageManagerMock,
64+
$this->loggerMock,
65+
$this->orderSenderMock,
66+
$this->invoiceSenderMock
67+
);
5768
}
5869

5970
/**
60-
* testSendSuccess
71+
* Test to send order emails
6172
*/
6273
public function testSendSuccess()
6374
{
75+
$invoicePaid = $this->createMock(Invoice::class);
76+
$invoicePaid->method('getState')->willReturn(Invoice::STATE_PAID);
77+
$invoiceOpen = $this->createMock(Invoice::class);
78+
$invoiceOpen->method('getState')->willReturn(Invoice::STATE_OPEN);
79+
$order = $this->createOrderMock([$invoiceOpen, $invoicePaid]);
80+
6481
$this->orderSenderMock->expects($this->once())
65-
->method('send');
66-
$this->assertTrue($this->emailSender->send($this->orderMock));
82+
->method('send')
83+
->with($order);
84+
$this->invoiceSenderMock->expects($this->once())
85+
->method('send')
86+
->with($invoicePaid);
87+
88+
$this->assertTrue($this->emailSender->send($order));
6789
}
6890

6991
/**
7092
* testSendFailure
7193
*/
7294
public function testSendFailure()
7395
{
96+
$orderMock = $this->createOrderMock();
7497
$this->orderSenderMock->expects($this->once())
7598
->method('send')
7699
->willThrowException(new MailException(__('test message')));
@@ -79,6 +102,22 @@ public function testSendFailure()
79102
$this->loggerMock->expects($this->once())
80103
->method('critical');
81104

82-
$this->assertFalse($this->emailSender->send($this->orderMock));
105+
$this->assertFalse($this->emailSender->send($orderMock));
106+
}
107+
108+
/**
109+
* Create order mock
110+
*
111+
* @param array $invoiceCollection
112+
* @return MockObject|Order
113+
*/
114+
private function createOrderMock(array $invoiceCollection = []): MockObject
115+
{
116+
$collection = $this->createMock(InvoiceCollection::class);
117+
$collection->method('getItems')->willReturn($invoiceCollection);
118+
$order = $this->createMock(Order::class);
119+
$order->method('getInvoiceCollection')->willReturn($collection);
120+
121+
return $order;
83122
}
84123
}

0 commit comments

Comments
 (0)