Skip to content

Commit c8653c6

Browse files
committed
Merge remote-tracking branch 'origin/2.4-develop' into ACP2E-4260
2 parents 67bc1a1 + f6aa682 commit c8653c6

File tree

11 files changed

+895
-14
lines changed

11 files changed

+895
-14
lines changed

app/code/Magento/Catalog/Test/Mftf/Test/AdminUpdateVirtualProductWithRegularPriceInStockWithCustomOptionsVisibleInSearchOnlyTest.xml

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@
2929
<createData entity="SimpleSubCategory" stepKey="categoryEntity"/>
3030
</before>
3131
<after>
32-
<actionGroup ref="AdminProductCatalogPageOpenActionGroup" stepKey="openProductCatalogPage1"/>
33-
<actionGroup ref="AdminDeleteAllProductsFromGridActionGroup" stepKey="selectAndDeleteProducts"/>
34-
<actionGroup ref="ClearFiltersAdminProductGridActionGroup" stepKey="clearFilterFromProductIndex"/>
32+
<!-- Delete all products via API -->
33+
<helper class="Magento\Catalog\Test\Mftf\Helper\ProductApiHelper" method="deleteAllProductsApi" stepKey="deleteAllProductsViaApi"/>
3534
<deleteData stepKey="deleteSimpleSubCategory" createDataKey="initialCategoryEntity"/>
3635
<deleteData stepKey="deleteSimpleSubCategory2" createDataKey="categoryEntity"/>
3736
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright 2025 Adobe
5+
* All Rights Reserved.
6+
*/
7+
-->
8+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminCreateWidgetWithEnabledBlockActionGroup" extends="AdminCreateWidgetWithBlockActionGroup">
12+
<annotations>
13+
<description>EXTENDS: AdminCreateWidgetWithBlockActionGroup. Creates the provided Widget which includes the provided enabled Block (instead of disabled).</description>
14+
</annotations>
15+
16+
<remove keyForRemoval="chooseStatus"/>
17+
<selectOption selector="{{AdminNewWidgetSection.blockStatus}}" userInput="Enable" stepKey="chooseStatusEnabled" after="waitForLoadBlocks"/>
18+
</actionGroup>
19+
</actionGroups>
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright 2025 Adobe
5+
* All Rights Reserved.
6+
*/
7+
-->
8+
<entities xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
9+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:DataGenerator/etc/dataProfileSchema.xsd">
10+
<entity name="DisablePageBuilderConfigData">
11+
<data key="path">cms/pagebuilder/enabled</data>
12+
<data key="value">0</data>
13+
</entity>
14+
<entity name="EnablePageBuilderConfigData">
15+
<data key="path">cms/pagebuilder/enabled</data>
16+
<data key="value">1</data>
17+
</entity>
18+
</entities>

app/code/Magento/LoginAsCustomer/Test/Mftf/ActionGroup/AdminLoginAsCustomerLogFilterDatePickerTodayActionGroup.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!--
33
/**
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
6-
*/
4+
* Copyright 2021 Adobe
5+
* All Rights Reserved.
6+
*/
77
-->
88

99
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
@@ -15,6 +15,7 @@
1515
<click selector="{{AdminLoginAsCustomerLogToolbarSection.filters}}" stepKey="clickFilters"/>
1616
<click selector="{{AdminLoginAsCustomerLogToolbarSection.DatePickerFrom}}" stepKey="clickFromDate"/>
1717
<click selector="{{AdminLoginAsCustomerLogToolbarSection.todayDate}}" stepKey="clickToToday"/>
18+
<waitForElementClickable selector="{{AdminLoginAsCustomerLogToolbarSection.DatePickerTo}}" stepKey="waitForToDateClickable"/>
1819
<click selector="{{AdminLoginAsCustomerLogToolbarSection.DatePickerTo}}" stepKey="clickToDate"/>
1920
<click selector="{{AdminLoginAsCustomerLogToolbarSection.todayDate}}" stepKey="clickTodayDateAgain"/>
2021
<click selector="{{AdminProductGridFilterSection.applyFilters}}" stepKey="clickApplyFilters"/>

app/code/Magento/Paypal/Test/Mftf/Data/PaypalData.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -323,5 +323,6 @@
323323
<data key="amount_note">Voided authorization. Amount: $15.00.</data>
324324
<data key="status">void</data>
325325
<data key="label">Voided</data>
326+
<data key="cancelled_note">Canceled order online Amount: $15.00.</data>
326327
</entity>
327328
</entities>
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<!--
3+
/**
4+
* Copyright 2025 Adobe
5+
* All Rights Reserved.
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="AdminCancelSalesOrderWithPaypalBillingAgreementTest">
12+
<annotations>
13+
<features value="PayPal"/>
14+
<stories value="Cancel Order with billing agreement"/>
15+
<title value="Cancel order placed within Billing Agreement"/>
16+
<description value="Place an order with billing agreement as payment method and Cancel the Order"/>
17+
<severity value="MAJOR"/>
18+
<testCaseId value="AC-5299"/>
19+
<group value="3rd_party_integration"/>
20+
<group value="pr_exclude"/>
21+
</annotations>
22+
<before>
23+
<!-- Simple product is created -->
24+
<createData entity="SimpleProduct" stepKey="createProduct">
25+
<field key="price">10</field>
26+
</createData>
27+
<!-- US Customer is created -->
28+
<createData entity="Simple_US_Customer_CA" stepKey="createCustomer"/>
29+
<!-- Set Billing Agreement value to Auto -->
30+
<magentoCLI command="config:set {{BillingAgreement.path}} {{BillingAgreement.value}}" stepKey="enableAutoBilling"/>
31+
<actionGroup ref="AdminLoginActionGroup" stepKey="loginAsAdmin"/>
32+
<!-- Configure PayPal Express Checkout -->
33+
<actionGroup ref="AdminPayPalExpressCheckoutEnableActionGroup" stepKey="ConfigPayPalExpress">
34+
<argument name="credentials" value="SamplePaypalExpressConfig2"/>
35+
</actionGroup>
36+
<actionGroup ref="AdminPayPalExpressCheckoutEnableBillingAgreementActionGroup" stepKey="enableBillingAgreement">
37+
<argument name="countryCode" value="{{MerchantUnitedStates.value}}"/>
38+
</actionGroup>
39+
<!-- Precondition Step 1: Order is placed within PayPal Billing Agreement -->
40+
<actionGroup ref="LoginToStorefrontActionGroup" stepKey="storefrontCustomerLogin">
41+
<argument name="Customer" value="$$createCustomer$$"/>
42+
</actionGroup>
43+
<!-- Add product to cart -->
44+
<actionGroup ref="AddSimpleProductToCartActionGroup" stepKey="addProductToCart">
45+
<argument name="product" value="$$createProduct$$"/>
46+
</actionGroup>
47+
<!-- Go to Checkout Page -->
48+
<actionGroup ref="StorefrontOpenCheckoutPageActionGroup" stepKey="goToCheckout"/>
49+
<actionGroup ref="StorefrontGuestCheckoutProceedToPaymentStepActionGroup" stepKey="clickNext"/>
50+
<!-- Click on PayPal payment radio button -->
51+
<waitForElementClickable selector="{{CheckoutPaymentSection.PayPalPaymentRadio}}" stepKey="waitForPayPalRadioButton"/>
52+
<click selector="{{CheckoutPaymentSection.PayPalPaymentRadio}}" stepKey="selectPaypalPayment"/>
53+
<actionGroup ref="SwitchToPayPalGroupBtnActionGroup" stepKey="clickPayPalBtn"/>
54+
<!-- Login to Paypal in-context-->
55+
<actionGroup ref="StorefrontLoginToPayPalPaymentAccountTwoStepActionGroup" stepKey="loginToPayPal"/>
56+
<!-- Click PayPal button and go back to Magento site -->
57+
<actionGroup ref="StorefrontPaypalSwitchBackToMagentoFromCheckoutPageActionGroup" stepKey="confirmPaymentAndGoBackToMagento"/>
58+
</before>
59+
<after>
60+
<actionGroup ref="AdminPayPalExpressCheckoutDisableActionGroup" stepKey="disablePaypalExpressCheckout"/>
61+
<!-- Login to Paypal in-context-->
62+
<actionGroup ref="AdminClearPayPalExpressCheckoutDataActionGroup" stepKey="clearPaypalExpressCheckoutFields"/>
63+
<actionGroup ref="AdminPayPalExpressCheckoutDisableBillingAgreementActionGroup" stepKey="disableBillingAgreement">
64+
<argument name="countryCode" value="{{MerchantUnitedStates.value}}"/>
65+
</actionGroup>
66+
<!-- Set Billing Agreement value to default -->
67+
<magentoCLI command="config:set {{BillingAgreement.path}} {{BillingAgreement.default}}" stepKey="disableAutoBilling"/>
68+
<actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="logoutCustomer" />
69+
<!-- Delete Data -->
70+
<deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/>
71+
<deleteData createDataKey="createProduct" stepKey="deleteProduct"/>
72+
<actionGroup ref="AdminLogoutActionGroup" stepKey="logout"/>
73+
</after>
74+
<actionGroup ref="AssertStorefrontCheckoutSuccessActionGroup" stepKey="assertOrderSuccess"/>
75+
<grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber22}}" stepKey="orderNumber"/>
76+
<waitForElementVisible selector="{{CheckoutSuccessMainSection.billingAgreement}}" stepKey="waitForBillingAgreement"/>
77+
<grabTextFrom selector="{{CheckoutSuccessMainSection.billingAgreement}}" stepKey="billingAgreement"/>
78+
<assertNotEmpty stepKey="assertOrderIdIsNotEmpty">
79+
<actualResult type="const">$orderNumber</actualResult>
80+
</assertNotEmpty>
81+
<assertNotEmpty stepKey="assertBillingAgreementIsNotEmpty">
82+
<actualResult type="const">$billingAgreement</actualResult>
83+
</assertNotEmpty>
84+
<!-- Step 2&3: Go to Sales > Orders & Open the Order from preconditions -->
85+
<actionGroup ref="OpenOrderByIdActionGroup" stepKey="openOrder">
86+
<argument name="orderId" value="{$orderNumber}"/>
87+
</actionGroup>
88+
<!-- Step 4&5: Cancel the Order& Click OK button-->
89+
<actionGroup ref="CancelPendingOrderActionGroup" stepKey="cancelOrder"/>
90+
<!-- Step 6: Observe order data -->
91+
<waitForElementVisible selector="{{AdminOrderDetailsInformationSection.paymentInformationField('Last Transaction ID')}}" stepKey="waitForGrabLastTransactionID"/>
92+
<actionGroup ref="AdminOpenOrderCommentsHistoryActionGroup" stepKey="clickOnCommentsHistoryTab"/>
93+
<grabTextFrom selector="{{AdminOrderCommentsTabSection.orderCommentsWithType(BillingAgreement.comment)}}" stepKey="grabOrderStatus"/>
94+
<waitForText selector="{{AdminOrderCommentsTabSection.orderComments}}" userInput="{{BillingAgreement.cancelled_note}}" stepKey="seeOrderHistoryPrice"/>
95+
<!-- Check the last transaction of the order and validate the details -->
96+
<waitForElementClickable selector="{{AdminTransactionsGridSection.transactionsSectionBtn}}" stepKey="waitForTransactionsTabToBeClicked"/>
97+
<click selector="{{AdminTransactionsGridSection.transactionsSectionBtn}}" stepKey="clickTransactionsTab"/>
98+
<waitForElementVisible selector="{{AdminTransactionsGridSection.orderTxnTable}}" stepKey="orderTransactionsTableIsVisible"/>
99+
<selectOption selector="{{AdminTransactionsGridSection.orderTxnTableTypeFilter}}" userInput="{{BillingAgreement.status}}" stepKey="selectVoidTypeTxn"/>
100+
<waitForElementClickable selector="{{AdminTransactionsGridSection.orderTxnTableSearchBtn}}" stepKey="waitToClickSearch"/>
101+
<click selector="{{AdminTransactionsGridSection.orderTxnTableSearchBtn}}" stepKey="clickSearch"/>
102+
<waitForPageLoad stepKey="waitForFilterToLoad"/>
103+
<waitForElementClickable selector="{{AdminTransactionsGridSection.orderTxnTableFirstRow}}" stepKey="clickOnVoidTransaction"/>
104+
<click selector="{{AdminTransactionsGridSection.orderTxnTableFirstRow}}" stepKey="clickVoidTxn"/>
105+
<waitForPageLoad stepKey="waitForTxnToLoad"/>
106+
<assertStringContainsString stepKey="assertEquals">
107+
<expectedResult type="string">{{BillingAgreement.comment}}</expectedResult>
108+
<actualResult type="variable">$grabOrderStatus</actualResult>
109+
</assertStringContainsString>
110+
<waitForText selector="{{AdminTransactionsGridSection.transactionData(AdminMenuPaypalTransaction.status)}}" userInput="{{StorefrontPaypalEnableSkipOrderReviewStepConfigData.label}}" stepKey="seeIfClosedHeaderIsSetAsYesForVoid"/>
111+
<waitForElementClickable selector="{{AdminProductFormActionSection.backButton}}" stepKey="waitForBackButtonToBeClicked"/>
112+
<click selector="{{AdminProductFormActionSection.backButton}}" stepKey="clickBackButton"/>
113+
<actionGroup ref="AdminViewAuthorizationTransactionsInOrderActionGroup" stepKey="validateAuthTransaction"/>
114+
<waitForText selector="{{AdminTransactionsGridSection.transactionData(AdminMenuPaypalTransaction.status)}}" userInput="{{StorefrontPaypalEnableSkipOrderReviewStepConfigData.label}}" stepKey="seeIfClosedHeaderIsSetAsYesForAuthorization"/>
115+
</test>
116+
</tests>

app/code/Magento/Swatches/Test/Mftf/Test/StorefrontSwatchAttributeDisplayedInWidgetCMSTest.xml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!--
33
/**
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
4+
* Copyright 2021 Adobe
5+
* All Rights Reserved.
66
*/
77
-->
88

@@ -96,8 +96,8 @@
9696
<after>
9797
<!-- Delete Category -->
9898
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
99-
<!-- Delete Configurable Product -->
100-
<deleteData createDataKey="createConfigurableProduct" stepKey="deleteConfigurableProduct"/>
99+
<!-- Delete all products via API -->
100+
<helper class="Magento\Catalog\Test\Mftf\Helper\ProductApiHelper" method="deleteAllProductsApi" stepKey="deleteAllProductsViaApi"/>
101101
<!-- Delete Attribute -->
102102
<deleteData createDataKey="createVisualSwatchAttribute" stepKey="deleteVisualSwatchAttribute"/>
103103
<!-- Delete CMS Page -->

app/code/Magento/Widget/Test/Mftf/Data/WidgetData.xml

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?xml version="1.0" encoding="UTF-8"?>
22
<!--
33
/**
4-
* Copyright © Magento, Inc. All rights reserved.
5-
* See COPYING.txt for license details.
4+
* Copyright 2018 Adobe
5+
* All Rights Reserved.
66
*/
77
-->
88

@@ -21,4 +21,17 @@
2121
<data key="container">Page Top</data>
2222
<data key="display_on">All Pages</data>
2323
</entity>
24+
<entity name="WidgetWithBlockMainContent" type="widget">
25+
<data key="type">CMS Static Block</data>
26+
<data key="designTheme">Magento Luma</data>
27+
<data key="design_theme">Magento Luma</data>
28+
<data key="name" unique="suffix">testName</data>
29+
<data key="store_id">All Store Views</data>
30+
<array key="store_ids">
31+
<item>All Store Views</item>
32+
</array>
33+
<data key="display">All Pages</data>
34+
<data key="container">Main Content Area</data>
35+
<data key="display_on">All Pages</data>
36+
</entity>
2437
</entities>

dev/tests/api-functional/testsuite/Magento/GraphQl/Quote/Guest/CheckoutEndToEndTest.php

Lines changed: 118 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
<?php
22
/**
3-
* Copyright © Magento, Inc. All rights reserved.
4-
* See COPYING.txt for license details.
3+
* Copyright 2019 Adobe
4+
* All Rights Reserved.
55
*/
6+
67
declare(strict_types=1);
78

89
namespace Magento\GraphQl\Quote\Guest;
@@ -15,6 +16,9 @@
1516
use Magento\Sales\Model\ResourceModel\Order\CollectionFactory;
1617
use Magento\TestFramework\Helper\Bootstrap;
1718
use Magento\TestFramework\TestCase\GraphQlAbstract;
19+
use Magento\TestFramework\Fixture\Config;
20+
use Magento\TestFramework\Fixture\DataFixture;
21+
use Magento\Catalog\Test\Fixture\Product as ProductFixture;
1822

1923
/**
2024
* End to checkout tests for guest
@@ -86,6 +90,32 @@ public function testCheckoutWorkflow()
8690
$this->placeOrder($cartId);
8791
}
8892

93+
/**
94+
* Test checkout workflow with null second street in shipping address
95+
* Validates that null values in street array are properly filtered and don't cause errors
96+
*/
97+
#[
98+
Config("checkout/options/guest_checkout", "1", "store", "default"),
99+
DataFixture(
100+
ProductFixture::class,
101+
['price' => 1, 'name' => 'simple1', 'sku' => 'simple1'],
102+
'simple1'
103+
)
104+
]
105+
public function testCheckoutWithNullSecondStreetInShippingAddress()
106+
{
107+
$cartId = $this->createEmptyCart();
108+
$this->setGuestEmailOnCart($cartId);
109+
$this->addProductToCart($cartId, 1, $this->findProduct());
110+
111+
$shippingMethod = $this->setAndVerifyShippingAddressWithNullSecondStreet($cartId);
112+
113+
$this->setBillingAddress($cartId);
114+
$paymentMethod = $this->setShippingMethod($cartId, $shippingMethod);
115+
$this->setPaymentMethod($cartId, $paymentMethod);
116+
$this->placeOrder($cartId);
117+
}
118+
89119
/**
90120
* @return string
91121
*/
@@ -397,6 +427,92 @@ private function placeOrder(string $cartId): void
397427
self::assertNotEmpty($response['placeOrder']['order']['order_number']);
398428
}
399429

430+
/**
431+
* Set shipping address with null second street in address
432+
*
433+
* @param string $cartId
434+
* @return array
435+
*/
436+
private function setAndVerifyShippingAddressWithNullSecondStreet(string $cartId): array
437+
{
438+
$query = <<<QUERY
439+
mutation {
440+
setShippingAddressesOnCart(
441+
input: {
442+
cart_id: "$cartId"
443+
shipping_addresses: [
444+
{
445+
address: {
446+
firstname: "B"
447+
lastname: "C"
448+
street: ["Lorem ipsum dolor sit ame", null]
449+
city: "PARIS"
450+
postcode: "56590"
451+
country_code: "FR"
452+
telephone: "0601020304"
453+
save_in_address_book: false
454+
}
455+
}
456+
]
457+
}
458+
) {
459+
cart {
460+
shipping_addresses {
461+
firstname
462+
lastname
463+
company
464+
street
465+
city
466+
postcode
467+
country {
468+
code
469+
label
470+
}
471+
telephone
472+
available_shipping_methods {
473+
carrier_code
474+
method_code
475+
amount {
476+
value
477+
}
478+
}
479+
}
480+
}
481+
}
482+
}
483+
QUERY;
484+
485+
$response = $this->graphQlMutation($query);
486+
487+
$this->assertArrayHasKey('setShippingAddressesOnCart', $response);
488+
$this->assertArrayHasKey('cart', $response['setShippingAddressesOnCart']);
489+
$this->assertArrayHasKey('shipping_addresses', $response['setShippingAddressesOnCart']['cart']);
490+
$this->assertCount(1, $response['setShippingAddressesOnCart']['cart']['shipping_addresses']);
491+
492+
$shippingAddress = current($response['setShippingAddressesOnCart']['cart']['shipping_addresses']);
493+
494+
$this->assertEquals('B', $shippingAddress['firstname']);
495+
$this->assertEquals('C', $shippingAddress['lastname']);
496+
$this->assertNull($shippingAddress['company']);
497+
$this->assertEquals(['Lorem ipsum dolor sit ame'], $shippingAddress['street']);
498+
$this->assertEquals('PARIS', $shippingAddress['city']);
499+
$this->assertEquals('56590', $shippingAddress['postcode']);
500+
$this->assertEquals('FR', $shippingAddress['country']['code']);
501+
$this->assertEquals('FR', $shippingAddress['country']['label']);
502+
$this->assertEquals('0601020304', $shippingAddress['telephone']);
503+
504+
$this->assertArrayHasKey('available_shipping_methods', $shippingAddress);
505+
$this->assertGreaterThan(0, count($shippingAddress['available_shipping_methods']));
506+
507+
$availableShippingMethod = current($shippingAddress['available_shipping_methods']);
508+
$this->assertArrayHasKey('carrier_code', $availableShippingMethod);
509+
$this->assertNotEmpty($availableShippingMethod['carrier_code']);
510+
$this->assertArrayHasKey('method_code', $availableShippingMethod);
511+
$this->assertNotEmpty($availableShippingMethod['method_code']);
512+
513+
return $availableShippingMethod;
514+
}
515+
400516
protected function tearDown(): void
401517
{
402518
$this->deleteQuote();

0 commit comments

Comments
 (0)