EmailTest.php 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. declare(strict_types=1);
  7. namespace Magento\Sales\Controller\Adminhtml\Order;
  8. use Magento\Framework\Api\SearchCriteria;
  9. use Magento\Framework\Api\SearchCriteriaBuilder;
  10. use Magento\Sales\Api\Data\OrderInterface;
  11. use Magento\Sales\Model\OrderRepository;
  12. use Magento\TestFramework\Mail\Template\TransportBuilderMock;
  13. use PHPUnit\Framework\Constraint\StringContains;
  14. /**
  15. * Class verifies order send email functionality.
  16. *
  17. * @magentoDbIsolation enabled
  18. * @magentoAppArea adminhtml
  19. * @magentoDataFixture Magento/Sales/_files/order.php
  20. */
  21. class EmailTest extends \Magento\TestFramework\TestCase\AbstractBackendController
  22. {
  23. /**
  24. * @var OrderRepository
  25. */
  26. private $orderRepository;
  27. /**
  28. * @var TransportBuilderMock
  29. */
  30. private $transportBuilder;
  31. /**
  32. * @var string
  33. */
  34. protected $resource = 'Magento_Sales::email';
  35. /**
  36. * @var string
  37. */
  38. protected $uri = 'backend/sales/order/email';
  39. /**
  40. * @inheritdoc
  41. */
  42. protected function setUp()
  43. {
  44. parent::setUp();
  45. $this->orderRepository = $this->_objectManager->get(OrderRepository::class);
  46. $this->transportBuilder = $this->_objectManager->get(TransportBuilderMock::class);
  47. }
  48. /**
  49. * @return void
  50. */
  51. public function testSendOrderEmail(): void
  52. {
  53. $order = $this->prepareRequest();
  54. $this->dispatch('backend/sales/order/email');
  55. $this->assertSessionMessages(
  56. $this->equalTo([(string)__('You sent the order email.')]),
  57. \Magento\Framework\Message\MessageInterface::TYPE_SUCCESS
  58. );
  59. $redirectUrl = 'sales/order/view/order_id/' . $order->getEntityId();
  60. $this->assertRedirect($this->stringContains($redirectUrl));
  61. $message = $this->transportBuilder->getSentMessage();
  62. $subject = __('Your %1 order confirmation', $order->getStore()->getFrontendName())->render();
  63. $assert = $this->logicalAnd(
  64. new StringContains($order->getBillingAddress()->getName()),
  65. new StringContains(
  66. 'Thank you for your order from ' . $order->getStore()->getFrontendName()
  67. ),
  68. new StringContains(
  69. "Your Order <span class=\"no-link\">#{$order->getIncrementId()}</span>"
  70. )
  71. );
  72. $this->assertEquals($message->getSubject(), $subject);
  73. $this->assertThat($message->getRawMessage(), $assert);
  74. }
  75. /**
  76. * @inheritdoc
  77. */
  78. public function testAclHasAccess()
  79. {
  80. $this->prepareRequest();
  81. parent::testAclHasAccess();
  82. }
  83. /**
  84. * @inheritdoc
  85. */
  86. public function testAclNoAccess()
  87. {
  88. $this->prepareRequest();
  89. parent::testAclNoAccess();
  90. }
  91. /**
  92. * @param string $incrementalId
  93. * @return OrderInterface|null
  94. */
  95. private function getOrder(string $incrementalId)
  96. {
  97. /** @var SearchCriteria $searchCriteria */
  98. $searchCriteria = $this->_objectManager->create(SearchCriteriaBuilder::class)
  99. ->addFilter(OrderInterface::INCREMENT_ID, $incrementalId)
  100. ->create();
  101. $orders = $this->orderRepository->getList($searchCriteria)->getItems();
  102. /** @var OrderInterface|null $order */
  103. $order = reset($orders);
  104. return $order;
  105. }
  106. /**
  107. * @return OrderInterface|null
  108. */
  109. private function prepareRequest()
  110. {
  111. $order = $this->getOrder('100000001');
  112. $this->getRequest()->setParams(['order_id' => $order->getEntityId()]);
  113. return $order;
  114. }
  115. }