Skip to content

Commit 3167a47

Browse files
committed
MAGETWO-97953: Automate with Integration test Verify Email functionality for order
1 parent 2957731 commit 3167a47

File tree

16 files changed

+1458
-6
lines changed

16 files changed

+1458
-6
lines changed

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
55
*/
66
namespace Magento\TestFramework\TestCase;
77

8-
use Magento\Framework\App\Request\Http as HttpRequest;
9-
108
/**
119
* A parent class for backend controllers - contains directives for admin user creation and authentication.
1210
*
@@ -122,7 +120,7 @@ public function testAclHasAccess()
122120
*/
123121
public function testAclNoAccess()
124122
{
125-
if ($this->resource === null) {
123+
if ($this->resource === null || $this->uri === null) {
126124
$this->markTestIncomplete('Acl test is not complete');
127125
}
128126
if ($this->httpMethod) {

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

Lines changed: 157 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,61 @@
99
use Magento\Customer\Api\CustomerRepositoryInterface;
1010
use Magento\Framework\Api\SearchCriteriaBuilder;
1111
use Magento\Framework\App\Request\Http;
12+
use Magento\Framework\Data\Form\FormKey;
1213
use Magento\Framework\Exception\LocalizedException;
1314
use Magento\Framework\Message\MessageInterface;
1415
use Magento\Quote\Api\CartRepositoryInterface;
16+
use Magento\Sales\Api\Data\OrderInterface;
17+
use Magento\Sales\Model\OrderRepository;
1518
use Magento\Sales\Model\Service\OrderService;
19+
use Magento\TestFramework\Mail\Template\TransportBuilderMock;
1620
use Magento\TestFramework\TestCase\AbstractBackendController;
21+
use PHPUnit\Framework\Constraint\StringContains;
1722
use PHPUnit_Framework_MockObject_MockObject as MockObject;
1823

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

109+
/**
110+
* @magentoDbIsolation enabled
111+
* @magentoDataFixture Magento/Sales/_files/guest_quote_with_addresses.php
112+
*
113+
* @return void
114+
*/
115+
public function testSendEmailOnOrderSave(): void
116+
{
117+
$this->prepareRequest(['send_confirmation' => true]);
118+
$this->dispatch('backend/sales/order_create/save');
119+
$this->assertSessionMessages(
120+
$this->equalTo([(string)__('You created the order.')]),
121+
MessageInterface::TYPE_SUCCESS
122+
);
123+
124+
$this->assertRedirect($this->stringContains('sales/order/view/'));
125+
126+
$orderId = $this->getOrderId();
127+
if ($orderId === false) {
128+
$this->fail('Order is not created.');
129+
}
130+
$order = $this->getOrder($orderId);
131+
132+
$message = $this->transportBuilder->getSentMessage();
133+
$subject = __('Your %1 order confirmation', $order->getStore()->getFrontendName())->render();
134+
$assert = $this->logicalAnd(
135+
new StringContains($order->getBillingAddress()->getName()),
136+
new StringContains(
137+
'Thank you for your order from ' . $order->getStore()->getFrontendName()
138+
),
139+
new StringContains(
140+
"Your Order <span class=\"no-link\">#{$order->getIncrementId()}</span>"
141+
)
142+
);
143+
144+
$this->assertEquals($message->getSubject(), $subject);
145+
$this->assertThat($message->getRawMessage(), $assert);
146+
}
147+
69148
/**
70149
* Gets quote by reserved order id.
71150
*
72151
* @param string $reservedOrderId
73152
* @return \Magento\Quote\Api\Data\CartInterface
74153
*/
75-
private function getQuote($reservedOrderId)
154+
private function getQuote(string $reservedOrderId): \Magento\Quote\Api\Data\CartInterface
76155
{
77156
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
78157
$searchCriteriaBuilder = $this->_objectManager->get(SearchCriteriaBuilder::class);
@@ -82,6 +161,81 @@ private function getQuote($reservedOrderId)
82161
/** @var CartRepositoryInterface $quoteRepository */
83162
$quoteRepository = $this->_objectManager->get(CartRepositoryInterface::class);
84163
$items = $quoteRepository->getList($searchCriteria)->getItems();
164+
85165
return array_pop($items);
86166
}
167+
168+
/**
169+
* @inheritdoc
170+
* @magentoDbIsolation enabled
171+
* @magentoDataFixture Magento/Sales/_files/guest_quote_with_addresses.php
172+
*/
173+
public function testAclHasAccess()
174+
{
175+
$this->prepareRequest();
176+
177+
parent::testAclHasAccess();
178+
}
179+
180+
/**
181+
* @inheritdoc
182+
* @magentoDbIsolation enabled
183+
* @magentoDataFixture Magento/Sales/_files/guest_quote_with_addresses.php
184+
*/
185+
public function testAclNoAccess()
186+
{
187+
$this->prepareRequest();
188+
189+
parent::testAclNoAccess();
190+
}
191+
192+
/**
193+
* @param int $orderId
194+
* @return OrderInterface
195+
*/
196+
private function getOrder(int $orderId): OrderInterface
197+
{
198+
return $this->_objectManager->get(OrderRepository::class)->get($orderId);
199+
}
200+
201+
/**
202+
* @param array $params
203+
* @return void
204+
*/
205+
private function prepareRequest(array $params = []): void
206+
{
207+
$quote = $this->getQuote('guest_quote');
208+
$session = $this->_objectManager->get(Quote::class);
209+
$session->setQuoteId($quote->getId());
210+
$session->setCustomerId(0);
211+
212+
$email = 'john.doe001@test.com';
213+
$data = [
214+
'account' => [
215+
'email' => $email,
216+
],
217+
];
218+
219+
$data = array_replace_recursive($data, $params);
220+
221+
$this->getRequest()
222+
->setMethod('POST')
223+
->setParams(['form_key' => $this->formKey->getFormKey()])
224+
->setPostValue(['order' => $data]);
225+
}
226+
227+
/**
228+
* @return string|bool
229+
*/
230+
protected function getOrderId()
231+
{
232+
$currentUrl = $this->getResponse()->getHeader('Location');
233+
$orderId = false;
234+
235+
if (preg_match('/order_id\/(?<order_id>\d+)/', $currentUrl, $matches)) {
236+
$orderId = $matches['order_id'] ?? '';
237+
}
238+
239+
return $orderId;
240+
}
87241
}
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)