Skip to content

Commit 5274a51

Browse files
author
Igor Melnikov
committed
Merge remote-tracking branch 'origin/MAGETWO-69657-cc-cleared-squashed' into pr
2 parents 259be86 + 4df430a commit 5274a51

File tree

11 files changed

+333
-23
lines changed

11 files changed

+333
-23
lines changed

app/code/Magento/Checkout/view/frontend/web/js/model/payment-service.js

Lines changed: 47 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,22 @@ define([
1111
], function (_, quote, methodList, selectPaymentMethod) {
1212
'use strict';
1313

14-
var freeMethodCode = 'free';
14+
/**
15+
* Free method filter
16+
* @param {Object} paymentMethod
17+
* @returns {Boolean}
18+
*/
19+
var isFreePaymentMethod = function (paymentMethod) {
20+
return paymentMethod.method === 'free';
21+
},
22+
23+
/**
24+
* Grabs the grand total from quote
25+
* @returns {Number}
26+
*/
27+
getGrandTotal = function () {
28+
return quote.totals()['grand_total'];
29+
};
1530

1631
return {
1732
isFreeAvailable: false,
@@ -21,20 +36,19 @@ define([
2136
* @param {Array} methods
2237
*/
2338
setPaymentMethods: function (methods) {
24-
var self = this,
25-
freeMethod,
39+
var freeMethod,
2640
filteredMethods,
27-
methodIsAvailable;
41+
methodIsAvailable,
42+
methodNames;
2843

29-
freeMethod = _.find(methods, function (method) {
30-
return method.method === freeMethodCode;
31-
});
44+
freeMethod = _.find(methods, isFreePaymentMethod);
3245
this.isFreeAvailable = !!freeMethod;
3346

34-
if (self.isFreeAvailable && freeMethod && quote.totals()['grand_total'] <= 0) {
47+
if (freeMethod && getGrandTotal() <= 0) {
3548
methods.splice(0, methods.length, freeMethod);
3649
selectPaymentMethod(freeMethod);
3750
}
51+
3852
filteredMethods = _.without(methods, freeMethod);
3953

4054
if (filteredMethods.length === 1) {
@@ -48,6 +62,20 @@ define([
4862
selectPaymentMethod(null);
4963
}
5064
}
65+
66+
/**
67+
* Overwrite methods with existing methods to preserve ko array references.
68+
* This prevent ko from re-rendering those methods.
69+
*/
70+
methodNames = _.pluck(methods, 'method');
71+
_.map(methodList(), function (existingMethod) {
72+
var existingMethodIndex = methodNames.indexOf(existingMethod.method);
73+
74+
if (existingMethodIndex !== -1) {
75+
methods[existingMethodIndex] = existingMethod;
76+
}
77+
});
78+
5179
methodList(methods);
5280
},
5381

@@ -56,20 +84,18 @@ define([
5684
* @returns {Array}
5785
*/
5886
getAvailablePaymentMethods: function () {
59-
var methods = [],
60-
self = this;
61-
62-
_.each(methodList(), function (method) {
63-
if (self.isFreeAvailable && (
64-
quote.totals()['grand_total'] <= 0 && method.method === freeMethodCode ||
65-
quote.totals()['grand_total'] > 0 && method.method !== freeMethodCode
66-
) || !self.isFreeAvailable
67-
) {
68-
methods.push(method);
69-
}
70-
});
87+
var allMethods = methodList().slice(),
88+
grandTotalOverZero = getGrandTotal() > 0;
89+
90+
if (!this.isFreeAvailable) {
91+
return allMethods;
92+
}
93+
94+
if (grandTotalOverZero) {
95+
return _.reject(allMethods, isFreePaymentMethod);
96+
}
7197

72-
return methods;
98+
return _.filter(allMethods, isFreePaymentMethod);
7399
}
74100
};
75101
});
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Authorizenet\Test\Block\Form;
8+
9+
use Magento\Mtf\Client\Locator;
10+
use Magento\Payment\Test\Block\Form\PaymentCc;
11+
12+
/**
13+
* Form for credit card data for Authorize.net payment method.
14+
*/
15+
class AuthorizenetCc extends PaymentCc
16+
{
17+
/**
18+
* Authorizenet form locators.
19+
*
20+
* @var array
21+
*/
22+
private $authorizenetForm = [
23+
"cc_number" => "//*[@id='authorizenet_directpost_cc_number']",
24+
"cc_exp_month" => "//*[@id='authorizenet_directpost_expiration']",
25+
"cc_exp_year" => "//*[@id='authorizenet_directpost_expiration_yr']",
26+
"cc_cid" => "//*[@id='authorizenet_directpost_cc_cid']",
27+
];
28+
29+
/**
30+
* Get Filled CC Number.
31+
*
32+
* @return string
33+
*/
34+
public function getCCNumber()
35+
{
36+
return $this->_rootElement->find($this->authorizenetForm['cc_number'], Locator::SELECTOR_XPATH)->getValue();
37+
}
38+
39+
/**
40+
* Get Filled CC Number.
41+
*
42+
* @return string
43+
*/
44+
public function getExpMonth()
45+
{
46+
return $this->_rootElement->find($this->authorizenetForm['cc_exp_month'], Locator::SELECTOR_XPATH)->getValue();
47+
}
48+
49+
/**
50+
* Get Expiration Year
51+
*
52+
* @return string
53+
*/
54+
public function getExpYear()
55+
{
56+
return $this->_rootElement->find($this->authorizenetForm['cc_exp_year'], Locator::SELECTOR_XPATH)->getValue();
57+
}
58+
59+
/**
60+
* Get CID
61+
*
62+
* @return string
63+
*/
64+
public function getCid()
65+
{
66+
return $this->_rootElement->find($this->authorizenetForm['cc_cid'], Locator::SELECTOR_XPATH)->getValue();
67+
}
68+
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?xml version="1.0" ?>
2+
<!--
3+
/**
4+
* Copyright © Magento, Inc. All rights reserved.
5+
* See COPYING.txt for license details.
6+
*/
7+
-->
8+
<mapping strict="0">
9+
<fields>
10+
<cc_number>
11+
<selector>#authorizenet_directpost_cc_number</selector>
12+
</cc_number>
13+
<cc_exp_month>
14+
<selector>#authorizenet_directpost_expiration</selector>
15+
</cc_exp_month>
16+
<cc_exp_year>
17+
<selector>#authorizenet_directpost_expiration_yr</selector>
18+
</cc_exp_year>
19+
<cc_cid>
20+
<selector>#authorizenet_directpost_cc_cid</selector>
21+
</cc_cid>
22+
</fields>
23+
</mapping>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Authorizenet\Test\Constraint;
8+
9+
use Magento\Checkout\Test\Page\CheckoutOnepage;
10+
use Magento\Mtf\Constraint\AbstractConstraint;
11+
use Magento\Payment\Test\Fixture\CreditCard;
12+
13+
/**
14+
* Assert credit card fields have set values from fixture.
15+
*/
16+
class AssertCreditCardNumberOnOnePageCheckout extends AbstractConstraint
17+
{
18+
/**
19+
* Assert payment form values did persist from fixture after checkout blocks refresh
20+
*
21+
* @param CheckoutOnepage $checkoutOnepage
22+
* @param CreditCard $creditCard
23+
* @return void
24+
*/
25+
public function processAssert(CheckoutOnepage $checkoutOnepage, CreditCard $creditCard)
26+
{
27+
\PHPUnit_Framework_Assert::assertEquals(
28+
$creditCard->getCcNumber(),
29+
$checkoutOnepage->getAuthorizenetBlock()->getCCNumber(),
30+
'Credit card data did persist with the values from fixture'
31+
);
32+
}
33+
34+
/**
35+
* Returns string representation of successful assertion
36+
*
37+
* @return string
38+
*/
39+
public function toString()
40+
{
41+
return 'Credit card data did persist with the values from fixture.';
42+
}
43+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/pages.xsd">
9+
<page name="CheckoutOnepage" mca="checkout/index">
10+
<block name="authorizenetBlock" class="Magento\Authorizenet\Test\Block\Form\AuthorizenetCc" locator="#payment_form_authorizenet_directpost" strategy="css selector"/>
11+
<block name="paymentBlock">
12+
<render name="authorizenet" class="Magento\Authorizenet\Test\Block\Form\AuthorizenetCc" />
13+
</block>
14+
</page>
15+
</config>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
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+
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../../../../../vendor/magento/mtf/etc/variations.xsd">
9+
<testCase name="Magento\SalesRule\Test\TestCase\OnePageCheckoutPaymentMethodDataPersistenceWithDiscountTest" summary="Checkout with Authorize.net credit card on Storefront with discount applied during checkout">
10+
<variation name="OnePageCheckoutPaymentMethodDataPersistWithDiscountTest1" summary="Checkout with Authorize.net credit card on Storefront with discount applied during checkout" ticketId="MAGETWO-69657">
11+
<data name="description" xsi:type="string">Use saved for Authorize.net credit card on checkout</data>
12+
<data name="products/0" xsi:type="string">catalogProductSimple::product_10_dollar</data>
13+
<data name="customer/dataset" xsi:type="string">default</data>
14+
<data name="salesRule" xsi:type="string">active_sales_rule_for_all_groups</data>
15+
<data name="shippingAddress/dataset" xsi:type="string">US_address_1_without_email</data>
16+
<data name="checkoutMethod" xsi:type="string">login</data>
17+
<data name="shipping/shipping_service" xsi:type="string">Flat Rate</data>
18+
<data name="shipping/shipping_method" xsi:type="string">Fixed</data>
19+
<data name="payment/method" xsi:type="string">authorizenet_directpost</data>
20+
<data name="paymentForm" xsi:type="string">default</data>
21+
<data name="creditCard/dataset" xsi:type="string">visa_default</data>
22+
<data name="creditCard/data/payment_code" xsi:type="string">authorizenet</data>
23+
<data name="prices" xsi:type="array">
24+
<item name="grandTotal" xsi:type="string">10.00</item>
25+
</data>
26+
<data name="creditCardSave" xsi:type="string">Yes</data>
27+
<data name="configData" xsi:type="string">authorizenet</data>
28+
<data name="status" xsi:type="string">Processing</data>
29+
<data name="tag" xsi:type="string">severity:S1</data>
30+
<constraint name="Magento\Authorizenet\Test\Constraint\AssertCreditCardNumberOnOnePageCheckout" />
31+
</variation>
32+
</testCase>
33+
</config>
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Checkout\Test\Constraint;
8+
9+
use Magento\Checkout\Test\Page\CheckoutOnepage;
10+
use Magento\Mtf\Constraint\AbstractConstraint;
11+
12+
/**
13+
* Assert payment method is absent on Checkout Payment Page.
14+
*/
15+
class AssertPaymentMethodPersistence extends AbstractConstraint
16+
{
17+
/**
18+
* Assert payment method is absent on Checkout Payment Page.
19+
*
20+
* @param CheckoutOnepage $checkoutOnepage
21+
* @param array $payment
22+
* @return void
23+
*/
24+
public function processAssert(CheckoutOnepage $checkoutOnepage, array $payment)
25+
{
26+
\PHPUnit_Framework_Assert::assertFalse(
27+
$checkoutOnepage->getPaymentBlock()->isVisiblePaymentMethod($payment),
28+
'Payment method' . $payment['method']. ' is present on Checkout Payment Page.'
29+
);
30+
}
31+
32+
/**
33+
* Returns string representation of successful assertion.
34+
*
35+
* @return string
36+
*/
37+
public function toString()
38+
{
39+
return 'Payment method is absent on Checkout Payment Page';
40+
}
41+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\SalesRule\Test\TestCase;
8+
9+
use Magento\Mtf\TestCase\Scenario;
10+
11+
class OnePageCheckoutPaymentMethodDataPersistenceWithDiscountTest extends Scenario
12+
{
13+
/* tags */
14+
const MVP = 'yes';
15+
const TEST_TYPE = 'acceptance_test, extended_acceptance_test, 3rd_party_test';
16+
/* end tags */
17+
18+
/**
19+
* Runs one page checkout test.
20+
*
21+
* @return void
22+
*/
23+
public function test()
24+
{
25+
$this->executeScenario();
26+
}
27+
}

0 commit comments

Comments
 (0)