diff --git a/app/code/Magento/Braintree/Model/Ui/Adminhtml/PayPal/TokenUiComponentProvider.php b/app/code/Magento/Braintree/Model/Ui/Adminhtml/PayPal/TokenUiComponentProvider.php new file mode 100644 index 0000000000000000000000000000000000000000..fd94e18e2cd94b4e4abca81c28d5dcf90c56ff92 --- /dev/null +++ b/app/code/Magento/Braintree/Model/Ui/Adminhtml/PayPal/TokenUiComponentProvider.php @@ -0,0 +1,84 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Braintree\Model\Ui\Adminhtml\PayPal; + +use Magento\Braintree\Gateway\Config\PayPal\Config; +use Magento\Braintree\Model\Ui\ConfigProvider; +use Magento\Braintree\Model\Ui\PayPal\ConfigProvider as PayPalConfigProvider; +use Magento\Framework\UrlInterface; +use Magento\Framework\View\Element\Template; +use Magento\Vault\Api\Data\PaymentTokenInterface; +use Magento\Vault\Model\Ui\TokenUiComponentInterfaceFactory; +use Magento\Vault\Model\Ui\TokenUiComponentProviderInterface; + +/** + * Gets Ui component configuration for Braintree PayPal Vault + */ +class TokenUiComponentProvider implements TokenUiComponentProviderInterface +{ + + /** + * @var TokenUiComponentInterfaceFactory + */ + private $componentFactory; + + /** + * @var UrlInterface + */ + private $urlBuilder; + + /** + * @var Config + */ + private $config; + + /** + * @param TokenUiComponentInterfaceFactory $componentFactory + * @param UrlInterface $urlBuilder + * @param Config $config + */ + public function __construct( + TokenUiComponentInterfaceFactory $componentFactory, + UrlInterface $urlBuilder, + Config $config + ) { + $this->componentFactory = $componentFactory; + $this->urlBuilder = $urlBuilder; + $this->config = $config; + } + + /** + * @inheritdoc + */ + public function getComponentForToken(PaymentTokenInterface $paymentToken) + { + $data = json_decode($paymentToken->getTokenDetails() ?: '{}', true); + $data['icon'] = $this->config->getPayPalIcon(); + $component = $this->componentFactory->create( + [ + 'config' => [ + 'code' => PayPalConfigProvider::PAYPAL_VAULT_CODE, + 'nonceUrl' => $this->getNonceRetrieveUrl(), + TokenUiComponentProviderInterface::COMPONENT_DETAILS => $data, + TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH => $paymentToken->getPublicHash(), + 'template' => 'Magento_Braintree::form/paypal/vault.phtml' + ], + 'name' => Template::class + ] + ); + + return $component; + } + + /** + * Get url to retrieve payment method nonce + * @return string + */ + private function getNonceRetrieveUrl() + { + return $this->urlBuilder->getUrl(ConfigProvider::CODE . '/payment/getnonce', ['_secure' => true]); + } +} diff --git a/app/code/Magento/Braintree/Model/Ui/Adminhtml/TokenUiComponentProvider.php b/app/code/Magento/Braintree/Model/Ui/Adminhtml/TokenUiComponentProvider.php index 6cfc96ea23d0d158646c4e30be4f63aeb8ca2cd0..420b8365b3ea4f64de1ad6008238c4a706aaa4b6 100644 --- a/app/code/Magento/Braintree/Model/Ui/Adminhtml/TokenUiComponentProvider.php +++ b/app/code/Magento/Braintree/Model/Ui/Adminhtml/TokenUiComponentProvider.php @@ -49,6 +49,7 @@ class TokenUiComponentProvider implements TokenUiComponentProviderInterface $component = $this->componentFactory->create( [ 'config' => [ + 'code' => ConfigProvider::CC_VAULT_CODE, 'nonceUrl' => $this->getNonceRetrieveUrl(), TokenUiComponentProviderInterface::COMPONENT_DETAILS => $data, TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH => $paymentToken->getPublicHash(), diff --git a/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/PayPal/TokenUiComponentProviderTest.php b/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/PayPal/TokenUiComponentProviderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..bdc39cbc5b868b52484cd550c833cfa147e68407 --- /dev/null +++ b/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/PayPal/TokenUiComponentProviderTest.php @@ -0,0 +1,114 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Braintree\Test\Unit\Model\Ui\Adminhtml\PayPal; + +use Magento\Braintree\Gateway\Config\PayPal\Config; +use Magento\Braintree\Model\Ui\Adminhtml\PayPal\TokenUiComponentProvider; +use Magento\Framework\UrlInterface; +use Magento\Vault\Api\Data\PaymentTokenInterface; +use Magento\Vault\Model\Ui\TokenUiComponentInterface; +use Magento\Vault\Model\Ui\TokenUiComponentInterfaceFactory; +use PHPUnit_Framework_MockObject_MockObject as MockObject; + +/** + * Contains methods to test PayPal token Ui component provider + */ +class TokenUiComponentProviderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var TokenUiComponentInterfaceFactory|MockObject + */ + private $componentFactory; + + /** + * @var UrlInterface|MockObject + */ + private $urlBuilder; + + /** + * @var Config|MockObject + */ + private $config; + + /** + * @var TokenUiComponentProvider + */ + private $tokenUiComponentProvider; + + protected function setUp() + { + $this->componentFactory = $this->getMockBuilder(TokenUiComponentInterfaceFactory::class) + ->disableOriginalConstructor() + ->setMethods(['create']) + ->getMock(); + + $this->urlBuilder = $this->getMock(UrlInterface::class); + + $this->config = $this->getMockBuilder(Config::class) + ->disableOriginalConstructor() + ->setMethods(['getPayPalIcon']) + ->getMock(); + + $this->tokenUiComponentProvider = new TokenUiComponentProvider( + $this->componentFactory, + $this->urlBuilder, + $this->config + ); + } + + /** + * @covers \Magento\Braintree\Model\Ui\Adminhtml\PayPal\TokenUiComponentProvider::getComponentForToken + */ + public function testGetComponentForToken() + { + $nonceUrl = 'https://payment/adminhtml/nonce/url'; + $payerEmail = 'john.doe@test.com'; + $icon = [ + 'url' => 'https://payment/adminhtml/icon.png', + 'width' => 48, + 'height' => 32 + ]; + + $expected = [ + 'code' => 'vault', + 'nonceUrl' => $nonceUrl, + 'details' => [ + 'payerEmail' => $payerEmail, + 'icon' => $icon + ], + 'template' => 'vault.phtml' + ]; + + $this->config->expects(static::once()) + ->method('getPayPalIcon') + ->willReturn($icon); + + $paymentToken = $this->getMock(PaymentTokenInterface::class); + $paymentToken->expects(static::once()) + ->method('getTokenDetails') + ->willReturn('{"payerEmail":" ' . $payerEmail . '"}'); + $paymentToken->expects(static::once()) + ->method('getPublicHash') + ->willReturn('cmk32dl21l'); + + $this->urlBuilder->expects(static::once()) + ->method('getUrl') + ->willReturn($nonceUrl); + + $tokenComponent = $this->getMock(TokenUiComponentInterface::class); + $tokenComponent->expects(static::once()) + ->method('getConfig') + ->willReturn($expected); + + $this->componentFactory->expects(static::once()) + ->method('create') + ->willReturn($tokenComponent); + + $component = $this->tokenUiComponentProvider->getComponentForToken($paymentToken); + static::assertEquals($tokenComponent, $component); + static::assertEquals($expected, $component->getConfig()); + } +} diff --git a/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/TokenUiComponentProviderTest.php b/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/TokenUiComponentProviderTest.php index d1665c71804cfa0c4ce8d1a6d2db96e09afd932c..f159136cf4c460d43b9191b58b536ff646da8b9c 100644 --- a/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/TokenUiComponentProviderTest.php +++ b/app/code/Magento/Braintree/Test/Unit/Model/Ui/Adminhtml/TokenUiComponentProviderTest.php @@ -7,10 +7,10 @@ namespace Magento\Braintree\Test\Unit\Model\Ui\Adminhtml; use Magento\Braintree\Model\Ui\Adminhtml\TokenUiComponentProvider; use Magento\Framework\UrlInterface; -use Magento\Framework\View\Element\Template; use Magento\Vault\Api\Data\PaymentTokenInterface; use Magento\Vault\Model\Ui\TokenUiComponentInterface; use Magento\Vault\Model\Ui\TokenUiComponentInterfaceFactory; +use PHPUnit_Framework_MockObject_MockObject as MockObject; /** * Class TokenUiComponentProviderTest @@ -19,12 +19,12 @@ class TokenUiComponentProviderTest extends \PHPUnit_Framework_TestCase { /** - * @var TokenUiComponentInterfaceFactory|\PHPUnit_Framework_MockObject_MockObject + * @var TokenUiComponentInterfaceFactory|MockObject */ private $componentFactory; /** - * @var UrlInterface|\PHPUnit_Framework_MockObject_MockObject + * @var UrlInterface|MockObject */ private $urlBuilder; @@ -59,6 +59,7 @@ class TokenUiComponentProviderTest extends \PHPUnit_Framework_TestCase $expirationDate = '12/2015'; $expected = [ + 'code' => 'vault', 'nonceUrl' => $nonceUrl, 'details' => [ 'type' => $type, diff --git a/app/code/Magento/Braintree/etc/adminhtml/di.xml b/app/code/Magento/Braintree/etc/adminhtml/di.xml index f252b977f20bd8b8616c7ddd90c08dd7ad0c5435..d154aabbb01b5cdd9db9beba05481c167fbec65d 100644 --- a/app/code/Magento/Braintree/etc/adminhtml/di.xml +++ b/app/code/Magento/Braintree/etc/adminhtml/di.xml @@ -47,6 +47,7 @@ <arguments> <argument name="tokenUiComponentProviders" xsi:type="array"> <item name="braintree" xsi:type="object">Magento\Braintree\Model\Ui\Adminhtml\TokenUiComponentProvider</item> + <item name="braintree_paypal" xsi:type="object">Magento\Braintree\Model\Ui\Adminhtml\PayPal\TokenUiComponentProvider</item> </argument> </arguments> </type> diff --git a/app/code/Magento/Braintree/etc/config.xml b/app/code/Magento/Braintree/etc/config.xml index 095a8419c8529f20beb5f9a2be4499bade1f1301..bf19324ae7a0225b82106f26f291462b9d1e0b12 100644 --- a/app/code/Magento/Braintree/etc/config.xml +++ b/app/code/Magento/Braintree/etc/config.xml @@ -71,7 +71,8 @@ </braintree_cc_vault> <braintree_paypal_vault> <model>BraintreePayPalVaultFacade</model> - <title>Vault Token (Braintree PayPal)</title> + <title>Stored Accounts (Braintree PayPal)</title> + <can_use_internal>1</can_use_internal> </braintree_paypal_vault> </payment> </default> diff --git a/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_index.xml b/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_index.xml index 571c5ededeb993fd0e45d91cc2d1512d531179de..5e4f36e1c1fb4d4916e620cb440829357b1071ea 100644 --- a/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_index.xml +++ b/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_index.xml @@ -18,6 +18,10 @@ <argument name="method" xsi:type="string">braintree_cc_vault</argument> <argument name="template" xsi:type="string">Magento_Vault::form/vault.phtml</argument> </action> + <action method="setMethodFormTemplate"> + <argument name="method" xsi:type="string">braintree_paypal_vault</argument> + <argument name="template" xsi:type="string">Magento_Vault::form/vault.phtml</argument> + </action> </referenceBlock> <referenceBlock name="content"> <block name="braintree_payment_script" diff --git a/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml b/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml index 68e0abc0cd009d9c2a30dff4cb545aa1b85f151c..579b82c61f690ed59bf94423e4aab00348a1546e 100644 --- a/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml +++ b/app/code/Magento/Braintree/view/adminhtml/layout/sales_order_create_load_block_billing_method.xml @@ -18,6 +18,10 @@ <argument name="method" xsi:type="string">braintree_cc_vault</argument> <argument name="template" xsi:type="string">Magento_Vault::form/vault.phtml</argument> </action> + <action method="setMethodFormTemplate"> + <argument name="method" xsi:type="string">braintree_paypal_vault</argument> + <argument name="template" xsi:type="string">Magento_Vault::form/vault.phtml</argument> + </action> </referenceBlock> </body> </page> \ No newline at end of file diff --git a/app/code/Magento/Braintree/view/adminhtml/templates/form/paypal/vault.phtml b/app/code/Magento/Braintree/view/adminhtml/templates/form/paypal/vault.phtml new file mode 100644 index 0000000000000000000000000000000000000000..22930bbc656660efb6f5981fd2fb8e137ac591df --- /dev/null +++ b/app/code/Magento/Braintree/view/adminhtml/templates/form/paypal/vault.phtml @@ -0,0 +1,30 @@ +<?php +use Magento\Vault\Model\Ui\TokenUiComponentProviderInterface; +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +// @codingStandardsIgnoreFile + +/** @var \Magento\Framework\View\Element\Template $block */ +$details = $block->getData(TokenUiComponentProviderInterface::COMPONENT_DETAILS); +$icon = $details['icon']; +$id = $block->escapeHtml($block->getData('id')); +?> +<div data-mage-init='{ + "Magento_Braintree/js/vault": { + "container": "payment_<?php /* @noEscape */ echo $id; ?>", + "publicHash": "<?php echo $block->escapeHtml($block->getData(TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH)); ?>", + "code": "<?php echo $block->escapeHtml($block->getData('code')); ?>", + "nonceUrl": "<?php echo $block->escapeUrl($block->getData('nonceUrl')); ?>" + } + }' id="payment_<?php /* @noEscape */ echo $id;?>" class="admin__field"> + <div class="admin__field-control control"> + <input type="radio" id="token_switcher_<?php /* @noEscape */ echo $id; ?>" name="payment[token_switcher]"/> + <img src="<?php echo $block->escapeUrl($icon['url']); ?>" + width="<?php echo $block->escapeHtml($icon['width']); ?>" + height="<?php echo $block->escapeHtml($icon['height']); ?>" + class="payment-icon" > + <span><?php echo $block->escapeHtml($details['payerEmail']); ?></span> + </div> +</div> diff --git a/app/code/Magento/Braintree/view/adminhtml/templates/form/vault.phtml b/app/code/Magento/Braintree/view/adminhtml/templates/form/vault.phtml index 38114618847259c143ec2794d13ccaf5a5ff1349..001422d4bf911a40094d2174f9bb346866175c59 100644 --- a/app/code/Magento/Braintree/view/adminhtml/templates/form/vault.phtml +++ b/app/code/Magento/Braintree/view/adminhtml/templates/form/vault.phtml @@ -7,7 +7,7 @@ use Magento\Vault\Model\Ui\TokenUiComponentProviderInterface; // @codingStandardsIgnoreFile /** @var \Magento\Framework\View\Element\Template $block */ -$details = $block->getData('details'); +$details = $block->getData(TokenUiComponentProviderInterface::COMPONENT_DETAILS); $icon = $block->getData('icons')[$details['type']]; $id = $block->escapeHtml($block->getData('id')); ?> @@ -15,6 +15,7 @@ $id = $block->escapeHtml($block->getData('id')); "Magento_Braintree/js/vault": { "container": "payment_<?php /* @noEscape */ echo $id; ?>", "publicHash": "<?php echo $block->escapeHtml($block->getData(TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH)); ?>", + "code": "<?php echo $block->escapeHtml($block->getData('code')); ?>", "nonceUrl": "<?php echo $block->escapeUrl($block->getData('nonceUrl')); ?>" } }' id="payment_<?php /* @noEscape */ echo $id;?>" class="admin__field"> diff --git a/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js b/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js index fcff173e7fcd44f714a6ec9f4282f838b04654aa..ea832acb537e0051e34f976c050c9b8bd7d289b7 100644 --- a/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js +++ b/app/code/Magento/Braintree/view/adminhtml/web/js/vault.js @@ -14,7 +14,8 @@ define([ return Class.extend({ defaults: { $selector: null, - selector: 'edit_form' + selector: 'edit_form', + $container: null }, /** @@ -25,17 +26,18 @@ define([ var self = this; self.$selector = $('#' + self.selector); + self.$container = $('#' + self.container); self.$selector.on( 'setVaultNotActive', function () { - self.$selector.off('submitOrder.braintree_vault'); + self.$selector.off('submitOrder.' + self.getCode()); } ); - this._super(); + self._super(); - this.initEventHandlers(); + self.initEventHandlers(); - return this; + return self; }, /** @@ -43,14 +45,14 @@ define([ * @returns {String} */ getCode: function () { - return 'braintree'; + return this.code; }, /** * Init event handlers */ initEventHandlers: function () { - $('#' + this.container).find('[name="payment[token_switcher]"]') + $(this.$container).find('[name="payment[token_switcher]"]') .on('click', this.selectPaymentMethod.bind(this)); }, @@ -66,7 +68,7 @@ define([ * Enable form event listeners */ enableEventListeners: function () { - this.$selector.on('submitOrder.braintree_vault', this.submitOrder.bind(this)); + this.$selector.on('submitOrder.' + this.getCode(), this.submitOrder.bind(this)); }, /** @@ -129,7 +131,7 @@ define([ this.createPublicHashSelector(); this.$selector.find('[name="payment[public_hash]"]').val(this.publicHash); - this.$selector.find('#braintree_nonce').val(nonce); + this.$container.find('#' + this.getNonceSelectorName()).val(nonce); }, /** @@ -138,16 +140,16 @@ define([ createPublicHashSelector: function () { var $input; - if (this.$selector.find('#braintree_nonce').size() === 0) { + if (this.$container.find('#' + this.getNonceSelectorName()).size() === 0) { $input = $('<input>').attr( { type: 'hidden', - id: 'braintree_nonce', + id: this.getNonceSelectorName(), name: 'payment[payment_method_nonce]' } ); - $input.appendTo(this.$selector); + $input.appendTo(this.$container); $input.prop('disabled', false); } }, @@ -160,6 +162,14 @@ define([ alert({ content: message }); + }, + + /** + * Get selector name for nonce input + * @returns {String} + */ + getNonceSelectorName: function () { + return 'nonce_' + this.getCode(); } }); }); diff --git a/app/code/Magento/Vault/Model/Method/Vault.php b/app/code/Magento/Vault/Model/Method/Vault.php index 41a2d6b0e26efcd1c6745f5d5fbc2842ae6c8513..ca6fe06f91eef8ce52e5f0c5b0cdbd7f439f5710 100644 --- a/app/code/Magento/Vault/Model/Method/Vault.php +++ b/app/code/Magento/Vault/Model/Method/Vault.php @@ -5,17 +5,16 @@ */ namespace Magento\Vault\Model\Method; -use Magento\Framework\DataObject; use Magento\Framework\Event\ManagerInterface; use Magento\Framework\ObjectManagerInterface; use Magento\Payment\Gateway\Command; -use Magento\Sales\Api\Data\OrderPaymentExtensionInterfaceFactory; use Magento\Payment\Gateway\Config\ValueHandlerPoolInterface; use Magento\Payment\Gateway\ConfigFactoryInterface; use Magento\Payment\Gateway\ConfigInterface; use Magento\Payment\Model\InfoInterface; use Magento\Payment\Model\MethodInterface; use Magento\Payment\Observer\AbstractDataAssignObserver; +use Magento\Sales\Api\Data\OrderPaymentExtensionInterfaceFactory; use Magento\Sales\Api\Data\OrderPaymentInterface; use Magento\Sales\Model\Order\Payment; use Magento\Vault\Api\Data\PaymentTokenInterface; @@ -275,7 +274,12 @@ final class Vault implements VaultPaymentInterface */ public function canUseInternal() { - return $this->getVaultProvider()->canUseInternal(); + $isInternalAllowed = $this->getConfiguredValue('can_use_internal'); + // if config has't been specified for Vault, need to check payment provider option + if ($isInternalAllowed === null) { + return $this->getVaultProvider()->canUseInternal(); + } + return (bool) $isInternalAllowed; } /** diff --git a/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php b/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php index 98e7728f732fe51bcea79e555c5333a9cbd86684..f3a2cbfa78739d0ee748b5e38a01176ae6ed7e67 100644 --- a/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php +++ b/app/code/Magento/Vault/Model/Ui/Adminhtml/TokensConfigProvider.php @@ -221,9 +221,11 @@ final class TokensConfigProvider */ private function getPaymentTokenEntityId() { - return $this->getPaymentTokenManagement() - ->getByPaymentId($this->getOrderPaymentEntityId()) - ->getEntityId(); + $paymentToken = $this->getPaymentTokenManagement()->getByPaymentId($this->getOrderPaymentEntityId()); + if ($paymentToken === null) { + throw new NoSuchEntityException(__('No available payment tokens for specified order payment.')); + } + return $paymentToken->getEntityId(); } /** diff --git a/app/code/Magento/Vault/Test/Unit/Model/Method/VaultTest.php b/app/code/Magento/Vault/Test/Unit/Model/Method/VaultTest.php index 8bded498dab765a442ced658ba2562db81ca5b7e..ade93c9367858eafb1cfdf64035d2d4f9354e8a0 100644 --- a/app/code/Magento/Vault/Test/Unit/Model/Method/VaultTest.php +++ b/app/code/Magento/Vault/Test/Unit/Model/Method/VaultTest.php @@ -8,6 +8,8 @@ namespace Magento\Vault\Test\Unit\Model\Method; use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Payment\Gateway\Command\CommandManagerInterface; use Magento\Payment\Gateway\Command\CommandManagerPoolInterface; +use Magento\Payment\Gateway\Config\ValueHandlerInterface; +use Magento\Payment\Gateway\Config\ValueHandlerPoolInterface; use Magento\Payment\Gateway\ConfigInterface; use Magento\Payment\Model\InfoInterface; use Magento\Payment\Model\MethodInterface; @@ -19,6 +21,7 @@ use Magento\Vault\Api\Data\PaymentTokenInterface; use Magento\Vault\Api\PaymentTokenManagementInterface; use Magento\Vault\Model\Method\Vault; use Magento\Vault\Model\VaultPaymentInterface; +use PHPUnit_Framework_MockObject_MockObject as MockObject; /** * Class VaultTest @@ -31,9 +34,15 @@ class VaultTest extends \PHPUnit_Framework_TestCase */ private $objectManager; + /** + * @var MethodInterface|MockObject + */ + private $vaultProvider; + public function setUp() { $this->objectManager = new ObjectManager($this); + $this->vaultProvider = $this->getMock(MethodInterface::class); } /** @@ -137,8 +146,6 @@ class VaultTest extends \PHPUnit_Framework_TestCase $commandManagerPool = $this->getMock(CommandManagerPoolInterface::class); $commandManager = $this->getMock(CommandManagerInterface::class); - $vaultProvider = $this->getMock(MethodInterface::class); - $tokenManagement = $this->getMock(PaymentTokenManagementInterface::class); $token = $this->getMock(PaymentTokenInterface::class); @@ -161,7 +168,7 @@ class VaultTest extends \PHPUnit_Framework_TestCase ->method('setVaultPaymentToken') ->with($token); - $vaultProvider->expects(static::atLeastOnce()) + $this->vaultProvider->expects(static::atLeastOnce()) ->method('getCode') ->willReturn($vaultProviderCode); $commandManagerPool->expects(static::once()) @@ -188,7 +195,7 @@ class VaultTest extends \PHPUnit_Framework_TestCase [ 'tokenManagement' => $tokenManagement, 'commandManagerPool' => $commandManagerPool, - 'vaultProvider' => $vaultProvider + 'vaultProvider' => $this->vaultProvider ] ); $model->authorize($paymentModel, $amount); @@ -235,10 +242,9 @@ class VaultTest extends \PHPUnit_Framework_TestCase { $storeId = 1; $quote = $this->getMockForAbstractClass(CartInterface::class); - $vaultProvider = $this->getMockForAbstractClass(MethodInterface::class); $config = $this->getMockForAbstractClass(ConfigInterface::class); - $vaultProvider->expects(static::once()) + $this->vaultProvider->expects(static::once()) ->method('isAvailable') ->with($quote) ->willReturn($isAvailableProvider); @@ -255,7 +261,7 @@ class VaultTest extends \PHPUnit_Framework_TestCase /** @var Vault $model */ $model = $this->objectManager->getObject(Vault::class, [ 'config' => $config, - 'vaultProvider' => $vaultProvider + 'vaultProvider' => $this->vaultProvider ]); $actual = $model->isAvailable($quote); static::assertEquals($expected, $actual); @@ -281,11 +287,9 @@ class VaultTest extends \PHPUnit_Framework_TestCase public function testIsAvailableWithoutQuote() { $quote = null; - - $vaultProvider = $this->getMockForAbstractClass(MethodInterface::class); $config = $this->getMockForAbstractClass(ConfigInterface::class); - $vaultProvider->expects(static::once()) + $this->vaultProvider->expects(static::once()) ->method('isAvailable') ->with($quote) ->willReturn(true); @@ -298,8 +302,60 @@ class VaultTest extends \PHPUnit_Framework_TestCase /** @var Vault $model */ $model = $this->objectManager->getObject(Vault::class, [ 'config' => $config, - 'vaultProvider' => $vaultProvider + 'vaultProvider' => $this->vaultProvider ]); static::assertFalse($model->isAvailable($quote)); } + + /** + * @covers \Magento\Vault\Model\Method\Vault::canUseInternal + * @param bool|null $configValue + * @param bool|null $paymentValue + * @param bool $expected + * @dataProvider internalUsageDataProvider + */ + public function testCanUseInternal($configValue, $paymentValue, $expected) + { + $handlerPool = $this->getMock(ValueHandlerPoolInterface::class); + $handler = $this->getMock(ValueHandlerInterface::class); + + $handlerPool->expects(static::once()) + ->method('get') + ->with('can_use_internal') + ->willReturn($handler); + + $handler->expects(static::once()) + ->method('handle') + ->with(['field' => 'can_use_internal'], null) + ->willReturn($configValue); + + $this->vaultProvider->expects(static::any()) + ->method('canUseInternal') + ->willReturn($paymentValue); + + /** @var Vault $model */ + $model = $this->objectManager->getObject(Vault::class, [ + 'vaultProvider' => $this->vaultProvider, + 'valueHandlerPool' => $handlerPool, + ]); + static::assertEquals($expected, $model->canUseInternal()); + } + + /** + * Get list of variations for testing canUseInternal method + * @return array + */ + public function internalUsageDataProvider() + { + return [ + ['configValue' => true, 'paymentValue' => true, 'expected' => true], + ['configValue' => true, 'paymentValue' => null, 'expected' => true], + ['configValue' => true, 'paymentValue' => false, 'expected' => true], + ['configValue' => false, 'paymentValue' => true, 'expected' => false], + ['configValue' => false, 'paymentValue' => false, 'expected' => false], + ['configValue' => null, 'paymentValue' => true, 'expected' => true], + ['configValue' => null, 'paymentValue' => false, 'expected' => false], + ['configValue' => null, 'paymentValue' => null, 'expected' => false], + ]; + } } diff --git a/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php b/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php index 38948b004eebc358ce82eddf8bf2af88e1685c8c..bbac491386c44a231a1cc650a2ba3acfca791282 100644 --- a/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php +++ b/app/code/Magento/Vault/Test/Unit/Model/Ui/Adminhtml/TokensConfigProviderTest.php @@ -13,6 +13,7 @@ use Magento\Framework\Api\SearchCriteriaBuilder; use Magento\Framework\Exception\InputException; use Magento\Framework\Exception\NoSuchEntityException; use Magento\Framework\Intl\DateTimeFactory; +use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; use Magento\Framework\TestFramework\Unit\Matcher\MethodInvokedAtIndex; use Magento\Payment\Helper\Data; use Magento\Sales\Api\Data\OrderInterface; @@ -29,7 +30,6 @@ use Magento\Vault\Model\Ui\TokenUiComponentInterface; use Magento\Vault\Model\Ui\TokenUiComponentProviderInterface; use Magento\Vault\Model\VaultPaymentInterface; use PHPUnit_Framework_MockObject_MockObject as MockObject; -use Magento\Framework\TestFramework\Unit\Helper\ObjectManager; /** * Class TokensConfigProviderTest @@ -104,11 +104,21 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase */ private $orderRepository; + /** + * @var TokenUiComponentProviderInterface|MockObject + */ + private $tokenComponentProvider; + /** * @var ObjectManager */ private $objectManager; + /** + * @var TokensConfigProvider + */ + private $configProvider; + protected function setUp() { $this->paymentTokenRepository = $this->getMockBuilder(PaymentTokenRepositoryInterface::class) @@ -138,6 +148,38 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase $this->vaultPayment = $this->getMockForAbstractClass(VaultPaymentInterface::class); $this->objectManager = new ObjectManager($this); + + $this->initStoreMock(); + + $this->tokenComponentProvider = $this->getMock(TokenUiComponentProviderInterface::class); + + $this->configProvider = new TokensConfigProvider( + $this->session, + $this->paymentTokenRepository, + $this->filterBuilder, + $this->searchCriteriaBuilder, + $this->storeManager, + $this->dateTimeFactory, + [ + self::VAULT_PROVIDER_CODE => $this->tokenComponentProvider + ] + ); + + $this->objectManager->setBackwardCompatibleProperty( + $this->configProvider, + 'paymentDataHelper', + $this->paymentDataHelper + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->configProvider, + 'paymentTokenManagement', + $this->paymentTokenManagement + ); + $this->objectManager->setBackwardCompatibleProperty( + $this->configProvider, + 'orderRepository', + $this->orderRepository + ); } /** @@ -147,8 +189,6 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase { $customerId = 1; - $this->initStoreMock(); - $this->session->expects(static::once()) ->method('getCustomerId') ->willReturn($customerId); @@ -170,7 +210,7 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase $token = $this->getMockBuilder(PaymentTokenInterface::class) ->getMockForAbstractClass(); - list($tokenUiComponent, $tokenUiComponentProvider) = $this->getTokenUiComponentProvider($token); + $tokenUiComponent = $this->getTokenUiComponentProvider($token); $searchCriteria = $this->getSearchCriteria($customerId, self::ENTITY_ID, self::VAULT_PROVIDER_CODE); @@ -197,25 +237,7 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase ->method('getItems') ->willReturn([$token]); - $configProvider = new TokensConfigProvider( - $this->session, - $this->paymentTokenRepository, - $this->filterBuilder, - $this->searchCriteriaBuilder, - $this->storeManager, - $this->dateTimeFactory, - [ - self::VAULT_PROVIDER_CODE => $tokenUiComponentProvider - ] - ); - - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'paymentDataHelper', - $this->paymentDataHelper - ); - - static::assertEquals([$tokenUiComponent], $configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); + static::assertEquals([$tokenUiComponent], $this->configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); } /** @@ -263,7 +285,7 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase ->method('getEntityId') ->willReturn(self::ENTITY_ID); - list($tokenUiComponent, $tokenUiComponentProvider) = $this->getTokenUiComponentProvider($token); + $tokenUiComponent = $this->getTokenUiComponentProvider($token); $searchCriteria = $this->getSearchCriteria($customerId, self::ENTITY_ID, self::VAULT_PROVIDER_CODE); @@ -290,35 +312,7 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase ->method('getItems') ->willReturn([$token]); - $configProvider = new TokensConfigProvider( - $this->session, - $this->paymentTokenRepository, - $this->filterBuilder, - $this->searchCriteriaBuilder, - $this->storeManager, - $this->dateTimeFactory, - [ - self::VAULT_PROVIDER_CODE => $tokenUiComponentProvider - ] - ); - - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'paymentDataHelper', - $this->paymentDataHelper - ); - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'paymentTokenManagement', - $this->paymentTokenManagement - ); - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'orderRepository', - $this->orderRepository - ); - - static::assertEquals([$tokenUiComponent], $configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); + static::assertEquals([$tokenUiComponent], $this->configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); } /** @@ -330,8 +324,6 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase { $customerId = null; - $this->initStoreMock(); - $this->session->expects(static::once()) ->method('getCustomerId') ->willReturn($customerId); @@ -366,35 +358,7 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase $this->searchCriteriaBuilder->expects(self::never()) ->method('addFilters'); - $configProvider = new TokensConfigProvider( - $this->session, - $this->paymentTokenRepository, - $this->filterBuilder, - $this->searchCriteriaBuilder, - $this->storeManager, - $this->dateTimeFactory, - [ - self::VAULT_PROVIDER_CODE => $this->getMock(TokenUiComponentProviderInterface::class) - ] - ); - - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'paymentDataHelper', - $this->paymentDataHelper - ); - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'paymentTokenManagement', - $this->paymentTokenManagement - ); - $this->objectManager->setBackwardCompatibleProperty( - $configProvider, - 'orderRepository', - $this->orderRepository - ); - - static::assertEmpty($configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); + static::assertEmpty($this->configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); } /** @@ -453,18 +417,66 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase static::assertEmpty($configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); } + /** + * @covers \Magento\Vault\Model\Ui\Adminhtml\TokensConfigProvider::getTokensComponents + */ + public function testGetTokensComponentsForGuestCustomerWithoutStoredTokens() + { + $this->session->expects(static::once()) + ->method('getCustomerId') + ->willReturn(null); + + $this->paymentDataHelper->expects(static::once()) + ->method('getMethodInstance') + ->with(self::VAULT_PAYMENT_CODE) + ->willReturn($this->vaultPayment); + + $this->vaultPayment->expects(static::once()) + ->method('isActive') + ->with(self::STORE_ID) + ->willReturn(true); + $this->vaultPayment->expects(static::once()) + ->method('getProviderCode') + ->willReturn(self::VAULT_PROVIDER_CODE); + + $this->session->expects(static::once()) + ->method('getReordered') + ->willReturn(self::ORDER_ID); + $this->orderRepository->expects(static::once()) + ->method('get') + ->with(self::ORDER_ID) + ->willReturn($this->getOrderMock()); + + $this->paymentTokenManagement->expects(static::once()) + ->method('getByPaymentId') + ->with(self::ORDER_PAYMENT_ENTITY_ID) + ->willReturn(null); + + $this->filterBuilder->expects(static::once()) + ->method('setField') + ->with(PaymentTokenInterface::ENTITY_ID) + ->willReturnSelf(); + $this->filterBuilder->expects(static::never()) + ->method('setValue'); + + $this->searchCriteriaBuilder->expects(static::never()) + ->method('addFilters'); + + static::assertEmpty($this->configProvider->getTokensComponents(self::VAULT_PAYMENT_CODE)); + } + /** * Create mock object for store */ private function initStoreMock() { $this->store = $this->getMock(StoreInterface::class); - $this->store->expects(static::once()) + $this->store->expects(static::any()) ->method('getId') ->willReturn(self::STORE_ID); $this->storeManager = $this->getMock(StoreManagerInterface::class); - $this->storeManager->expects(static::once()) + $this->storeManager->expects(static::any()) ->method('getStore') ->with(null) ->willReturn($this->store); @@ -476,39 +488,37 @@ class TokensConfigProviderTest extends \PHPUnit_Framework_TestCase */ private function getOrderMock() { - /** @var OrderInterface|MockObject $orderMock */ - $orderMock = $this->getMockBuilder(OrderInterface::class) + /** @var OrderInterface|MockObject $order */ + $order = $this->getMockBuilder(OrderInterface::class) ->getMockForAbstractClass(); - /** @var OrderPaymentInterface|MockObject $orderPaymentMock */ - $orderPaymentMock = $this->getMockBuilder(OrderPaymentInterface::class) + /** @var OrderPaymentInterface|MockObject $orderPayment */ + $orderPayment = $this->getMockBuilder(OrderPaymentInterface::class) ->getMockForAbstractClass(); - $orderMock->expects(static::once()) + $order->expects(static::once()) ->method('getPayment') - ->willReturn($orderPaymentMock); - $orderPaymentMock->expects(static::once()) + ->willReturn($orderPayment); + $orderPayment->expects(static::once()) ->method('getEntityId') ->willReturn(self::ORDER_PAYMENT_ENTITY_ID); - return $orderMock; + return $order; } /** * Get mock for token ui component provider * @param PaymentTokenInterface $token - * @return array + * @return TokenUiComponentInterface|MockObject */ private function getTokenUiComponentProvider($token) { $tokenUiComponent = $this->getMock(TokenUiComponentInterface::class); - - $tokenUiComponentProvider = $this->getMock(TokenUiComponentProviderInterface::class); - $tokenUiComponentProvider->expects(static::once()) + $this->tokenComponentProvider->expects(static::once()) ->method('getComponentForToken') ->with($token) ->willReturn($tokenUiComponent); - return [$tokenUiComponent, $tokenUiComponentProvider]; + return $tokenUiComponent; } /** diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderWithPayPalBraintreeVaultBackendTest.php b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderWithPayPalBraintreeVaultBackendTest.php new file mode 100644 index 0000000000000000000000000000000000000000..6fde39412d1fe66a987b12cf5cb29e09d81327fe --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderWithPayPalBraintreeVaultBackendTest.php @@ -0,0 +1,56 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Braintree\Test\TestCase; + +use Magento\Mtf\TestCase\Scenario; + +/** + * Preconditions: + * 1. Configure shipping method. + * 2. Configure payment method. + * 3. Create products. + * 4. Create and setup customer. + * + * Steps: + * 1. Log in Storefront. + * 2. Add products to the Shopping Cart. + * 3. In 'Estimate Shipping and Tax' section specify destination using values from Test Data. + * 4. Click the 'Proceed to Checkout' button. + * 5. Fill shipping information. + * 6. Select shipping method. + * 8. Select payment method + * 9. Verify order total on review step. + * 10. Click 'Continue to PayPal' button. + * 11. Click 'Proceed purchase' in popup. + * 12. Log in Admin panel. + * 13. Open placed order. + * 14. Click 'Reorder' button. + * 15. Select stored Braintree PayPal token. + * 16. Click 'Submit Order'. + * 17. Perform assertions. + * + * @group Braintree + * @ZephyrId MAGETWO-59259 + */ +class CreateOrderWithPayPalBraintreeVaultBackendTest extends Scenario +{ + /* tags */ + const MVP = 'yes'; + + const TEST_TYPE = '3rd_party_test'; + + const SEVERITY = 'S0'; + /* end tags */ + + /** + * Runs test scenario + * @return void + */ + public function test() + { + $this->executeScenario(); + } +} diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderWithPayPalBraintreeVaultBackendTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderWithPayPalBraintreeVaultBackendTest.xml new file mode 100644 index 0000000000000000000000000000000000000000..03e0ba330fa3b74e2a33c2983655ced95cf3dbfe --- /dev/null +++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateOrderWithPayPalBraintreeVaultBackendTest.xml @@ -0,0 +1,32 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ + --> +<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd"> + <testCase name="Magento\Braintree\Test\TestCase\CreateOrderWithPayPalBraintreeVaultBackendTest" summary="Checkout with PayPal Braintree Vault token from Admin"> + <variation name="CreateOrderWithPayPalBraintreeVaultBackendTestVariation1" summary="Checkout with PayPal Braintree Vault token from Admin" ticketId="MAGETWO-59259"> + <data name="tag" xsi:type="string">est_type:3rd_party_test, severity:S0</data> + <data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data> + <data name="customer/dataset" xsi:type="string">default</data> + <data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</data> + <data name="checkoutMethod" xsi:type="string">login</data> + <data name="shipping/shipping_service" xsi:type="string">Flat Rate</data> + <data name="shipping/shipping_method" xsi:type="string">Fixed</data> + <data name="payment/method" xsi:type="string">braintree_paypal</data> + <data name="vault/method" xsi:type="string">braintree_paypal_vault</data> + <data name="status" xsi:type="string">Processing</data> + <data name="configData" xsi:type="string">braintree, braintree_paypal, braintree_paypal_use_vault, braintree_paypal_skip_order_review</data> + <data name="prices" xsi:type="array"> + <item name="grandTotal" xsi:type="string">15.00</item> + </data> + <constraint name="Magento\Sales\Test\Constraint\AssertOrderSuccessCreateMessage" /> + <constraint name="Magento\Sales\Test\Constraint\AssertOrderStatusIsCorrect" /> + <constraint name="Magento\Sales\Test\Constraint\AssertAuthorizationInCommentsHistory" /> + <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGrid" /> + <constraint name="Magento\Sales\Test\Constraint\AssertOrderInOrdersGridOnFrontend" /> + </variation> + </testCase> +</config> diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml index 4f05723609c2a8305f68a6893787684ae2e3d9df..df6e56eb14826dbcda2ed7c780d2bb02d823b3ea 100644 --- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/CreateVaultOrderBackendTest.xml @@ -19,6 +19,7 @@ <item name="grandTotal" xsi:type="string">15.00</item> </data> <data name="payment/method" xsi:type="string">braintree</data> + <data name="vault/method" xsi:type="string">braintree_cc_vault</data> <data name="creditCardClass" xsi:type="string">credit_card_braintree</data> <data name="creditCard/dataset" xsi:type="string">visa_braintree</data> <data name="creditCardSave" xsi:type="string">Yes</data> diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml index 88ab2ef65c9a0e75d2eafff8c53fe898d9504efe..2ab0134e62b7add65f9189e89123443099283032 100644 --- a/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml +++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/TestCase/ReorderUsingVaultTest.xml @@ -19,6 +19,7 @@ <item name="grandTotal" xsi:type="string">15.00</item> </data> <data name="payment/method" xsi:type="string">braintree</data> + <data name="vault/method" xsi:type="string">braintree_cc_vault</data> <data name="creditCardClass" xsi:type="string">credit_card_braintree</data> <data name="creditCard/dataset" xsi:type="string">visa_braintree</data> <data name="configData" xsi:type="string">braintree, braintree_use_vault</data> diff --git a/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml b/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml index 34f4be6493838598b9872225997736da38b07ff7..495f455c43a72f4d61029a07a8633fc09744c2f0 100644 --- a/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml +++ b/dev/tests/functional/tests/app/Magento/Braintree/Test/etc/testcase.xml @@ -158,4 +158,21 @@ <step name="changeOrderStatusToPaymentReview" module="Magento_Braintree" next="denyPayment" /> <step name="denyPayment" module="Magento_Braintree" /> </scenario> + <scenario name="CreateOrderWithPayPalBraintreeVaultBackendTest" firstStep="setupConfiguration"> + <step name="setupConfiguration" module="Magento_Config" next="createProducts" /> + <step name="createProducts" module="Magento_Catalog" next="addProductsToTheCart" /> + <step name="addProductsToTheCart" module="Magento_Checkout" next="estimateShippingAndTax" /> + <step name="estimateShippingAndTax" module="Magento_Checkout" next="clickProceedToCheckout" /> + <step name="clickProceedToCheckout" module="Magento_Checkout" next="createCustomer" /> + <step name="createCustomer" module="Magento_Customer" next="selectCheckoutMethod" /> + <step name="selectCheckoutMethod" module="Magento_Checkout" next="fillShippingAddress" /> + <step name="fillShippingAddress" module="Magento_Checkout" next="fillShippingMethod" /> + <step name="fillShippingMethod" module="Magento_Checkout" next="selectPaymentMethod" /> + <step name="selectPaymentMethod" module="Magento_Checkout" next="placeOrderWithPaypal" /> + <step name="placeOrderWithPaypal" module="Magento_Braintree" next="openOrder"/> + <step name="openOrder" module="Magento_Sales" next="reorder" /> + <step name="reorder" module="Magento_Sales" next="useVaultPaymentToken" /> + <step name="useVaultPaymentToken" module="Magento_Vault" next="submitOrder" /> + <step name="submitOrder" module="Magento_Sales" /> + </scenario> </config> diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml index 64a191040b8a451aede65fe73dc9785747509c4f..f431bf4d6a5edf4c9cd67cf97796558ffadb59b8 100644 --- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml +++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/CreateVaultOrderBackendTest.xml @@ -19,6 +19,7 @@ <item name="grandTotal" xsi:type="string">15.00</item> </data> <data name="payment/method" xsi:type="string">payflowpro</data> + <data name="vault/method" xsi:type="string">payflowpro_cc_vault</data> <data name="creditCardClass" xsi:type="string">credit_card_admin</data> <data name="creditCard/dataset" xsi:type="string">visa_default</data> <data name="creditCardSave" xsi:type="string">Yes</data> diff --git a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml index bc3ee3cef1c68ba1668891cce3e6f2eb45a4d86d..d74d93053196b39f32c2430c70d0dfddee0d5c50 100644 --- a/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml +++ b/dev/tests/functional/tests/app/Magento/Paypal/Test/TestCase/ReorderUsingVaultTest.xml @@ -19,6 +19,7 @@ <item name="grandTotal" xsi:type="string">15.00</item> </data> <data name="payment/method" xsi:type="string">payflowpro</data> + <data name="vault/method" xsi:type="string">payflowpro_cc_vault</data> <data name="creditCardClass" xsi:type="string">credit_card</data> <data name="creditCard/dataset" xsi:type="string">visa_default</data> <data name="configData" xsi:type="string">payflowpro, payflowpro_use_vault</data> diff --git a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/UseVaultPaymentTokenStep.php b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/UseVaultPaymentTokenStep.php index ad693923955d4f439340970eb07ebb7c14789574..066dc7786d892619e84272c69b655cfd8a74f140 100644 --- a/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/UseVaultPaymentTokenStep.php +++ b/dev/tests/functional/tests/app/Magento/Vault/Test/TestStep/UseVaultPaymentTokenStep.php @@ -17,20 +17,20 @@ class UseVaultPaymentTokenStep implements TestStepInterface * @var OrderCreateIndex */ private $orderCreatePage; - + /** * @var array */ - private $payment; + private $vault; /** * @param OrderCreateIndex $orderCreateIndex - * @param array $payment + * @param array $vault */ - public function __construct(OrderCreateIndex $orderCreateIndex, array $payment) + public function __construct(OrderCreateIndex $orderCreateIndex, array $vault) { $this->orderCreatePage = $orderCreateIndex; - $this->payment = $payment; + $this->vault = $vault; } /** @@ -39,8 +39,7 @@ class UseVaultPaymentTokenStep implements TestStepInterface public function run() { $block = $this->orderCreatePage->getCreateBlock(); - $this->payment['method'] .= '_cc_vault'; - $block->selectPaymentMethod($this->payment); - $block->selectVaultToken('token_switcher_' . $this->payment['method']); + $block->selectPaymentMethod($this->vault); + $block->selectVaultToken('token_switcher_' . $this->vault['method']); } } diff --git a/dev/tests/integration/testsuite/Magento/Braintree/Model/Ui/Adminhtml/PayPal/TokenUiComponentProviderTest.php b/dev/tests/integration/testsuite/Magento/Braintree/Model/Ui/Adminhtml/PayPal/TokenUiComponentProviderTest.php new file mode 100644 index 0000000000000000000000000000000000000000..e79f4ad361e36d315e7bc30846325bbe97445d1e --- /dev/null +++ b/dev/tests/integration/testsuite/Magento/Braintree/Model/Ui/Adminhtml/PayPal/TokenUiComponentProviderTest.php @@ -0,0 +1,62 @@ +<?php +/** + * Copyright © 2016 Magento. All rights reserved. + * See COPYING.txt for license details. + */ +namespace Magento\Braintree\Model\Ui\Adminhtml\PayPal; + +use Magento\Braintree\Model\Ui\Adminhtml\PayPal\TokenUiComponentProvider; +use Magento\Braintree\Model\Ui\PayPal\ConfigProvider; +use Magento\Framework\ObjectManagerInterface; +use Magento\TestFramework\Helper\Bootstrap; +use Magento\Vault\Model\PaymentTokenManagement; +use Magento\Vault\Model\Ui\TokenUiComponentProviderInterface; + +/** + * Contains tests for PayPal token Ui component provider + */ +class TokenUiComponentProviderTest extends \PHPUnit_Framework_TestCase +{ + /** + * @var ObjectManagerInterface + */ + private $objectManager; + + /** + * @var TokenUiComponentProvider + */ + private $tokenComponentProvider; + + protected function setUp() + { + $this->objectManager = Bootstrap::getObjectManager(); + $this->tokenComponentProvider = $this->objectManager->get(TokenUiComponentProvider::class); + } + + /** + * @covers \Magento\Braintree\Model\Ui\Adminhtml\PayPal\TokenUiComponentProvider::getComponentForToken + * @magentoDataFixture Magento/Braintree/_files/paypal_vault_token.php + * @magentoAppArea adminhtml + */ + public function testGetComponentForToken() + { + $customerId = 1; + $token = 'mx29vk'; + $payerEmail = 'john.doe@example.com'; + + /** @var PaymentTokenManagement $tokenManagement */ + $tokenManagement = $this->objectManager->get(PaymentTokenManagement::class); + $paymentToken = $tokenManagement->getByGatewayToken($token, ConfigProvider::PAYPAL_CODE, $customerId); + + $component = $this->tokenComponentProvider->getComponentForToken($paymentToken); + $config = $component->getConfig(); + + static::assertNotEmpty($config[TokenUiComponentProviderInterface::COMPONENT_DETAILS]); + static::assertNotEmpty($config[TokenUiComponentProviderInterface::COMPONENT_PUBLIC_HASH]); + static::assertEquals(ConfigProvider::PAYPAL_VAULT_CODE, $config['code']); + + $details = $config[TokenUiComponentProviderInterface::COMPONENT_DETAILS]; + static::assertEquals($payerEmail, $details['payerEmail']); + static::assertNotEmpty($details['icon']); + } +}