CreateCaseBuilderTest.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Signifyd\Model\SignifydGateway\Request;
  7. use Magento\Framework\Config\ScopeInterface;
  8. use Magento\Signifyd\Model\SignifydOrderSessionId;
  9. use Magento\TestFramework\Helper\Bootstrap;
  10. use Magento\Framework\App\Area;
  11. use Magento\Framework\Intl\DateTimeFactory;
  12. use Magento\Framework\ObjectManagerInterface;
  13. use Magento\Sales\Model\Order;
  14. use Magento\Customer\Api\CustomerRepositoryInterface;
  15. use Magento\Framework\App\ProductMetadataInterface;
  16. /**
  17. * Class CreateCaseBuilderTest
  18. * @magentoAppIsolation enabled
  19. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  20. */
  21. class CreateCaseBuilderTest extends \PHPUnit\Framework\TestCase
  22. {
  23. /**
  24. * @var ObjectManagerInterface
  25. */
  26. private $objectManager;
  27. /**
  28. * @var CreateCaseBuilder
  29. */
  30. private $caseBuilder;
  31. /**
  32. * @var DateTimeFactory
  33. */
  34. private $dateTimeFactory;
  35. /**
  36. * Initial setup
  37. */
  38. protected function setUp()
  39. {
  40. $bootstrap = Bootstrap::getInstance();
  41. $bootstrap->loadArea(Area::AREA_FRONTEND);
  42. $this->objectManager = Bootstrap::getObjectManager();
  43. $this->dateTimeFactory = $this->objectManager->create(DateTimeFactory::class);
  44. $this->caseBuilder = $this->objectManager->create(CreateCaseBuilder::class);
  45. }
  46. /**
  47. * Test builder on order with customer, simple product, frontend area,
  48. * PayPal gateway, shipping and billing addresses, with two orders
  49. *
  50. * @covers \Magento\Signifyd\Model\SignifydGateway\Request\CreateCaseBuilder::build()
  51. * @magentoDataFixture Magento/Signifyd/_files/order_with_customer_and_two_simple_products.php
  52. * @SuppressWarnings(PHPMD.ExcessiveMethodLength)
  53. */
  54. public function testCreateCaseBuilderWithFullSetOfData()
  55. {
  56. /** @var Order $order */
  57. $order = $this->objectManager->create(Order::class);
  58. $order->loadByIncrementId('100000001');
  59. $orderItems = $order->getAllItems();
  60. $payment = $order->getPayment();
  61. $billingAddress = $order->getBillingAddress();
  62. $shippingAddress = $order->getShippingAddress();
  63. /** @var CustomerRepositoryInterface $customerRepository */
  64. $customerRepository = $this->objectManager->create(CustomerRepositoryInterface::class);
  65. $customer = $customerRepository->getById($order->getCustomerId());
  66. $productMetadata = $this->objectManager->create(ProductMetadataInterface::class);
  67. /** @var SignifydOrderSessionId $signifydOrderSessionId */
  68. $signifydOrderSessionId = $this->objectManager->create(SignifydOrderSessionId::class);
  69. $expected = [
  70. 'purchase' => [
  71. 'orderSessionId' => $signifydOrderSessionId->get($order->getQuoteId()),
  72. 'browserIpAddress' => $order->getRemoteIp(),
  73. 'orderId' => $order->getIncrementId(),
  74. 'createdAt' => date('c', strtotime(date('Y-m-d 00:00:55'))),
  75. 'paymentGateway' => 'paypal_account',
  76. 'transactionId' => $payment->getLastTransId(),
  77. 'currency' => $order->getOrderCurrencyCode(),
  78. 'avsResponseCode' => '',
  79. 'cvvResponseCode' => '',
  80. 'orderChannel' => 'WEB',
  81. 'totalPrice' => $order->getGrandTotal(),
  82. 'shipments' => [
  83. 0 => [
  84. 'shipper' => 'Flat Rate',
  85. 'shippingMethod' => 'Fixed',
  86. 'shippingPrice' => $order->getShippingAmount()
  87. ]
  88. ],
  89. 'products' => [
  90. 0 => [
  91. 'itemId' => $orderItems[0]->getSku(),
  92. 'itemName' => $orderItems[0]->getName(),
  93. 'itemPrice' => $orderItems[0]->getPrice(),
  94. 'itemQuantity' => $orderItems[0]->getQtyOrdered(),
  95. 'itemUrl' => $orderItems[0]->getProduct()->getProductUrl(),
  96. 'itemWeight' => $orderItems[0]->getProduct()->getWeight()
  97. ],
  98. 1 => [
  99. 'itemId' => $orderItems[1]->getSku(),
  100. 'itemName' => $orderItems[1]->getName(),
  101. 'itemPrice' => $orderItems[1]->getPrice(),
  102. 'itemQuantity' => $orderItems[1]->getQtyOrdered(),
  103. 'itemUrl' => $orderItems[1]->getProduct()->getProductUrl(),
  104. 'itemWeight' => $orderItems[1]->getProduct()->getWeight()
  105. ]
  106. ],
  107. 'paymentMethod' => 'PAYPAL_ACCOUNT'
  108. ],
  109. 'card' => [
  110. 'cardHolderName' => 'firstname lastname',
  111. 'last4' => $payment->getCcLast4(),
  112. 'expiryMonth' => $payment->getCcExpMonth(),
  113. 'expiryYear' => $payment->getCcExpYear(),
  114. 'billingAddress' => [
  115. 'streetAddress' => 'street',
  116. 'city' => $billingAddress->getCity(),
  117. 'provinceCode' => $billingAddress->getRegionCode(),
  118. 'postalCode' => $billingAddress->getPostcode(),
  119. 'countryCode' => $billingAddress->getCountryId(),
  120. 'unit' => ''
  121. ]
  122. ],
  123. 'recipient' => [
  124. 'fullName' => $shippingAddress->getName(),
  125. 'confirmationEmail' => $shippingAddress->getEmail(),
  126. 'confirmationPhone' => $shippingAddress->getTelephone(),
  127. 'deliveryAddress' => [
  128. 'streetAddress' => '6161 West Centinela Avenue',
  129. 'unit' => 'app. 33',
  130. 'city' => $shippingAddress->getCity(),
  131. 'provinceCode' => $shippingAddress->getRegionCode(),
  132. 'postalCode' => $shippingAddress->getPostcode(),
  133. 'countryCode' => $shippingAddress->getCountryId()
  134. ]
  135. ],
  136. 'userAccount' => [
  137. 'email' => $customer->getEmail(),
  138. 'username' => $customer->getEmail(),
  139. 'phone' => $order->getBillingAddress()->getTelephone(),
  140. 'accountNumber' => $customer->getId(),
  141. 'createdDate' => $this->formatDate($customer->getCreatedAt()),
  142. 'lastUpdateDate' => $this->formatDate($customer->getUpdatedAt()),
  143. 'aggregateOrderCount' => 2,
  144. 'aggregateOrderDollars' => 150.0
  145. ],
  146. 'seller' => $this->getSellerData(),
  147. 'platformAndClient' => [
  148. 'storePlatform' => $productMetadata->getName() . ' ' . $productMetadata->getEdition(),
  149. 'storePlatformVersion' => $productMetadata->getVersion(),
  150. 'signifydClientApp' => $productMetadata->getName(),
  151. 'signifydClientAppVersion' => '1.0'
  152. ]
  153. ];
  154. self::assertEquals(
  155. $expected,
  156. $this->caseBuilder->build($order->getEntityId())
  157. );
  158. }
  159. /**
  160. * Test builder on order with guest, virtual product, admin area,
  161. * none PayPal gateway, no shipping address, without credit card data
  162. *
  163. * @covers \Magento\Signifyd\Model\SignifydGateway\Request\CreateCaseBuilder::build()
  164. * @magentoDataFixture Magento/Signifyd/_files/order_with_guest_and_virtual_product.php
  165. */
  166. public function testCreateCaseBuilderWithVirtualProductAndGuest()
  167. {
  168. /** @var Order $order */
  169. $order = $this->objectManager->create(Order::class);
  170. $order->loadByIncrementId('100000002');
  171. $scope = $this->objectManager->get(ScopeInterface::class);
  172. $scope->setCurrentScope(Area::AREA_ADMINHTML);
  173. $orderItems = $order->getAllItems();
  174. $product = $orderItems[0]->getProduct();
  175. $payment = $order->getPayment();
  176. $billingAddress = $order->getBillingAddress();
  177. $productMetadata = $this->objectManager->create(ProductMetadataInterface::class);
  178. /** @var SignifydOrderSessionId $quoteSessionId */
  179. $quoteSessionId = $this->objectManager->create(SignifydOrderSessionId::class);
  180. $expected = [
  181. 'purchase' => [
  182. 'orderSessionId' => $quoteSessionId->get($order->getQuoteId()),
  183. 'browserIpAddress' => $order->getRemoteIp(),
  184. 'orderId' => $order->getIncrementId(),
  185. 'createdAt' => '2016-12-12T12:00:55+00:00',
  186. 'paymentGateway' => $payment->getMethod(),
  187. 'transactionId' => $payment->getLastTransId(),
  188. 'currency' => $order->getOrderCurrencyCode(),
  189. 'avsResponseCode' => 'Y',
  190. 'cvvResponseCode' => 'M',
  191. 'orderChannel' => 'PHONE',
  192. 'totalPrice' => $order->getGrandTotal(),
  193. 'products' => [
  194. 0 => [
  195. 'itemId' => $orderItems[0]->getSku(),
  196. 'itemName' => $orderItems[0]->getName(),
  197. 'itemPrice' => $orderItems[0]->getPrice(),
  198. 'itemQuantity' => $orderItems[0]->getQtyOrdered(),
  199. 'itemUrl' => $product->getProductUrl()
  200. ],
  201. ],
  202. 'paymentMethod' => 'PAYMENT_CARD'
  203. ],
  204. 'card' => [
  205. 'cardHolderName' => 'firstname lastname',
  206. 'billingAddress' => [
  207. 'streetAddress' => 'street',
  208. 'city' => $billingAddress->getCity(),
  209. 'provinceCode' => $billingAddress->getRegionCode(),
  210. 'postalCode' => $billingAddress->getPostcode(),
  211. 'countryCode' => $billingAddress->getCountryId(),
  212. 'unit' => ''
  213. ]
  214. ],
  215. 'seller' => $this->getSellerData(),
  216. 'platformAndClient' => [
  217. 'storePlatform' => $productMetadata->getName() . ' ' . $productMetadata->getEdition(),
  218. 'storePlatformVersion' => $productMetadata->getVersion(),
  219. 'signifydClientApp' => $productMetadata->getName(),
  220. 'signifydClientAppVersion' => '1.0'
  221. ]
  222. ];
  223. self::assertEquals(
  224. $expected,
  225. $this->caseBuilder->build($order->getEntityId())
  226. );
  227. }
  228. /**
  229. * Return seller data according to fixture
  230. *
  231. * @return array
  232. */
  233. private function getSellerData()
  234. {
  235. return [
  236. 'name' => 'Sample Store',
  237. 'domain' => 'm2.com',
  238. 'shipFromAddress' => [
  239. 'streetAddress' => '6161 West Centinela Avenue',
  240. 'unit' => 'app. 111',
  241. 'city' => 'Culver City',
  242. 'provinceCode' => 'AE',
  243. 'postalCode' => '90230',
  244. 'countryCode' => 'US',
  245. ],
  246. 'corporateAddress' => [
  247. 'streetAddress' => '5th Avenue',
  248. 'unit' => '75',
  249. 'city' => 'New York',
  250. 'provinceCode' => 'MH',
  251. 'postalCode' => '19032',
  252. 'countryCode' => 'US',
  253. ],
  254. ];
  255. }
  256. /**
  257. * Format date in ISO8601
  258. *
  259. * @param string $date
  260. * @return string
  261. */
  262. private function formatDate($date)
  263. {
  264. $result = $this->dateTimeFactory->create(
  265. $date,
  266. new \DateTimeZone('UTC')
  267. );
  268. return $result->format(\DateTime::ATOM);
  269. }
  270. }