Skip to content

Commit fd7e45e

Browse files
committed
AC-2701:: Roll back and Fixed the static tests
1 parent f9adcd9 commit fd7e45e

File tree

15 files changed

+418
-15
lines changed

15 files changed

+418
-15
lines changed

app/code/Magento/Checkout/Controller/Cart/UpdateItemQty.php

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ private function updateItemQuantity(Item $item, float $qty)
130130
{
131131
if ($qty > 0) {
132132
$item->clearMessage();
133+
$item->setHasError(false);
133134
$item->setQty($qty);
134135

135136
if ($item->getHasError()) {

app/code/Magento/Checkout/Model/Cart.php

+6
Original file line numberDiff line numberDiff line change
@@ -535,6 +535,8 @@ public function updateItems($data)
535535

536536
$qty = isset($itemInfo['qty']) ? (double)$itemInfo['qty'] : false;
537537
if ($qty > 0) {
538+
$item->clearMessage();
539+
$item->setHasError(false);
538540
$item->setQty($qty);
539541

540542
if ($item->getHasError()) {
@@ -707,6 +709,9 @@ public function getItemsQty()
707709
*/
708710
public function updateItem($itemId, $requestInfo = null, $updatingParams = null)
709711
{
712+
$product = null;
713+
$productId = null;
714+
710715
try {
711716
$item = $this->getQuote()->getItemById($itemId);
712717
if (!$item) {
@@ -757,6 +762,7 @@ public function updateItem($itemId, $requestInfo = null, $updatingParams = null)
757762
* Getter for RequestInfoFilter
758763
*
759764
* @deprecated 100.1.2
765+
* @see MAGETWO-60073
760766
* @return \Magento\Checkout\Model\Cart\RequestInfoFilterInterface
761767
*/
762768
private function getRequestInfoFilter()
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
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+
<tests xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
10+
<test name="StorefrontProductQuantityAcceptLowerThanStockQuantityAfterChangingStockInBackendTest">
11+
<annotations>
12+
<stories value="Cart"/>
13+
<title value="Verify if lower than stock product quantity is accepted after changing stock qty in backend"/>
14+
<description value="Verify if lower than stock product quantity is accepted after changing stock qty in backend"/>
15+
<severity value="CRITICAL"/>
16+
<testCaseId value="AC-5987"/>
17+
<group value="mtf_migrated"/>
18+
</annotations>
19+
20+
<before>
21+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginToAdminPanel"/>
22+
<createData entity="defaultSimpleProduct" stepKey="simpleProduct">
23+
<field key="price">10.00</field>
24+
<field key="quantity">20</field>
25+
</createData>
26+
</before>
27+
<after>
28+
<deleteData createDataKey="simpleProduct" stepKey="deleteProduct"/>
29+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
30+
</after>
31+
32+
<!--Open Product page in StoreFront and assert product and price range -->
33+
<actionGroup ref="AssertProductNameAndSkuInStorefrontProductPageByCustomAttributeUrlKeyActionGroup" stepKey="openProductPage">
34+
<argument name="product" value="$$simpleProduct$$"/>
35+
</actionGroup>
36+
37+
<!--Add product to the cart -->
38+
<actionGroup ref="StorefrontAddProductToCartWithQtyActionGroup" stepKey="addProductToTheCart">
39+
<argument name="productQty" value="12"/>
40+
</actionGroup>
41+
42+
<!--Open View and edit -->
43+
<actionGroup ref="ClickViewAndEditCartFromMiniCartActionGroup" stepKey="clickMiniCart"/>
44+
45+
<waitForPageLoad stepKey="waitForOrderPageToLoad"/>
46+
47+
<!--Edit product qty via admin panel-->
48+
<openNewTab stepKey="openNewTab"/>
49+
<actionGroup ref="AdminProductPageOpenByIdActionGroup" stepKey="goToProductEditPage">
50+
<argument name="productId" value="$$simpleProduct.id$$"/>
51+
</actionGroup>
52+
<fillField userInput="10" selector="{{AdminProductFormSection.productQuantity}}" stepKey="setNewQty"/>
53+
<actionGroup ref="SaveProductFormActionGroup" stepKey="saveProduct"/>
54+
<closeTab stepKey="closeTab"/>
55+
56+
<!--Check quantity-->
57+
<actionGroup ref="ReloadPageActionGroup" stepKey="reloadPage"/>
58+
<comment userInput="Replacing reload action and preserve Backward Compatibility" stepKey="waitForCheckoutPageReload"/>
59+
60+
<waitForPageLoad stepKey="waitForPageLoad1"/>
61+
<waitForAjaxLoad stepKey="waitForAjaxLoad1"/>
62+
63+
<!--Assert "The requested qty is not available"-->
64+
<see selector="{{CheckoutCartMessageSection.errorMessage}}" userInput="The requested qty is not available" stepKey="seeTheErrorMessageDisplayed"/>
65+
66+
<fillField selector="{{CheckoutCartProductSection.qty($$simpleProduct.sku$$)}}" userInput="8" stepKey="updateProductQty"/>
67+
<click selector="{{CheckoutCartProductSection.updateShoppingCartButton}}" stepKey="clickUpdateShoppingCart"/>
68+
<waitForAjaxLoad stepKey="waitForAjaxLoad2"/>
69+
<waitForAjaxLoad stepKey="waitForPageLoad2"/>
70+
71+
<dontSee userInput="The requested qty is not available" stepKey="dontSeeTheErrorMessageDisplayed"/>
72+
73+
</test>
74+
</tests>

app/code/Magento/Checkout/view/frontend/web/js/model/place-order.js

+8
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ define(
1919

2020
return function (serviceUrl, payload, messageContainer) {
2121
var headers = {};
22+
var redirectURL = '';
2223

2324
fullScreenLoader.startLoader();
2425
_.each(hooks.requestModifiers, function (modifier) {
@@ -30,6 +31,13 @@ define(
3031
).fail(
3132
function (response) {
3233
errorProcessor.process(response, messageContainer);
34+
redirectURL = response.getResponseHeader('errorRedirectAction');
35+
36+
if (redirectURL) {
37+
setTimeout(function () {
38+
errorProcessor.redirectTo(redirectURL);
39+
}, 3000);
40+
}
3341
}
3442
).done(
3543
function (response) {
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Payment\Plugin;
9+
10+
use Magento\Framework\App\ObjectManager;
11+
use Magento\Payment\Block\Form\Container;
12+
use Magento\Vault\Model\Ui\Adminhtml\TokensConfigProvider;
13+
14+
/**
15+
* @SuppressWarnings(PHPMD)
16+
*/
17+
class PaymentMethodProcess
18+
{
19+
/**
20+
* @var string
21+
*/
22+
private string $braintreeCCVault;
23+
24+
/**
25+
* @var TokensConfigProvider
26+
*/
27+
private TokensConfigProvider $tokensConfigProvider;
28+
29+
/**
30+
* @param string $braintreeCCVault
31+
* @param TokensConfigProvider|null $tokensConfigProvider
32+
*/
33+
public function __construct(
34+
string $braintreeCCVault = '',
35+
TokensConfigProvider $tokensConfigProvider = null
36+
) {
37+
$this->braintreeCCVault = $braintreeCCVault;
38+
$this->tokensConfigProvider = $tokensConfigProvider ??
39+
ObjectManager::getInstance()->get(TokensConfigProvider::class);
40+
}
41+
42+
/**
43+
* Retrieve available payment methods
44+
*
45+
* @param Container $container
46+
* @param array $results
47+
* @return array
48+
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
49+
*/
50+
public function afterGetMethods(Container $container, array $results): array
51+
{
52+
$methods = [];
53+
foreach ($results as $result) {
54+
if ($result->getCode() === $this->braintreeCCVault
55+
&& empty($this->tokensConfigProvider->getTokensComponents($result->getCode()))) {
56+
57+
continue;
58+
}
59+
$methods[] = $result;
60+
}
61+
return $methods;
62+
}
63+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,142 @@
1+
<?php
2+
/**
3+
* Copyright © Magento, Inc. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
declare(strict_types=1);
7+
8+
namespace Magento\Payment\Test\Unit\Plugin;
9+
10+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager;
11+
use Magento\Payment\Api\Data\PaymentMethodInterface;
12+
use Magento\Payment\Block\Form\Container;
13+
use Magento\Payment\Plugin\PaymentMethodProcess;
14+
use Magento\Vault\Model\Ui\Adminhtml\TokensConfigProvider;
15+
use Magento\Vault\Model\Ui\TokenUiComponentInterface;
16+
use PHPUnit\Framework\MockObject\MockObject;
17+
use PHPUnit\Framework\TestCase;
18+
19+
class PaymentMethodProcessTest extends TestCase
20+
{
21+
/**
22+
* @const string
23+
*/
24+
public const PAYMENT_METHOD_CHECKMO = 'checkmo';
25+
26+
/**
27+
* @const string
28+
*/
29+
public const PAYMENT_METHOD_BRAINTREE = 'braintree';
30+
31+
/**
32+
* @const string
33+
*/
34+
public const PAYMENT_METHOD_BRAINTREE_CC_VAULT = 'braintree_cc_vault';
35+
36+
/**
37+
* @var TokensConfigProvider|MockObject
38+
*/
39+
private TokensConfigProvider $tokensConfigProviderMock;
40+
41+
/**
42+
* @var Container|MockObject
43+
*/
44+
private $containerMock;
45+
46+
/**
47+
* @var PaymentMethodProcess
48+
*/
49+
private $plugin;
50+
51+
/**
52+
* Set up
53+
*/
54+
protected function setUp(): void
55+
{
56+
$this->tokensConfigProviderMock = $this->getMockBuilder(TokensConfigProvider::class)
57+
->disableOriginalConstructor()
58+
->getMock();
59+
$objectManagerHelper = new ObjectManager($this);
60+
$this->containerMock = $objectManagerHelper->getObject(Container::class);
61+
62+
$this->plugin = $objectManagerHelper->getObject(
63+
PaymentMethodProcess::class,
64+
[
65+
'braintreeCCVault' => self::PAYMENT_METHOD_BRAINTREE_CC_VAULT,
66+
'tokensConfigProvider' => $this->tokensConfigProviderMock
67+
]
68+
);
69+
}
70+
71+
/**
72+
* @param array $methods
73+
* @param array $expectedResult
74+
* @param array $tokenComponents
75+
* @dataProvider afterGetMethodsDataProvider
76+
*/
77+
public function testAfterGetMethods(array $methods, array $expectedResult, array $tokenComponents)
78+
{
79+
80+
$this->tokensConfigProviderMock->method('getTokensComponents')
81+
->with(self::PAYMENT_METHOD_BRAINTREE_CC_VAULT)
82+
->willReturn($tokenComponents);
83+
84+
$result = $this->plugin->afterGetMethods($this->containerMock, $methods);
85+
$this->assertEquals($result, $expectedResult);
86+
}
87+
88+
/**
89+
* Data provider for AfterGetMethods.
90+
*
91+
* @return array
92+
*/
93+
public function afterGetMethodsDataProvider(): array
94+
{
95+
$tokenUiComponentInterface = $this->getMockBuilder(TokenUiComponentInterface::class)
96+
->disableOriginalConstructor()
97+
->getMock();
98+
99+
$checkmoPaymentMethod = $this
100+
->getMockBuilder(PaymentMethodInterface::class)
101+
->disableOriginalConstructor()
102+
->setMethods(['getCode'])
103+
->getMockForAbstractClass();
104+
$brainTreePaymentMethod = $this
105+
->getMockBuilder(PaymentMethodInterface::class)
106+
->disableOriginalConstructor()
107+
->setMethods(['getCode'])
108+
->getMockForAbstractClass();
109+
$brainTreeCCVaultTPaymentMethod = $this
110+
->getMockBuilder(PaymentMethodInterface::class)
111+
->disableOriginalConstructor()
112+
->setMethods(['getCode'])
113+
->getMockForAbstractClass();
114+
115+
$checkmoPaymentMethod->expects($this->any())->method('getCode')
116+
->willReturn(self::PAYMENT_METHOD_CHECKMO);
117+
$brainTreePaymentMethod->expects($this->any())->method('getCode')
118+
->willReturn(self::PAYMENT_METHOD_BRAINTREE);
119+
$brainTreeCCVaultTPaymentMethod->expects($this->any())->method('getCode')
120+
->willReturn(self::PAYMENT_METHOD_BRAINTREE_CC_VAULT);
121+
122+
$paymentMethods = [
123+
$checkmoPaymentMethod,
124+
$brainTreePaymentMethod,
125+
$brainTreeCCVaultTPaymentMethod,
126+
];
127+
$expectedResult1 = [
128+
$checkmoPaymentMethod,
129+
$brainTreePaymentMethod,
130+
$brainTreeCCVaultTPaymentMethod
131+
];
132+
$expectedResult2 = [
133+
$checkmoPaymentMethod,
134+
$brainTreePaymentMethod,
135+
];
136+
137+
return [
138+
[$paymentMethods, $expectedResult1, [$tokenUiComponentInterface]],
139+
[$paymentMethods, $expectedResult2, []],
140+
];
141+
}
142+
}

app/code/Magento/Payment/composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@
1313
"magento/module-quote": "*",
1414
"magento/module-sales": "*",
1515
"magento/module-store": "*",
16-
"magento/module-ui": "*"
16+
"magento/module-ui": "*",
17+
"magento/module-vault": "*"
1718
},
1819
"type": "magento2-module",
1920
"license": [

app/code/Magento/Payment/etc/di.xml

+8
Original file line numberDiff line numberDiff line change
@@ -81,4 +81,12 @@
8181
<argument name="logger" xsi:type="object">Magento\Payment\Model\Method\VirtualLogger</argument>
8282
</arguments>
8383
</type>
84+
<type name="Magento\Payment\Block\Form\Container">
85+
<plugin name="PaymentMethodProcess" type="Magento\Payment\Plugin\PaymentMethodProcess"/>
86+
</type>
87+
<type name="Magento\Payment\Plugin\PaymentMethodProcess">
88+
<arguments>
89+
<argument name="braintreeCCVault" xsi:type="string">braintree_cc_vault</argument>
90+
</arguments>
91+
</type>
8492
</config>

0 commit comments

Comments
 (0)