PlaceOrderTest.php 6.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Signifyd\Observer;
  7. use Magento\Framework\Api\SearchCriteriaBuilder;
  8. use Magento\Framework\App\ObjectManager;
  9. use Magento\Framework\Event;
  10. use Magento\Framework\Event\Observer;
  11. use Magento\Sales\Api\Data\OrderInterface;
  12. use Magento\Sales\Api\OrderRepositoryInterface;
  13. use Magento\Signifyd\Api\CaseCreationServiceInterface;
  14. use Magento\Store\Api\StoreRepositoryInterface;
  15. use Magento\Store\Model\StoreManagerInterface;
  16. use Magento\TestFramework\Helper\Bootstrap;
  17. use PHPUnit\Framework\MockObject_MockObject as MockObject;
  18. use Psr\Log\LoggerInterface;
  19. /**
  20. * Test for Magento\Signifyd\Observer\PlaceOrderTest class.
  21. *
  22. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  23. */
  24. class PlaceOrderTest extends \PHPUnit\Framework\TestCase
  25. {
  26. /**
  27. * @var CaseCreationServiceInterface|MockObject
  28. */
  29. private $creationService;
  30. /**
  31. * @var LoggerInterface|MockObject
  32. */
  33. private $logger;
  34. /**
  35. * @var PlaceOrder
  36. */
  37. private $placeOrder;
  38. /**
  39. * @var ObjectManager
  40. */
  41. private $objectManager;
  42. /**
  43. * @inheritdoc
  44. */
  45. protected function setUp()
  46. {
  47. $this->objectManager = Bootstrap::getObjectManager();
  48. $this->creationService = $this->getMockBuilder(CaseCreationServiceInterface::class)
  49. ->disableOriginalConstructor()
  50. ->setMethods(['createForOrder'])
  51. ->getMock();
  52. $this->logger = $this->getMockBuilder(LoggerInterface::class)
  53. ->disableOriginalConstructor()
  54. ->getMock();
  55. $this->placeOrder = $this->objectManager->create(PlaceOrder::class, [
  56. 'caseCreationService' => $this->creationService,
  57. 'logger' => $this->logger
  58. ]);
  59. }
  60. /**
  61. * Checks a case when order placed with offline payment method.
  62. *
  63. * @covers \Magento\Signifyd\Observer\PlaceOrder::execute
  64. * @magentoConfigFixture current_store fraud_protection/signifyd/active 1
  65. * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
  66. */
  67. public function testExecuteWithOfflinePayment()
  68. {
  69. $order = $this->getOrder('100000005');
  70. $this->creationService->expects(self::never())
  71. ->method('createForOrder');
  72. $event = $this->objectManager->create(
  73. Event::class,
  74. [
  75. 'data' => ['order' => $order]
  76. ]
  77. );
  78. /** @var Observer $observer */
  79. $observer = $this->objectManager->get(Observer::class);
  80. $observer->setEvent($event);
  81. $this->placeOrder->execute($observer);
  82. }
  83. /**
  84. * Checks a test case when order placed with online payment method.
  85. *
  86. * @covers \Magento\Signifyd\Observer\PlaceOrder::execute
  87. * @magentoConfigFixture current_store fraud_protection/signifyd/active 1
  88. * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
  89. */
  90. public function testExecute()
  91. {
  92. $order = $this->getOrder('100000001');
  93. $this->creationService->expects(self::once())
  94. ->method('createForOrder')
  95. ->with(self::equalTo($order->getEntityId()));
  96. $event = $this->objectManager->create(
  97. Event::class,
  98. [
  99. 'data' => ['order' => $order],
  100. ]
  101. );
  102. /** @var Observer $observer */
  103. $observer = $this->objectManager->get(Observer::class);
  104. $observer->setEvent($event);
  105. $this->placeOrder->execute($observer);
  106. }
  107. /**
  108. * Signifyd is enabled for default store.
  109. * Checks a test case when order placed with website where signifyd is disabled.
  110. *
  111. * @return void
  112. * @covers \Magento\Signifyd\Observer\PlaceOrder::execute
  113. * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
  114. * @magentoDataFixture Magento/Signifyd/_files/website_configuration.php
  115. */
  116. public function testExecuteWithWebsiteConfiguration(): void
  117. {
  118. /** @var StoreRepositoryInterface $storeRepository */
  119. $storeRepository = $this->objectManager->get(StoreRepositoryInterface::class);
  120. $store = $storeRepository->get('test_second_store');
  121. /** @var StoreManagerInterface $storeManager */
  122. $storeManager = $this->objectManager->get(StoreManagerInterface::class);
  123. $storeManager->setCurrentStore($store->getId());
  124. $order = $this->getOrder('100000001');
  125. $order->setStoreId($store->getId());
  126. $this->creationService->expects(self::never())
  127. ->method('createForOrder');
  128. $event = $this->objectManager->create(
  129. Event::class,
  130. [
  131. 'data' => ['order' => $order],
  132. ]
  133. );
  134. /** @var Observer $observer */
  135. $observer = $this->objectManager->get(Observer::class);
  136. $observer->setEvent($event);
  137. $this->placeOrder->execute($observer);
  138. }
  139. /**
  140. * Checks a test case when observer event contains two orders:
  141. * one order with offline payment and one order with online payment.
  142. *
  143. * @covers \Magento\Signifyd\Observer\PlaceOrder::execute
  144. * @magentoConfigFixture current_store fraud_protection/signifyd/active 1
  145. * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
  146. */
  147. public function testExecuteWithMultipleOrders()
  148. {
  149. $orderWithOnlinePayment = $this->getOrder('100000001');
  150. $orderWithOfflinePayment = $this->getOrder('100000005');
  151. // this service mock should be called only once for the order with online payment method.
  152. $this->creationService->expects(self::once())
  153. ->method('createForOrder')
  154. ->with(self::equalTo($orderWithOnlinePayment->getEntityId()));
  155. $event = $this->objectManager->create(
  156. Event::class,
  157. [
  158. 'data' => ['orders' => [$orderWithOfflinePayment, $orderWithOnlinePayment]]
  159. ]
  160. );
  161. /** @var Observer $observer */
  162. $observer = $this->objectManager->get(Observer::class);
  163. $observer->setEvent($event);
  164. $this->placeOrder->execute($observer);
  165. }
  166. /**
  167. * Gets stored order.
  168. *
  169. * @param string $incrementId
  170. * @return OrderInterface
  171. */
  172. private function getOrder($incrementId)
  173. {
  174. /** @var SearchCriteriaBuilder $searchCriteriaBuilder */
  175. $searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
  176. $searchCriteria = $searchCriteriaBuilder->addFilter(OrderInterface::INCREMENT_ID, $incrementId)
  177. ->create();
  178. $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
  179. $orders = $orderRepository->getList($searchCriteria)
  180. ->getItems();
  181. $order = array_pop($orders);
  182. return $order;
  183. }
  184. }