Skip to content

Commit c47505d

Browse files
committed
#32760 fix order items missing in invoice email when invoice created via API
1 parent 9798804 commit c47505d

File tree

2 files changed

+119
-0
lines changed

2 files changed

+119
-0
lines changed

app/code/Magento/Sales/Model/Order/Invoice/Sender/EmailSender.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,9 @@ public function send(
104104

105105
$transport = [
106106
'order' => $order,
107+
'order_id' => $order->getId(),
107108
'invoice' => $invoice,
109+
'invoice_id' => $invoice->getId(),
108110
'comment' => $comment ? $comment->getComment() : '',
109111
'billing' => $order->getBillingAddress(),
110112
'payment_html' => $this->getPaymentHtml($order),
Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,117 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Sales\Model\Order\Invoice\Sender;
9+
10+
use Magento\Framework\Api\SearchCriteriaBuilder;
11+
use Magento\Framework\ObjectManagerInterface;
12+
use Magento\Sales\Api\Data\InvoiceInterface;
13+
use Magento\Sales\Api\Data\OrderInterface;
14+
use Magento\Sales\Api\OrderRepositoryInterface;
15+
use Magento\Sales\Model\ResourceModel\Order\Invoice\CollectionFactory;
16+
use Magento\TestFramework\Helper\Bootstrap;
17+
use PHPUnit\Framework\TestCase;
18+
use Magento\Sales\Model\Order\Invoice\Sender\EmailSender;
19+
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
20+
21+
/**
22+
* Test Order\Invoice\Sender\EmailSender model
23+
*
24+
* @see \Magento\Sales\Model\Order\Invoice\Sender\EmailSender
25+
* @magentoDbIsolation enabled
26+
* @magentoDataFixture Magento/Sales/_files/invoice.php
27+
*/
28+
class EmailSenderTest extends TestCase
29+
{
30+
/**
31+
* @var ObjectManagerInterface
32+
*/
33+
private $objectManager;
34+
35+
/**
36+
* @var EmailSender
37+
*/
38+
private $emailSender;
39+
40+
/**
41+
* @var CollectionFactory
42+
*/
43+
private $invoiceCollectionFactory;
44+
45+
/**
46+
* @var TransportBuilderMock
47+
*/
48+
private $transportBuilder;
49+
50+
/**
51+
* @inheritdoc
52+
*/
53+
protected function setUp(): void
54+
{
55+
parent::setUp();
56+
57+
$this->objectManager = Bootstrap::getObjectManager();
58+
$this->emailSender = $this->objectManager->get(EmailSender::class);
59+
$this->invoiceCollectionFactory = $this->objectManager->get(CollectionFactory::class);
60+
$this->transportBuilder = $this->objectManager->get(TransportBuilderMock::class);
61+
}
62+
63+
/**
64+
* Test that order item(s) present in email
65+
*
66+
* @magentoAppArea frontend
67+
* @return void
68+
* @throws \Exception
69+
*/
70+
public function testOrderItemsPresentInEmail()
71+
{
72+
$order = $this->getOrder('100000001');
73+
$invoice = $this->getInvoiceByOrder($order);
74+
$this->emailSender->send($order, $invoice);
75+
$message = $this->transportBuilder->getSentMessage();
76+
$this->assertStringContainsString(
77+
'SKU: simple',
78+
$message->getBody()->getParts()[0]->getRawContent(),
79+
'Expected text wasn\'t found in message.'
80+
);
81+
}
82+
83+
84+
/**
85+
* Get first order invoice
86+
*
87+
* @param OrderInterface|int $order
88+
* @return InvoiceInterface
89+
*/
90+
protected function getInvoiceByOrder($order): InvoiceInterface
91+
{
92+
$invoiceCollection = $this->invoiceCollectionFactory->create();
93+
94+
return $invoiceCollection->setOrderFilter($order)->setPageSize(1)->getFirstItem();
95+
}
96+
97+
/**
98+
* Gets order entity by increment id.
99+
*
100+
* @param string $incrementId
101+
* @return OrderInterface
102+
*/
103+
private function getOrder(string $incrementId): OrderInterface
104+
{
105+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
106+
$searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
107+
$searchCriteria = $searchCriteriaBuilder->addFilter('increment_id', $incrementId)
108+
->create();
109+
110+
/** @var OrderRepositoryInterface $repository */
111+
$repository = $this->objectManager->get(OrderRepositoryInterface::class);
112+
$items = $repository->getList($searchCriteria)
113+
->getItems();
114+
115+
return array_pop($items);
116+
}
117+
}

0 commit comments

Comments
 (0)