Skip to content

Commit 06c69e3

Browse files
committed
MAGETWO-91624: Braintree saved cards use billing address the same as shipping
- Adding Braintree vault to checkout layout - Adding billing address form to vault payment method template - Adding automated test
1 parent b55989d commit 06c69e3

File tree

9 files changed

+241
-0
lines changed

9 files changed

+241
-0
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Test/etc/actionGroupSchema.xsd">
10+
<actionGroup name="StorefrontFillCartDataActionGroup">
11+
<arguments>
12+
<argument name="cartData" defaultValue="PaymentAndShippingInfo"/>
13+
</arguments>
14+
<switchToIFrame selector="{{BraintreeConfigurationPaymentSection.cartFrame}}" stepKey="switchToIframe"/>
15+
<fillField selector="{{BraintreeConfigurationPaymentSection.cartCode}}" userInput="{{cartData.cardNumber}}" stepKey="setCartCode"/>
16+
<switchToIFrame stepKey="switchBack"/>
17+
<switchToIFrame selector="{{BraintreeConfigurationPaymentSection.monthFrame}}" stepKey="switchToIframe1"/>
18+
<fillField selector="{{BraintreeConfigurationPaymentSection.month}}" userInput="{{cartData.month}}" stepKey="setMonth"/>
19+
<switchToIFrame stepKey="switchBack1"/>
20+
<switchToIFrame selector="{{BraintreeConfigurationPaymentSection.yearFrame}}" stepKey="switchToIframe2"/>
21+
<fillField selector="{{BraintreeConfigurationPaymentSection.year}}" userInput="{{cartData.year}}" stepKey="setYear"/>
22+
<switchToIFrame stepKey="switchBack2"/>
23+
<switchToIFrame selector="{{BraintreeConfigurationPaymentSection.codeFrame}}" stepKey="switchToIframe3"/>
24+
<fillField selector="{{BraintreeConfigurationPaymentSection.verificationNumber}}" userInput="{{cartData.cvv}}" stepKey="setVerificationNumber"/>
25+
<switchToIFrame stepKey="SwitchBackToWindow"/>
26+
27+
</actionGroup>
28+
29+
</actionGroups>

app/code/Magento/Braintree/Test/Mftf/Data/BraintreeData.xml

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,33 @@
3535
<data key="value">somePrivateKey</data>
3636
</entity>
3737

38+
<entity name="BraintreeConfig" type="braintree_config_state">
39+
<requiredEntity type="title">BraintreeTitle</requiredEntity>
40+
<requiredEntity type="payment_action">PaymentAction</requiredEntity>
41+
<requiredEntity type="environment">Environment</requiredEntity>
42+
<requiredEntity type="merchant_id">MerchantId</requiredEntity>
43+
<requiredEntity type="public_key">PublicKey</requiredEntity>
44+
<requiredEntity type="private_key">PrivateKey</requiredEntity>
45+
</entity>
46+
<entity name="BraintreeTitle" type="title">
47+
<data key="value">Credit Card (Braintree)</data>
48+
</entity>
49+
<entity name="PaymentAction" type="payment_action">
50+
<data key="value">authorize</data>
51+
</entity>
52+
<entity name="Environment" type="environment">
53+
<data key="value">sandbox</data>
54+
</entity>
55+
<entity name="MerchantId" type="merchant_id">
56+
<data key="value">d4pdjhxgjfrsmzbf</data>
57+
</entity>
58+
<entity name="PublicKey" type="public_key">
59+
<data key="value">m7q4wmh43xrgyrst</data>
60+
</entity>
61+
<entity name="PrivateKey" type="private_key">
62+
<data key="value">67de364080b1b4e2492d7a3de413a572</data>
63+
</entity>
64+
3865
<!-- default configuration used to restore Magento config -->
3966
<entity name="DefaultBraintreeConfig" type="braintree_config_state">
4067
<requiredEntity type="title">DefaultTitle</requiredEntity>
@@ -63,6 +90,28 @@
6390
<data key="value"/>
6491
</entity>
6592

93+
<entity name="CustomBraintreeConfigurationData" type="custom_braintree_config_state">
94+
<requiredEntity type="braintree_cc_vault_active">BraintreeValuteActive</requiredEntity>
95+
<requiredEntity type="active">EnableSolution</requiredEntity>
96+
</entity>
97+
<entity name="BraintreeValuteActive" type="braintree_cc_vault_active">
98+
<data key="value">1</data>
99+
</entity>
100+
<entity name="EnableSolution" type="active">
101+
<data key="value">1</data>
102+
</entity>
103+
104+
<entity name="RollBackCustomBraintreeConfigurationData" type="custom_braintree_config_state">
105+
<requiredEntity type="braintree_cc_vault_active">DefaultBraintreeValuteActive</requiredEntity>
106+
<requiredEntity type="active">DefaultEnableSolution</requiredEntity>
107+
</entity>
108+
<entity name="DefaultBraintreeValuteActive" type="braintree_cc_vault_active">
109+
<data key="value">0</data>
110+
</entity>
111+
<entity name="DefaultEnableSolution" type="active">
112+
<data key="value">0</data>
113+
</entity>
114+
66115
<entity name="testData" type="data">
67116
<data key="websiteName" unique="suffix">Website</data>
68117
<data key="websiteCode" unique="suffix">new_website</data>

app/code/Magento/Braintree/Test/Mftf/Metadata/braintree_config-meta.xml

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,4 +42,22 @@
4242
</object>
4343
</object>
4444
</operation>
45+
<operation name="CustomBraintreeConfigState" dataType="custom_braintree_config_state" type="create" auth="adminFormKey" url="/admin/system_config/save/section/payment/" method="POST">
46+
<object key="groups" dataType="custom_braintree_config_state">
47+
<object key="braintree_section" dataType="custom_braintree_config_state">
48+
<object key="groups" dataType="custom_braintree_config_state">
49+
<object key="braintree" dataType="custom_braintree_config_state">
50+
<object key="fields" dataType="custom_braintree_config_state">
51+
<object key="braintree_cc_vault_active" dataType="braintree_cc_vault_active">
52+
<field key="value">integer</field>
53+
</object>
54+
<object key="active" dataType="active">
55+
<field key="value">string</field>
56+
</object>
57+
</object>
58+
</object>
59+
</object>
60+
</object>
61+
</object>
62+
</operation>
4563
</operations>
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<sections xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="../../../../../../../vendor/magento/magento2-functional-testing-framework/src/Magento/FunctionalTestingFramework/Page/etc/SectionObject.xsd">
11+
<section name="BraintreeConfigurationPaymentSection">
12+
<element name="creditCart" type="radio" selector="#braintree"/>
13+
<element name="paymentMethod" type="radio" selector="//div[@class='payment-group']//input[contains(@id, 'braintree_cc_vault_')]"/>
14+
<element name="cartFrame" type="iframe" selector="braintree-hosted-field-number"/>
15+
<element name="monthFrame" type="iframe" selector="braintree-hosted-field-expirationMonth"/>
16+
<element name="yearFrame" type="iframe" selector="braintree-hosted-field-expirationYear"/>
17+
<element name="codeFrame" type="iframe" selector="braintree-hosted-field-cvv"/>
18+
<element name="cartCode" type="input" selector="#credit-card-number"/>
19+
<element name="month" type="input" selector="#expiration-month"/>
20+
<element name="year" type="input" selector="#expiration-year"/>
21+
<element name="verificationNumber" type="input" selector="#cvv"/>
22+
</section>
23+
</sections>
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
9+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
11+
<test name="BraintreeCreditCardOnCheckoutTest">
12+
<annotations>
13+
<features value="Braintree"/>
14+
<stories value="MAGETWO-91624 - Braintree saved cards use billing address the same as shipping"/>
15+
<title value="Use saved for Braintree credit card on checkout with selecting billing address"/>
16+
<description value="Use saved for Braintree credit card on checkout with selecting billing address"/>
17+
<severity value="MAJOR"/>
18+
<testCaseId value="MAGETWO-93767"/>
19+
<group value="braintree"/>
20+
</annotations>
21+
22+
<before>
23+
<createData entity="_defaultCategory" stepKey="category"/>
24+
<createData entity="SimpleProduct" stepKey="product">
25+
<requiredEntity createDataKey="category"/>
26+
</createData>
27+
<createData entity="Simple_US_Customer" stepKey="customer"/>
28+
<createData entity="BraintreeConfig" stepKey="BraintreeConfigurationData"/>
29+
<createData entity="CustomBraintreeConfigurationData" stepKey="CustomBraintreeConfigurationData"/>
30+
</before>
31+
32+
<after>
33+
<deleteData createDataKey="product" stepKey="deleteProduct1"/>
34+
<deleteData createDataKey="customer" stepKey="deleteCustomer"/>
35+
<deleteData createDataKey="category" stepKey="deleteCategory"/>
36+
<createData entity="DefaultBraintreeConfig" stepKey="DefaultBraintreeConfig"/>
37+
<createData entity="RollBackCustomBraintreeConfigurationData" stepKey="RollBackCustomBraintreeConfigurationData"/>
38+
</after>
39+
<!--Go to storefront-->
40+
<amOnPage url="" stepKey="DoToStorefront"/>
41+
<!--Create account-->
42+
<actionGroup ref="SignUpNewUserFromStorefrontActionGroup" stepKey="SignUpNewUserFromStorefrontActionGroup">
43+
<argument name="Customer" value="Simple_US_Customer"/>
44+
</actionGroup>
45+
46+
<!--Add product to cart-->
47+
<amOnPage url="$$product.sku$$.html" stepKey="goToProductPage"/>
48+
<waitForPageLoad stepKey="waitForPageLoad"/>
49+
<click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart"/>
50+
<waitForPageLoad stepKey="waitForPageLoad1"/>
51+
<!--Proceed to checkout-->
52+
<actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup"/>
53+
54+
<actionGroup ref="LoggedInCheckoutFillNewBillingAddressActionGroup" stepKey="LoggedInCheckoutFillNewBillingAddressActionGroup">
55+
<argument name="Address" value="US_Address_CA"/>
56+
</actionGroup>
57+
<waitForPageLoad stepKey="waitForPageLoad2"/>
58+
<click selector="{{CheckoutShippingSection.next}}" stepKey="clickNext"/>
59+
<waitForElement selector="{{CheckoutPaymentSection.paymentSectionTitle}}" time="30" stepKey="waitForPaymentSectionLoaded"/>
60+
<!--Fill cart data-->
61+
<click selector="{{BraintreeConfigurationPaymentSection.creditCart}}" stepKey="SelectBraintreePaymentMethod"/>
62+
<waitForPageLoad stepKey="waitForPageLoad3"/>
63+
<actionGroup ref="StorefrontFillCartDataActionGroup" stepKey="StorefrontFillCartDataActionGroup"/>
64+
<waitForPageLoad stepKey="waitForPageLoad4"/>
65+
<!--Place order-->
66+
<click selector="{{CheckoutPaymentSection.placeOrder}}" stepKey="PlaceOrder"/>
67+
<waitForPageLoad stepKey="waitForPageLoad5"/>
68+
69+
<!--Add product to cart again-->
70+
<amOnPage url="$$product.sku$$.html" stepKey="goToProductPage1"/>
71+
<waitForPageLoad stepKey="waitForPageLoad6"/>
72+
<click selector="{{StorefrontProductActionSection.addToCart}}" stepKey="addProductToCart1"/>
73+
<waitForPageLoad stepKey="waitForPageLoad7"/>
74+
<!--Proceed to checkout-->
75+
<actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="GoToCheckoutFromMinicartActionGroup1"/>
76+
<click selector="{{CheckoutPaymentSection.addressAction('New Address')}}" stepKey="clickOnNewAddress"/>
77+
<waitForPageLoad stepKey="waitForPageLoad8"/>
78+
<actionGroup ref="LoggedInCheckoutFillNewBillingAddressActionGroup" stepKey="LoggedInCheckoutFillNewBillingAddressActionGroup1">
79+
<argument name="Address" value="US_Address_NY"/>
80+
</actionGroup>
81+
<click selector="{{CheckoutPaymentSection.addressAction('Save Address')}}" stepKey="SaveAddress"/>
82+
<waitForPageLoad stepKey="waitForPageLoad9"/>
83+
<click selector="{{CheckoutShippingSection.next}}" stepKey="clickNext1"/>
84+
<waitForPageLoad stepKey="waitForPageLoad10"/>
85+
<click selector="{{BraintreeConfigurationPaymentSection.paymentMethod}}" stepKey="SelectBraintreePaymentMethod1"/>
86+
<waitForPageLoad stepKey="waitForPageLoad11"/>
87+
<click selector="{{CheckoutPaymentSection.shippingAndBillingAddressSame}}" stepKey="UncheckCheckBox"/>
88+
89+
<click selector="{{CheckoutShippingSection.updateAddress}}" stepKey="clickToUpdate"/>
90+
<waitForPageLoad stepKey="waitForPageLoad12"/>
91+
<!--Place order-->
92+
<click selector="{{CheckoutPaymentSection.placeOrder}}" stepKey="PlaceOrder1"/>
93+
<waitForPageLoad stepKey="waitForPageLoad13"/>
94+
95+
<click selector="{{CheckoutOrderSummarySection.orderNumber}}" stepKey="ClickOnOrderNumber"/>
96+
<waitForPageLoad stepKey="waitForPageLoad14"/>
97+
<!--Check billing and shipping addresses also additional Address info-->
98+
<click selector="{{CheckoutPaymentSection.addressBook}}" stepKey="goToAddressBook"/>
99+
<grabTextFrom selector="{{CheckoutOrderSummarySection.shippingAddress}}" stepKey="shippingAddr"/>
100+
<grabTextFrom selector="{{CheckoutOrderSummarySection.billingAddress}}" stepKey="billingAddr"/>
101+
<grabTextFrom selector="{{CheckoutOrderSummarySection.additionalAddress}}" stepKey="additionalAddress"/>
102+
<see userInput="Shipping Address" stepKey="seeShippingAddress"/>
103+
<see userInput="Billing Address" stepKey="seeBillingAddress"/>
104+
<assertEquals stepKey="assertValuesAreEqual" actual="$billingAddr" expected="$shippingAddr"/>
105+
<assertNotEquals stepKey="assertValuesAreNotEqual" actual="$billingAddr" expected="$additionalAddress"/>
106+
</test>
107+
</tests>

app/code/Magento/Braintree/view/frontend/layout/checkout_index_index.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@
3535
<item name="braintree_paypal" xsi:type="array">
3636
<item name="isBillingAddressRequired" xsi:type="boolean">false</item>
3737
</item>
38+
<item name="braintree_cc_vault" xsi:type="array">
39+
<item name="isBillingAddressRequired" xsi:type="boolean">true</item>
40+
</item>
3841
</item>
3942
</item>
4043
</item>

app/code/Magento/Checkout/Test/Mftf/Section/CheckoutOrderSummarySection.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,5 +13,9 @@
1313
<element name="productItemName" type="text" selector=".product-item-name"/>
1414
<element name="productItemQty" type="text" selector=".value"/>
1515
<element name="productItemPrice" type="text" selector=".price"/>
16+
<element name="orderNumber" type="text" selector="//div[@class='checkout-success']//a"/>
17+
<element name="shippingAddress" type="textarea" selector="//*[@class='box box-address-shipping']//address"/>
18+
<element name="billingAddress" type="textarea" selector="//*[@class='box box-address-billing']//address"/>
19+
<element name="additionalAddress" type="text" selector=".block.block-addresses-list"/>
1620
</section>
1721
</sections>

app/code/Magento/Checkout/Test/Mftf/Section/CheckoutPaymentSection.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,5 +47,8 @@
4747
<element name="taxPercentage" type="text" selector=".totals-tax-details .mark"/>
4848
<element name="orderSummaryTotalIncluding" type="text" selector="//tr[@class='grand totals incl']//span[@class='price']" />
4949
<element name="orderSummaryTotalExcluding" type="text" selector="//tr[@class='grand totals excl']//span[@class='price']" />
50+
<element name="shippingAndBillingAddressSame" type="input" selector="#billing-address-same-as-shipping-braintree_cc_vault"/>
51+
<element name="addressAction" type="button" selector="//span[text()='{{action}}']" parameterized="true"/>
52+
<element name="addressBook" type="button" selector="//a[text()='Address Book']"/>
5053
</section>
5154
</sections>

app/code/Magento/Vault/view/frontend/web/template/payment/form.html

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@
3232

3333
<div class="payment-method-content">
3434
<each args="getRegion('messages')" render=""></each>
35+
<div class="payment-method-billing-address">
36+
<!-- ko foreach: $parent.getRegion(getBillingAddressFormName()) -->
37+
<!-- ko template: getTemplate() --><!-- /ko -->
38+
<!--/ko-->
39+
</div>
3540
<div class="checkout-agreements-block">
3641
<!-- ko foreach: $parent.getRegion('before-place-order') -->
3742
<!-- ko template: getTemplate() --><!-- /ko -->

0 commit comments

Comments
 (0)