UpdatingServiceTest.php 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Signifyd\Model\CaseServices;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Sales\Api\Data\OrderStatusHistoryInterface;
  9. use Magento\Sales\Api\OrderRepositoryInterface;
  10. use Magento\Sales\Model\Order;
  11. use Magento\Sales\Model\ResourceModel\Order\Grid\Collection;
  12. use Magento\Signifyd\Api\CaseRepositoryInterface;
  13. use Magento\Signifyd\Api\Data\CaseInterface;
  14. use Magento\Signifyd\Model\MessageGenerators\GeneratorFactory;
  15. use Magento\TestFramework\Helper\Bootstrap;
  16. /**
  17. * Contains tests for case entity updating service.
  18. */
  19. class UpdatingServiceTest extends \PHPUnit\Framework\TestCase
  20. {
  21. /**
  22. * @var ObjectManager
  23. */
  24. private $objectManager;
  25. /**
  26. * @var UpdatingService
  27. */
  28. private $service;
  29. /**
  30. * @inheritdoc
  31. */
  32. protected function setUp()
  33. {
  34. $this->objectManager = Bootstrap::getObjectManager();
  35. /** @var GeneratorFactory $messageFactory */
  36. $messageFactory = $this->objectManager->get(GeneratorFactory::class);
  37. $messageGenerator = $messageFactory->create('cases/creation');
  38. $this->service = $this->objectManager->create(UpdatingService::class, [
  39. 'messageGenerator' => $messageGenerator
  40. ]);
  41. }
  42. /**
  43. * Checks case updating flow and messages in order comments history.
  44. * Also checks that order is unholded when case guarantee disposition is APPROVED.
  45. *
  46. * @covers \Magento\Signifyd\Model\CaseServices\UpdatingService::update
  47. * @magentoDataFixture Magento/Signifyd/_files/case.php
  48. */
  49. public function testUpdate()
  50. {
  51. $caseId = 123;
  52. $data = [
  53. 'caseId' => $caseId,
  54. 'score' => 750,
  55. 'orderId' => '100000001',
  56. 'reviewDisposition' => CaseInterface::DISPOSITION_FRAUDULENT,
  57. 'associatedTeam' => [
  58. 'teamName' => 'AnyTeam',
  59. 'teamId' => 26,
  60. 'getAutoDismiss' => true,
  61. 'getTeamDismissalDays' => 2
  62. ],
  63. 'createdAt' => '2017-01-05T14:23:26-0800',
  64. 'updatedAt' => '2017-01-05T14:44:26-0800',
  65. 'guaranteeDisposition' => CaseInterface::GUARANTEE_APPROVED
  66. ];
  67. /** @var CaseRepositoryInterface $caseRepository */
  68. $caseRepository = $this->objectManager->get(CaseRepositoryInterface::class);
  69. /** @var CaseInterface $caseEntity */
  70. $caseEntity = $caseRepository->getByCaseId($caseId);
  71. $this->service->update($caseEntity, $data);
  72. $caseEntity = $caseRepository->getByCaseId($caseId);
  73. $orderEntityId = $caseEntity->getOrderId();
  74. $gridGuarantyStatus = $this->getOrderGridGuarantyStatus($orderEntityId);
  75. self::assertNotEmpty($caseEntity);
  76. self::assertEquals('2017-01-05 22:23:26', $caseEntity->getCreatedAt());
  77. self::assertEquals(CaseInterface::GUARANTEE_APPROVED, $caseEntity->getGuaranteeDisposition());
  78. self::assertEquals('AnyTeam', $caseEntity->getAssociatedTeam()['teamName']);
  79. self::assertEquals(true, $caseEntity->isGuaranteeEligible());
  80. self::assertEquals(CaseInterface::STATUS_PROCESSING, $caseEntity->getStatus());
  81. self::assertEquals($orderEntityId, $caseEntity->getOrderId());
  82. self::assertEquals(
  83. $gridGuarantyStatus,
  84. $caseEntity->getGuaranteeDisposition(),
  85. 'Signifyd guaranty status in sales_order_grid table does not match case entity guaranty status'
  86. );
  87. /** @var OrderRepositoryInterface $orderRepository */
  88. $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
  89. $order = $orderRepository->get($caseEntity->getOrderId());
  90. self::assertEquals(Order::STATE_PROCESSING, $order->getState());
  91. $histories = $order->getStatusHistories();
  92. self::assertNotEmpty($histories);
  93. /** @var OrderStatusHistoryInterface $caseCreationComment */
  94. $caseCreationComment = array_pop($histories);
  95. self::assertInstanceOf(OrderStatusHistoryInterface::class, $caseCreationComment);
  96. self::assertEquals("Signifyd Case $caseId has been created for order.", $caseCreationComment->getComment());
  97. }
  98. /**
  99. * Checks that order is holded when case guarantee disposition is DECLINED.
  100. *
  101. * @covers \Magento\Signifyd\Model\CaseServices\UpdatingService::update
  102. * @magentoDataFixture Magento/Signifyd/_files/approved_case.php
  103. */
  104. public function testOrderStateAfterDeclinedGuaranteeDisposition()
  105. {
  106. $caseId = 123;
  107. $data = [
  108. 'caseId' => $caseId,
  109. 'orderId' => '100000001',
  110. 'guaranteeDisposition' => CaseInterface::GUARANTEE_DECLINED
  111. ];
  112. /** @var CaseRepositoryInterface $caseRepository */
  113. $caseRepository = $this->objectManager->get(CaseRepositoryInterface::class);
  114. $caseEntity = $caseRepository->getByCaseId($caseId);
  115. $this->service->update($caseEntity, $data);
  116. /** @var OrderRepositoryInterface $orderRepository */
  117. $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
  118. $order = $orderRepository->get($caseEntity->getOrderId());
  119. self::assertEquals(Order::STATE_HOLDED, $order->getState());
  120. }
  121. /**
  122. * Checks that order doesn't become holded
  123. * when previous case guarantee disposition was DECLINED
  124. * and webhook without guarantee disposition was received.
  125. *
  126. * @covers \Magento\Signifyd\Model\CaseServices\UpdatingService::update
  127. * @magentoDataFixture Magento/Signifyd/_files/declined_case.php
  128. */
  129. public function testOrderStateAfterWebhookWithoutGuaranteeDisposition()
  130. {
  131. $caseId = 123;
  132. $data = [
  133. 'caseId' => $caseId,
  134. 'orderId' => '100000001'
  135. ];
  136. /** @var CaseRepositoryInterface $caseRepository */
  137. $caseRepository = $this->objectManager->get(CaseRepositoryInterface::class);
  138. $caseEntity = $caseRepository->getByCaseId($caseId);
  139. $this->service->update($caseEntity, $data);
  140. /** @var OrderRepositoryInterface $orderRepository */
  141. $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
  142. $order = $orderRepository->get($caseEntity->getOrderId());
  143. self::assertEquals(Order::STATE_PROCESSING, $order->getState());
  144. }
  145. /**
  146. * Returns value of signifyd_guarantee_status column from sales order grid
  147. *
  148. * @param int $orderEntityId
  149. * @return string|null
  150. */
  151. private function getOrderGridGuarantyStatus($orderEntityId)
  152. {
  153. /** @var Collection $orderGridCollection */
  154. $orderGridCollection = $this->objectManager->get(Collection::class);
  155. $items = $orderGridCollection->addFilter($orderGridCollection->getIdFieldName(), $orderEntityId)
  156. ->getItems();
  157. $result = array_pop($items);
  158. return isset($result['signifyd_guarantee_status']) ? $result['signifyd_guarantee_status'] : null;
  159. }
  160. }