CreationServiceTest.php 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Signifyd\Model\Guarantee;
  7. use Magento\Framework\App\ObjectManager;
  8. use Magento\Sales\Api\Data\OrderStatusHistoryInterface;
  9. use Magento\Sales\Api\OrderRepositoryInterface;
  10. use Magento\Signifyd\Api\CaseRepositoryInterface;
  11. use Magento\Signifyd\Api\Data\CaseInterface;
  12. use Magento\Signifyd\Model\SignifydGateway\Gateway;
  13. use Magento\Signifyd\Model\SignifydGateway\GatewayException;
  14. use Magento\TestFramework\Helper\Bootstrap;
  15. use PHPUnit\Framework\MockObject_MockObject as MockObject;
  16. use Psr\Log\LoggerInterface;
  17. /**
  18. * Contains positive and negative test cases for Signifyd case guarantee creation flow.
  19. */
  20. class CreationServiceTest extends \PHPUnit\Framework\TestCase
  21. {
  22. /**
  23. * @var CreationService
  24. */
  25. private $service;
  26. /**
  27. * @var Gateway|MockObject
  28. */
  29. private $gateway;
  30. /**
  31. * @var LoggerInterface|MockObject
  32. */
  33. private $logger;
  34. /**
  35. * @var ObjectManager
  36. */
  37. private $objectManager;
  38. /**
  39. * @inheritdoc
  40. */
  41. protected function setUp()
  42. {
  43. /** @var ObjectManager $objectManager */
  44. $this->objectManager = Bootstrap::getObjectManager();
  45. $this->gateway = $this->getMockBuilder(Gateway::class)
  46. ->disableOriginalConstructor()
  47. ->setMethods(['submitCaseForGuarantee'])
  48. ->getMock();
  49. $this->logger = $this->getMockBuilder(LoggerInterface::class)
  50. ->disableOriginalConstructor()
  51. ->getMock();
  52. $this->service = $this->objectManager->create(CreationService::class, [
  53. 'gateway' => $this->gateway,
  54. 'logger' => $this->logger
  55. ]);
  56. }
  57. /**
  58. * Checks a test case, when Signifyd case entity cannot be found
  59. * for a specified order.
  60. *
  61. * @covers \Magento\Signifyd\Model\Guarantee\CreationService::createForOrder
  62. */
  63. public function testCreateWithoutCaseEntity()
  64. {
  65. $orderId = 123;
  66. $this->gateway->expects(self::never())
  67. ->method('submitCaseForGuarantee');
  68. $result = $this->service->createForOrder($orderId);
  69. self::assertFalse($result);
  70. }
  71. /**
  72. * Checks a test case, when request is failing.
  73. *
  74. * @covers \Magento\Signifyd\Model\Guarantee\CreationService::createForOrder
  75. * @magentoDataFixture Magento/Signifyd/_files/case.php
  76. */
  77. public function testCreateWithFailedRequest()
  78. {
  79. $caseEntity = $this->getCaseEntity();
  80. $this->gateway->expects(self::once())
  81. ->method('submitCaseForGuarantee')
  82. ->willThrowException(new GatewayException('Something wrong'));
  83. $this->logger->expects(self::once())
  84. ->method('error')
  85. ->with('Something wrong');
  86. $result = $this->service->createForOrder($caseEntity->getOrderId());
  87. self::assertFalse($result);
  88. }
  89. /**
  90. * Checks a test case, when case entity is updated successfully.
  91. *
  92. * @covers \Magento\Signifyd\Model\Guarantee\CreationService::createForOrder
  93. * @magentoDataFixture Magento/Signifyd/_files/case.php
  94. * @magentoConfigFixture current_store fraud_protection/signifyd/active 1
  95. */
  96. public function testCreate()
  97. {
  98. $caseEntity = $this->getCaseEntity();
  99. $this->gateway->expects(self::once())
  100. ->method('submitCaseForGuarantee')
  101. ->with($caseEntity->getCaseId())
  102. ->willReturn(CaseInterface::GUARANTEE_IN_REVIEW);
  103. $this->logger->expects(self::never())
  104. ->method('error');
  105. $result = $this->service->createForOrder($caseEntity->getOrderId());
  106. self::assertTrue($result);
  107. $updatedCase = $this->getCaseEntity();
  108. self::assertEquals(CaseInterface::GUARANTEE_IN_REVIEW, $updatedCase->getGuaranteeDisposition());
  109. self::assertEquals(CaseInterface::STATUS_PROCESSING, $updatedCase->getStatus());
  110. /** @var OrderRepositoryInterface $orderRepository */
  111. $orderRepository = $this->objectManager->get(OrderRepositoryInterface::class);
  112. $order = $orderRepository->get($updatedCase->getOrderId());
  113. $histories = $order->getStatusHistories();
  114. self::assertNotEmpty($histories);
  115. /** @var OrderStatusHistoryInterface $caseCreationComment */
  116. $caseCreationComment = array_pop($histories);
  117. self::assertInstanceOf(OrderStatusHistoryInterface::class, $caseCreationComment);
  118. self::assertEquals('Case Update: Case is submitted for guarantee.', $caseCreationComment->getComment());
  119. }
  120. /**
  121. * Gets case entity.
  122. *
  123. * @return \Magento\Signifyd\Api\Data\CaseInterface|null
  124. */
  125. private function getCaseEntity()
  126. {
  127. /** @var CaseRepositoryInterface $caseRepository */
  128. $caseRepository = $this->objectManager->get(CaseRepositoryInterface::class);
  129. return $caseRepository->getByCaseId(123);
  130. }
  131. }