Skip to content

Commit 6ed9586

Browse files
committed
MAGETWO-97196: Automate with Integration test Verify Email functionality for order
1 parent 77294bf commit 6ed9586

File tree

16 files changed

+1456
-3
lines changed

16 files changed

+1456
-3
lines changed

dev/tests/integration/framework/Magento/TestFramework/TestCase/AbstractBackendController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ public function testAclHasAccess()
9898

9999
public function testAclNoAccess()
100100
{
101-
if ($this->resource === null) {
101+
if ($this->resource === null || $this->uri === null) {
102102
$this->markTestIncomplete('Acl test is not complete');
103103
}
104104
$this->_objectManager->get(\Magento\Framework\Acl\Builder::class)

dev/tests/integration/testsuite/Magento/Sales/Controller/Adminhtml/Order/Create/SaveTest.php

Lines changed: 155 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,21 +8,61 @@
88
use Magento\Backend\Model\Session\Quote;
99
use Magento\Customer\Api\CustomerRepositoryInterface;
1010
use Magento\Framework\Api\SearchCriteriaBuilder;
11+
use Magento\Framework\Data\Form\FormKey;
1112
use Magento\Framework\Exception\LocalizedException;
1213
use Magento\Framework\Message\MessageInterface;
1314
use Magento\Quote\Api\CartRepositoryInterface;
15+
use Magento\Sales\Api\Data\OrderInterface;
16+
use Magento\Sales\Model\OrderRepository;
1417
use Magento\Sales\Model\Service\OrderService;
18+
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
1519
use Magento\TestFramework\TestCase\AbstractBackendController;
20+
use PHPUnit\Framework\Constraint\StringContains;
1621
use PHPUnit_Framework_MockObject_MockObject as MockObject;
1722

23+
/**
24+
* Class test backend order save.
25+
*
26+
* @magentoAppArea adminhtml
27+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
28+
*/
1829
class SaveTest extends AbstractBackendController
1930
{
31+
/**
32+
* @var TransportBuilderMock
33+
*/
34+
private $transportBuilder;
35+
36+
/**
37+
* @var FormKey
38+
*/
39+
private $formKey;
40+
41+
/**
42+
* @var string
43+
*/
44+
protected $resource = 'Magento_Sales::create';
45+
46+
/**
47+
* @var string
48+
*/
49+
protected $uri = 'backend/sales/order_create/save';
50+
51+
/**
52+
* @inheritdoc
53+
*/
54+
protected function setUp()
55+
{
56+
parent::setUp();
57+
$this->transportBuilder = $this->_objectManager->get(TransportBuilderMock::class);
58+
$this->formKey = $this->_objectManager->get(FormKey::class);
59+
}
60+
2061
/**
2162
* Checks a case when order creation is failed on payment method processing but new customer already created
2263
* in the database and after new controller dispatching the customer should be already loaded in session
2364
* to prevent invalid validation.
2465
*
25-
* @magentoAppArea adminhtml
2666
* @magentoDataFixture Magento/Sales/_files/quote_with_new_customer.php
2767
*/
2868
public function testExecuteWithPaymentOperation()
@@ -35,7 +75,7 @@ public function testExecuteWithPaymentOperation()
3575
$email = 'john.doe001@test.com';
3676
$data = [
3777
'account' => [
38-
'email' => $email
78+
'email' => $email,
3979
]
4080
];
4181
$this->getRequest()->setPostValue(['order' => $data]);
@@ -64,6 +104,45 @@ public function testExecuteWithPaymentOperation()
64104
$this->_objectManager->removeSharedInstance(OrderService::class);
65105
}
66106

107+
/**
108+
* @magentoDbIsolation enabled
109+
* @magentoDataFixture Magento/Sales/_files/guest_quote_with_addresses.php
110+
*
111+
* @return void
112+
*/
113+
public function testSendEmailOnOrderSave()
114+
{
115+
$this->prepareRequest(['send_confirmation' => true]);
116+
$this->dispatch('backend/sales/order_create/save');
117+
$this->assertSessionMessages(
118+
$this->equalTo([(string)__('You created the order.')]),
119+
MessageInterface::TYPE_SUCCESS
120+
);
121+
122+
$this->assertRedirect($this->stringContains('sales/order/view/'));
123+
124+
$orderId = $this->getOrderId();
125+
if ($orderId === false) {
126+
$this->fail('Order is not created.');
127+
}
128+
$order = $this->getOrder($orderId);
129+
130+
$message = $this->transportBuilder->getSentMessage();
131+
$subject = __('Your %1 order confirmation', $order->getStore()->getFrontendName())->render();
132+
$assert = $this->logicalAnd(
133+
new StringContains($order->getBillingAddress()->getName()),
134+
new StringContains(
135+
'Thank you for your order from ' . $order->getStore()->getFrontendName()
136+
),
137+
new StringContains(
138+
"Your Order <span class=\"no-link\">#{$order->getIncrementId()}</span>"
139+
)
140+
);
141+
142+
$this->assertEquals($message->getSubject(), $subject);
143+
$this->assertThat($message->getRawMessage(), $assert);
144+
}
145+
67146
/**
68147
* Gets quote by reserved order id.
69148
*
@@ -82,4 +161,78 @@ private function getQuote($reservedOrderId)
82161
$items = $quoteRepository->getList($searchCriteria)->getItems();
83162
return array_pop($items);
84163
}
164+
165+
/**
166+
* @inheritdoc
167+
* @magentoDbIsolation enabled
168+
* @magentoDataFixture Magento/Sales/_files/guest_quote_with_addresses.php
169+
*/
170+
public function testAclHasAccess()
171+
{
172+
$this->prepareRequest();
173+
174+
parent::testAclHasAccess();
175+
}
176+
177+
/**
178+
* @inheritdoc
179+
* @magentoDbIsolation enabled
180+
* @magentoDataFixture Magento/Sales/_files/guest_quote_with_addresses.php
181+
*/
182+
public function testAclNoAccess()
183+
{
184+
$this->prepareRequest();
185+
186+
parent::testAclNoAccess();
187+
}
188+
189+
/**
190+
* @param int $orderId
191+
* @return OrderInterface
192+
*/
193+
private function getOrder(int $orderId): OrderInterface
194+
{
195+
return $this->_objectManager->get(OrderRepository::class)->get($orderId);
196+
}
197+
198+
/**
199+
* @param array $params
200+
* @return void
201+
*/
202+
private function prepareRequest(array $params = [])
203+
{
204+
$quote = $this->getQuote('guest_quote');
205+
$session = $this->_objectManager->get(Quote::class);
206+
$session->setQuoteId($quote->getId());
207+
$session->setCustomerId(0);
208+
209+
$email = 'john.doe001@test.com';
210+
$data = [
211+
'account' => [
212+
'email' => $email,
213+
],
214+
];
215+
216+
$data = array_replace_recursive($data, $params);
217+
218+
$this->getRequest()
219+
->setMethod('POST')
220+
->setParams(['form_key' => $this->formKey->getFormKey()])
221+
->setPostValue(['order' => $data]);
222+
}
223+
224+
/**
225+
* @return string|bool
226+
*/
227+
protected function getOrderId()
228+
{
229+
$currentUrl = $this->getResponse()->getHeader('Location');
230+
$orderId = false;
231+
232+
if (preg_match('/order_id\/(?<order_id>\d+)/', $currentUrl, $matches)) {
233+
$orderId = $matches['order_id'] ?? '';
234+
}
235+
236+
return $orderId;
237+
}
85238
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
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\Controller\Adminhtml\Order\Creditmemo;
9+
10+
use Magento\Framework\Api\SearchCriteria;
11+
use Magento\Framework\Api\SearchCriteriaBuilder;
12+
use Magento\Framework\Data\Form\FormKey;
13+
use Magento\Sales\Api\Data\CreditmemoInterface;
14+
use Magento\Sales\Api\Data\OrderInterface;
15+
use Magento\Sales\Model\OrderRepository;
16+
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
17+
use Magento\TestFramework\TestCase\AbstractBackendController;
18+
19+
/**
20+
* Abstract backend creditmemo test.
21+
*/
22+
class AbstractCreditmemoControllerTest extends AbstractBackendController
23+
{
24+
/**
25+
* @var TransportBuilderMock
26+
*/
27+
protected $transportBuilder;
28+
29+
/**
30+
* @var OrderRepository
31+
*/
32+
protected $orderRepository;
33+
34+
/**
35+
* @var FormKey
36+
*/
37+
protected $formKey;
38+
39+
/**
40+
* @var string
41+
*/
42+
protected $resource = 'Magento_Sales::sales_creditmemo';
43+
44+
/**
45+
* @inheritdoc
46+
*/
47+
protected function setUp()
48+
{
49+
parent::setUp();
50+
$this->transportBuilder = $this->_objectManager->get(TransportBuilderMock::class);
51+
$this->orderRepository = $this->_objectManager->get(OrderRepository::class);
52+
$this->formKey = $this->_objectManager->get(FormKey::class);
53+
}
54+
55+
/**
56+
* @param string $incrementalId
57+
* @return OrderInterface|null
58+
*/
59+
protected function getOrder(string $incrementalId)
60+
{
61+
/** @var SearchCriteria $searchCriteria */
62+
$searchCriteria = $this->_objectManager->create(SearchCriteriaBuilder::class)
63+
->addFilter(OrderInterface::INCREMENT_ID, $incrementalId)
64+
->create();
65+
66+
$orders = $this->orderRepository->getList($searchCriteria)->getItems();
67+
/** @var OrderInterface|null $order */
68+
$order = reset($orders);
69+
70+
return $order;
71+
}
72+
73+
/**
74+
* @param OrderInterface $order
75+
* @return CreditmemoInterface
76+
*/
77+
protected function getCreditMemo(OrderInterface $order): CreditmemoInterface
78+
{
79+
/** @var \Magento\Sales\Model\ResourceModel\Order\Creditmemo\Collection $creditMemoCollection */
80+
$creditMemoCollection = $this->_objectManager->create(
81+
\Magento\Sales\Model\ResourceModel\Order\Creditmemo\CollectionFactory::class
82+
)->create();
83+
84+
/** @var CreditmemoInterface $creditMemo */
85+
$creditMemo = $creditMemoCollection
86+
->setOrderFilter($order)
87+
->setPageSize(1)
88+
->getFirstItem();
89+
90+
return $creditMemo;
91+
}
92+
}

0 commit comments

Comments
 (0)