VaultTest.php 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Vault\Test\Unit\Model\Method;
  7. use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
  8. use Magento\Payment\Gateway\Command\CommandManagerInterface;
  9. use Magento\Payment\Gateway\Command\CommandManagerPoolInterface;
  10. use Magento\Payment\Gateway\Config\ValueHandlerInterface;
  11. use Magento\Payment\Gateway\Config\ValueHandlerPoolInterface;
  12. use Magento\Payment\Gateway\ConfigInterface;
  13. use Magento\Payment\Model\InfoInterface;
  14. use Magento\Payment\Model\MethodInterface;
  15. use Magento\Quote\Api\Data\CartInterface;
  16. use Magento\Sales\Api\Data\OrderPaymentExtensionInterface;
  17. use Magento\Sales\Api\Data\TransactionInterface;
  18. use Magento\Sales\Model\Order\Payment;
  19. use Magento\Vault\Api\Data\PaymentTokenInterface;
  20. use Magento\Vault\Api\PaymentTokenManagementInterface;
  21. use Magento\Vault\Model\Method\Vault;
  22. use Magento\Vault\Model\VaultPaymentInterface;
  23. use PHPUnit_Framework_MockObject_MockObject as MockObject;
  24. /**
  25. * Class VaultTest
  26. * @SuppressWarnings(PHPMD.CouplingBetweenObjects)
  27. */
  28. class VaultTest extends \PHPUnit\Framework\TestCase
  29. {
  30. /**
  31. * @var ObjectManager
  32. */
  33. private $objectManager;
  34. /**
  35. * @var MethodInterface|MockObject
  36. */
  37. private $vaultProvider;
  38. public function setUp()
  39. {
  40. $this->objectManager = new ObjectManager($this);
  41. $this->vaultProvider = $this->createMock(MethodInterface::class);
  42. }
  43. /**
  44. * @expectedException \DomainException
  45. * @expectedExceptionMessage Not implemented
  46. */
  47. public function testAuthorizeNotOrderPayment()
  48. {
  49. $paymentModel = $this->createMock(InfoInterface::class);
  50. /** @var Vault $model */
  51. $model = $this->objectManager->getObject(Vault::class);
  52. $model->authorize($paymentModel, 0);
  53. }
  54. /**
  55. * @param array $additionalInfo
  56. * @expectedException \LogicException
  57. * @expectedExceptionMessage Public hash should be defined
  58. * @dataProvider additionalInfoDataProvider
  59. */
  60. public function testAuthorizeNoTokenMetadata(array $additionalInfo)
  61. {
  62. $paymentModel = $this->getMockBuilder(Payment::class)
  63. ->disableOriginalConstructor()
  64. ->getMock();
  65. $paymentModel->expects(static::once())
  66. ->method('getAdditionalInformation')
  67. ->willReturn($additionalInfo);
  68. /** @var Vault $model */
  69. $model = $this->objectManager->getObject(Vault::class);
  70. $model->authorize($paymentModel, 0);
  71. }
  72. /**
  73. * Get list of additional information variations
  74. * @return array
  75. */
  76. public function additionalInfoDataProvider()
  77. {
  78. return [
  79. ['additionalInfo' => []],
  80. ['additionalInfo' => ['customer_id' => 1]],
  81. ['additionalInfo' => ['public_hash' => null]],
  82. ];
  83. }
  84. /**
  85. * @expectedException \LogicException
  86. * @expectedExceptionMessage No token found
  87. */
  88. public function testAuthorizeNoToken()
  89. {
  90. $customerId = 1;
  91. $publicHash = 'token_public_hash';
  92. $paymentModel = $this->getMockBuilder(Payment::class)
  93. ->disableOriginalConstructor()
  94. ->getMock();
  95. $tokenManagement = $this->createMock(PaymentTokenManagementInterface::class);
  96. $paymentModel->expects(static::once())
  97. ->method('getAdditionalInformation')
  98. ->willReturn(
  99. [
  100. PaymentTokenInterface::CUSTOMER_ID => $customerId,
  101. PaymentTokenInterface::PUBLIC_HASH => $publicHash
  102. ]
  103. );
  104. $tokenManagement->expects(static::once())
  105. ->method('getByPublicHash')
  106. ->with($publicHash, $customerId)
  107. ->willReturn(null);
  108. /** @var Vault $model */
  109. $model = $this->objectManager->getObject(
  110. Vault::class,
  111. [
  112. 'tokenManagement' => $tokenManagement
  113. ]
  114. );
  115. $model->authorize($paymentModel, 0);
  116. }
  117. public function testAuthorize()
  118. {
  119. $customerId = 1;
  120. $publicHash = 'token_public_hash';
  121. $vaultProviderCode = 'vault_provider_code';
  122. $amount = 10.01;
  123. $paymentModel = $this->getMockBuilder(Payment::class)
  124. ->disableOriginalConstructor()
  125. ->getMock();
  126. $extensionAttributes = $this->getMockBuilder(OrderPaymentExtensionInterface::class)
  127. ->setMethods(['setVaultPaymentToken'])
  128. ->getMockForAbstractClass();
  129. $commandManagerPool = $this->createMock(CommandManagerPoolInterface::class);
  130. $commandManager = $this->createMock(CommandManagerInterface::class);
  131. $tokenManagement = $this->createMock(PaymentTokenManagementInterface::class);
  132. $token = $this->createMock(PaymentTokenInterface::class);
  133. $paymentModel->expects(static::once())
  134. ->method('getAdditionalInformation')
  135. ->willReturn(
  136. [
  137. PaymentTokenInterface::CUSTOMER_ID => $customerId,
  138. PaymentTokenInterface::PUBLIC_HASH => $publicHash
  139. ]
  140. );
  141. $tokenManagement->expects(static::once())
  142. ->method('getByPublicHash')
  143. ->with($publicHash, $customerId)
  144. ->willReturn($token);
  145. $paymentModel->expects(static::once())
  146. ->method('getExtensionAttributes')
  147. ->willReturn($extensionAttributes);
  148. $extensionAttributes->expects(static::once())
  149. ->method('setVaultPaymentToken')
  150. ->with($token);
  151. $this->vaultProvider->expects(static::atLeastOnce())
  152. ->method('getCode')
  153. ->willReturn($vaultProviderCode);
  154. $commandManagerPool->expects(static::once())
  155. ->method('get')
  156. ->with($vaultProviderCode)
  157. ->willReturn($commandManager);
  158. $commandManager->expects(static::once())
  159. ->method('executeByCode')
  160. ->with(
  161. VaultPaymentInterface::VAULT_AUTHORIZE_COMMAND,
  162. $paymentModel,
  163. [
  164. 'amount' => $amount
  165. ]
  166. );
  167. $paymentModel->expects(static::once())
  168. ->method('setMethod')
  169. ->with($vaultProviderCode);
  170. /** @var Vault $model */
  171. $model = $this->objectManager->getObject(
  172. Vault::class,
  173. [
  174. 'tokenManagement' => $tokenManagement,
  175. 'commandManagerPool' => $commandManagerPool,
  176. 'vaultProvider' => $this->vaultProvider
  177. ]
  178. );
  179. $model->authorize($paymentModel, $amount);
  180. }
  181. /**
  182. * @expectedException \DomainException
  183. * @expectedExceptionMessage Not implemented
  184. */
  185. public function testCaptureNotOrderPayment()
  186. {
  187. $paymentModel = $this->createMock(InfoInterface::class);
  188. /** @var Vault $model */
  189. $model = $this->objectManager->getObject(Vault::class);
  190. $model->capture($paymentModel, 0);
  191. }
  192. /**
  193. * @expectedException \DomainException
  194. * @expectedExceptionMessage Capture can not be performed through vault
  195. */
  196. public function testCapture()
  197. {
  198. $paymentModel = $this->getMockBuilder(Payment::class)
  199. ->disableOriginalConstructor()
  200. ->getMock();
  201. $authorizationTransaction = $this->createMock(TransactionInterface::class);
  202. $paymentModel->expects(static::once())
  203. ->method('getAuthorizationTransaction')
  204. ->willReturn($authorizationTransaction);
  205. /** @var Vault $model */
  206. $model = $this->objectManager->getObject(Vault::class);
  207. $model->capture($paymentModel, 0);
  208. }
  209. /**
  210. * @covers \Magento\Vault\Model\Method\Vault::isAvailable
  211. * @dataProvider isAvailableDataProvider
  212. */
  213. public function testIsAvailable($isAvailableProvider, $isActive, $expected)
  214. {
  215. $storeId = 1;
  216. $quote = $this->getMockForAbstractClass(CartInterface::class);
  217. $config = $this->getMockForAbstractClass(ConfigInterface::class);
  218. $this->vaultProvider->expects(static::once())
  219. ->method('isAvailable')
  220. ->with($quote)
  221. ->willReturn($isAvailableProvider);
  222. $config->expects(static::any())
  223. ->method('getValue')
  224. ->with('active', $storeId)
  225. ->willReturn($isActive);
  226. $quote->expects(static::any())
  227. ->method('getStoreId')
  228. ->willReturn($storeId);
  229. /** @var Vault $model */
  230. $model = $this->objectManager->getObject(Vault::class, [
  231. 'config' => $config,
  232. 'vaultProvider' => $this->vaultProvider
  233. ]);
  234. $actual = $model->isAvailable($quote);
  235. static::assertEquals($expected, $actual);
  236. }
  237. /**
  238. * List of variations for testing isAvailable method
  239. * @return array
  240. */
  241. public function isAvailableDataProvider()
  242. {
  243. return [
  244. ['isAvailableProvider' => true, 'isActiveVault' => false, 'expected' => false],
  245. ['isAvailableProvider' => false, 'isActiveVault' => false, 'expected' => false],
  246. ['isAvailableProvider' => false, 'isActiveVault' => true, 'expected' => false],
  247. ['isAvailableProvider' => true, 'isActiveVault' => true, 'expected' => true],
  248. ];
  249. }
  250. /**
  251. * @covers \Magento\Vault\Model\Method\Vault::isAvailable
  252. */
  253. public function testIsAvailableWithoutQuote()
  254. {
  255. $quote = null;
  256. $config = $this->getMockForAbstractClass(ConfigInterface::class);
  257. $this->vaultProvider->expects(static::once())
  258. ->method('isAvailable')
  259. ->with($quote)
  260. ->willReturn(true);
  261. $config->expects(static::once())
  262. ->method('getValue')
  263. ->with('active', $quote)
  264. ->willReturn(false);
  265. /** @var Vault $model */
  266. $model = $this->objectManager->getObject(Vault::class, [
  267. 'config' => $config,
  268. 'vaultProvider' => $this->vaultProvider
  269. ]);
  270. static::assertFalse($model->isAvailable($quote));
  271. }
  272. /**
  273. * @covers \Magento\Vault\Model\Method\Vault::canUseInternal
  274. * @param bool|null $configValue
  275. * @param bool|null $paymentValue
  276. * @param bool $expected
  277. * @dataProvider internalUsageDataProvider
  278. */
  279. public function testCanUseInternal($configValue, $paymentValue, $expected)
  280. {
  281. $handlerPool = $this->createMock(ValueHandlerPoolInterface::class);
  282. $handler = $this->createMock(ValueHandlerInterface::class);
  283. $handlerPool->expects(static::once())
  284. ->method('get')
  285. ->with('can_use_internal')
  286. ->willReturn($handler);
  287. $handler->expects(static::once())
  288. ->method('handle')
  289. ->with(['field' => 'can_use_internal'], null)
  290. ->willReturn($configValue);
  291. $this->vaultProvider->expects(static::any())
  292. ->method('canUseInternal')
  293. ->willReturn($paymentValue);
  294. /** @var Vault $model */
  295. $model = $this->objectManager->getObject(Vault::class, [
  296. 'vaultProvider' => $this->vaultProvider,
  297. 'valueHandlerPool' => $handlerPool,
  298. ]);
  299. static::assertEquals($expected, $model->canUseInternal());
  300. }
  301. /**
  302. * Get list of variations for testing canUseInternal method
  303. * @return array
  304. */
  305. public function internalUsageDataProvider()
  306. {
  307. return [
  308. ['configValue' => true, 'paymentValue' => true, 'expected' => true],
  309. ['configValue' => true, 'paymentValue' => null, 'expected' => true],
  310. ['configValue' => true, 'paymentValue' => false, 'expected' => true],
  311. ['configValue' => false, 'paymentValue' => true, 'expected' => false],
  312. ['configValue' => false, 'paymentValue' => false, 'expected' => false],
  313. ['configValue' => null, 'paymentValue' => true, 'expected' => true],
  314. ['configValue' => null, 'paymentValue' => false, 'expected' => false],
  315. ['configValue' => null, 'paymentValue' => null, 'expected' => false],
  316. ];
  317. }
  318. }