Skip to content

Commit a34a421

Browse files
author
Oleksandr Gorkun
committed
Merge branch '2.4.0-develop' of https://github.com/magento/magento2ce into MC-34764
2 parents d1133e4 + 472a341 commit a34a421

9 files changed

+192
-24
lines changed

app/code/Magento/Multishipping/Test/Mftf/Test/StorefrontCheckingWithCartPriceRuleMatchingSubtotalForMultiShipmentTest.xml

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,6 @@
1919
<group value="Multishipment"/>
2020
<group value="SalesRule"/>
2121
</annotations>
22-
<before>
23-
<magentoCLI command="config:set multishipping/options/checkout_multiple 1" stepKey="allowShippingToMultipleAddresses"/>
24-
</before>
25-
<after>
26-
<magentoCLI command="config:set multishipping/options/checkout_multiple 0" stepKey="disableShippingToMultipleAddresses"/>
27-
</after>
2822
<actionGroup ref="AdminCreateCartPriceRuleActionsWithSubtotalActionGroup" before="goToProduct1" stepKey="createSubtotalCartPriceRuleActionsSection">
2923
<argument name="ruleName" value="CartPriceRuleConditionForSubtotalForMultiShipping"/>
3024
</actionGroup>

app/code/Magento/Multishipping/Test/Mftf/Test/StorefrontCheckoutWithMultipleAddressesTest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
<before>
2323
<!-- Login as Admin -->
2424
<actionGroup ref="AdminLoginActionGroup" stepKey="login"/>
25-
<!-- Set configurations -->
26-
<magentoCLI command="config:set multishipping/options/checkout_multiple 1" stepKey="allowShippingToMultipleAddresses"/>
2725
<!-- Create simple products -->
2826
<createData entity="SimpleSubCategory" stepKey="createCategory"/>
2927
<createData entity="SimpleProduct" stepKey="firstProduct">

app/code/Magento/Multishipping/Test/Mftf/Test/StorefrontOrderWithMultishippingTest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
<createData entity="SimpleProduct2" stepKey="createProduct2"/>
2828
<createData entity="Simple_US_Customer_Two_Addresses" stepKey="createCustomer"/>
2929
<!-- Set configurations -->
30-
<magentoCLI command="config:set {{EnableMultiShippingCheckoutMultiple.path}} {{EnableMultiShippingCheckoutMultiple.value}}" stepKey="allowShippingToMultipleAddresses"/>
3130
<magentoCLI command="config:set {{EnableFreeShippingMethod.path}} {{EnableFreeShippingMethod.value}}" stepKey="enableFreeShipping"/>
3231
<magentoCLI command="config:set {{EnableFlatRateShippingMethod.path}} {{EnableFlatRateShippingMethod.value}}" stepKey="enableFlatRateShipping"/>
3332
<magentoCLI command="config:set {{EnableCheckMoneyOrderPaymentMethod.path}} {{EnableCheckMoneyOrderPaymentMethod.value}}" stepKey="enableCheckMoneyOrderPaymentMethod"/>
@@ -43,7 +42,6 @@
4342
<!-- Need logout before customer delete. Fatal error appears otherwise -->
4443
<actionGroup ref="StorefrontCustomerLogoutActionGroup" stepKey="customerLogout"/>
4544
<deleteData createDataKey="createCustomer" stepKey="deleteCustomer"/>
46-
<magentoCLI command="config:set {{DisableMultiShippingCheckoutMultiple.path}} {{DisableMultiShippingCheckoutMultiple.value}}" stepKey="withdrawShippingToMultipleAddresses"/>
4745
<magentoCLI command="config:set {{DisableFreeShippingMethod.path}} {{DisableFreeShippingMethod.value}}" stepKey="disableFreeShipping"/>
4846
<actionGroup ref="AdminOrdersGridClearFiltersActionGroup" stepKey="clearAllOrdersGridFilters"/>
4947
<actionGroup ref="AdminLogoutActionGroup" stepKey="logoutFromAdmin"/>

app/code/Magento/Multishipping/Test/Mftf/Test/StorefrontProcessMultishippingCheckoutWhenCartPageIsOpenedInAnotherTabTest.xml

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
<before>
2323
<!-- Login as Admin -->
2424
<actionGroup ref="AdminLoginActionGroup" stepKey="login"/>
25-
<!-- Set configurations -->
26-
<magentoCLI command="config:set multishipping/options/checkout_multiple 1" stepKey="allowShippingToMultipleAddresses"/>
2725
<!-- Create two simple products -->
2826
<createData entity="ApiCategory" stepKey="createCategory"/>
2927
<createData entity="_defaultProduct" stepKey="createFirstProduct">
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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\Quote\Model\GuestCart;
9+
10+
use Magento\Quote\Api\GuestCartManagementInterface;
11+
use Magento\Quote\Model\QuoteIdMaskFactory;
12+
use Magento\Quote\Model\ResourceModel\Quote\QuoteIdMask as QuoteIdMaskResourceModel;
13+
use Magento\Quote\Model\Quote;
14+
15+
/**
16+
* Return empty cart for guest
17+
*/
18+
class GuestCartResolver
19+
{
20+
/**
21+
* @var GuestCartManagementInterface
22+
*/
23+
private $guestCartManagement;
24+
25+
/**
26+
* @var QuoteIdMaskFactory
27+
*/
28+
private $quoteIdMaskFactory;
29+
30+
/**
31+
* @var QuoteIdMaskResourceModel
32+
*/
33+
private $quoteIdMaskResourceModel;
34+
35+
/**
36+
* @var \Magento\Quote\Api\GuestCartRepositoryInterface
37+
*/
38+
private $guestCartRepository;
39+
40+
/**
41+
* @param GuestCartManagementInterface $guestCartManagement
42+
* @param QuoteIdMaskFactory $quoteIdMaskFactory
43+
* @param QuoteIdMaskResourceModel $quoteIdMaskResourceModel
44+
* @param \Magento\Quote\Api\GuestCartRepositoryInterface $guestCartRepository
45+
*/
46+
public function __construct(
47+
GuestCartManagementInterface $guestCartManagement,
48+
QuoteIdMaskFactory $quoteIdMaskFactory,
49+
QuoteIdMaskResourceModel $quoteIdMaskResourceModel,
50+
\Magento\Quote\Api\GuestCartRepositoryInterface $guestCartRepository
51+
) {
52+
$this->guestCartManagement = $guestCartManagement;
53+
$this->quoteIdMaskFactory = $quoteIdMaskFactory;
54+
$this->quoteIdMaskResourceModel = $quoteIdMaskResourceModel;
55+
$this->guestCartRepository = $guestCartRepository;
56+
}
57+
58+
/**
59+
* Create empty cart for guest
60+
*
61+
* @param string|null $predefinedMaskedQuoteId
62+
* @return Quote
63+
* @throws \Magento\Framework\Exception\AlreadyExistsException
64+
* @throws \Magento\Framework\Exception\CouldNotSaveException
65+
* @throws \Magento\Framework\Exception\NoSuchEntityException
66+
*/
67+
public function resolve(string $predefinedMaskedQuoteId = null): Quote
68+
{
69+
$maskedQuoteId = $this->guestCartManagement->createEmptyCart();
70+
71+
if ($predefinedMaskedQuoteId !== null) {
72+
$quoteIdMask = $this->quoteIdMaskFactory->create();
73+
$this->quoteIdMaskResourceModel->load($quoteIdMask, $maskedQuoteId, 'masked_id');
74+
75+
$quoteIdMask->setMaskedId($predefinedMaskedQuoteId);
76+
$this->quoteIdMaskResourceModel->save($quoteIdMask);
77+
$maskedQuoteId = $predefinedMaskedQuoteId;
78+
}
79+
80+
return $this->guestCartRepository->get($maskedQuoteId);
81+
}
82+
}

app/code/Magento/Sales/Controller/AbstractController/Reorder.php

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99
namespace Magento\Sales\Controller\AbstractController;
1010

11+
use Magento\Checkout\Model\Session as CheckoutSession;
1112
use Magento\Framework\App\Action;
1213
use Magento\Framework\App\Action\HttpPostActionInterface;
1314
use Magento\Framework\App\ObjectManager;
@@ -35,6 +36,11 @@ abstract class Reorder extends Action\Action implements HttpPostActionInterface
3536
*/
3637
private $reorder;
3738

39+
/**
40+
* @var CheckoutSession
41+
*/
42+
private $checkoutSession;
43+
3844
/**
3945
* Constructor
4046
*
@@ -43,19 +49,22 @@ abstract class Reorder extends Action\Action implements HttpPostActionInterface
4349
* @param Registry $registry
4450
* @param ReorderHelper|null $reorderHelper
4551
* @param \Magento\Sales\Model\Reorder\Reorder|null $reorder
52+
* @param CheckoutSession|null $checkoutSession
4653
* @SuppressWarnings(PHPMD.UnusedFormalParameter)
4754
*/
4855
public function __construct(
4956
Action\Context $context,
5057
OrderLoaderInterface $orderLoader,
5158
Registry $registry,
5259
ReorderHelper $reorderHelper = null,
53-
\Magento\Sales\Model\Reorder\Reorder $reorder = null
60+
\Magento\Sales\Model\Reorder\Reorder $reorder = null,
61+
CheckoutSession $checkoutSession = null
5462
) {
5563
$this->orderLoader = $orderLoader;
5664
$this->_coreRegistry = $registry;
5765
parent::__construct($context);
5866
$this->reorder = $reorder ?: ObjectManager::getInstance()->get(\Magento\Sales\Model\Reorder\Reorder::class);
67+
$this->checkoutSession = $checkoutSession ?: ObjectManager::getInstance()->get(CheckoutSession::class);
5968
}
6069

6170
/**
@@ -81,6 +90,10 @@ public function execute()
8190
return $resultRedirect->setPath('checkout/cart');
8291
}
8392

93+
// Set quote id for guest session: \Magento\Quote\Api\CartRepositoryInterface::save doesn't set quote id
94+
// to session for guest customer, as it does \Magento\Checkout\Model\Cart::save which is deprecated.
95+
$this->checkoutSession->setQuoteId($reorderOutput->getCart()->getId());
96+
8497
$errors = $reorderOutput->getErrors();
8598
if (!empty($errors)) {
8699
$useNotice = $this->_objectManager->get(\Magento\Checkout\Model\Session::class)->getUseNotice(true);

app/code/Magento/Sales/Model/Reorder/Reorder.php

Lines changed: 13 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,15 @@
77
namespace Magento\Sales\Model\Reorder;
88

99
use Magento\Catalog\Api\Data\ProductInterface;
10-
use Magento\Catalog\Api\ProductRepositoryInterface;
1110
use Magento\Catalog\Model\Product;
1211
use Magento\Catalog\Model\ResourceModel\Product\Collection;
1312
use Magento\Framework\Exception\InputException;
1413
use Magento\Framework\Exception\NoSuchEntityException;
1514
use Magento\Quote\Api\CartRepositoryInterface;
1615
use Magento\Quote\Api\Data\CartInterface;
1716
use Magento\Quote\Model\Cart\CustomerCartResolver;
18-
use Magento\Quote\Model\Quote as Quote;
17+
use Magento\Quote\Model\Quote;
18+
use Magento\Quote\Model\GuestCart\GuestCartResolver;
1919
use Magento\Sales\Api\Data\OrderItemInterface;
2020
use Magento\Sales\Helper\Reorder as ReorderHelper;
2121
use Magento\Sales\Model\Order\Item;
@@ -72,11 +72,6 @@ class Reorder
7272
*/
7373
private $cartRepository;
7474

75-
/**
76-
* @var ProductRepositoryInterface
77-
*/
78-
private $productRepository;
79-
8075
/**
8176
* @var Data\Error[]
8277
*/
@@ -92,30 +87,35 @@ class Reorder
9287
*/
9388
private $productCollectionFactory;
9489

90+
/**
91+
* @var GuestCartResolver
92+
*/
93+
private $guestCartResolver;
94+
9595
/**
9696
* @param OrderFactory $orderFactory
9797
* @param CustomerCartResolver $customerCartProvider
98+
* @param GuestCartResolver $guestCartResolver
9899
* @param CartRepositoryInterface $cartRepository
99-
* @param ProductRepositoryInterface $productRepository
100100
* @param ReorderHelper $reorderHelper
101101
* @param \Psr\Log\LoggerInterface $logger
102102
* @param ProductCollectionFactory $productCollectionFactory
103103
*/
104104
public function __construct(
105105
OrderFactory $orderFactory,
106106
CustomerCartResolver $customerCartProvider,
107+
GuestCartResolver $guestCartResolver,
107108
CartRepositoryInterface $cartRepository,
108-
ProductRepositoryInterface $productRepository,
109109
ReorderHelper $reorderHelper,
110110
\Psr\Log\LoggerInterface $logger,
111111
ProductCollectionFactory $productCollectionFactory
112112
) {
113113
$this->orderFactory = $orderFactory;
114114
$this->cartRepository = $cartRepository;
115-
$this->productRepository = $productRepository;
116115
$this->reorderHelper = $reorderHelper;
117116
$this->logger = $logger;
118117
$this->customerCartProvider = $customerCartProvider;
118+
$this->guestCartResolver = $guestCartResolver;
119119
$this->productCollectionFactory = $productCollectionFactory;
120120
}
121121

@@ -141,7 +141,9 @@ public function execute(string $orderNumber, string $storeId): Data\ReorderOutpu
141141
$customerId = (int)$order->getCustomerId();
142142
$this->errors = [];
143143

144-
$cart = $this->customerCartProvider->resolve($customerId);
144+
$cart = $customerId === 0
145+
? $this->guestCartResolver->resolve()
146+
: $this->customerCartProvider->resolve($customerId);
145147
if (!$this->reorderHelper->isAllowed($order->getStore())) {
146148
$this->addError((string)__('Reorders are not allowed.'), self::ERROR_REORDER_NOT_AVAILABLE);
147149
return $this->prepareOutput($cart);

app/code/Magento/Sales/Test/Mftf/Section/StorefrontGuestOrderViewSection.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,6 @@
1111
<section name="StorefrontGuestOrderViewSection">
1212
<element name="orderInformationTab" type="text" selector="//*[@class='nav item current']/strong[contains(text(), 'Order Information')]"/>
1313
<element name="printOrder" type="button" selector=".order-actions-toolbar .actions .print" timeout="30"/>
14+
<element name="reorder" type="button" selector=".order-actions-toolbar .actions .order" timeout="30"/>
1415
</section>
1516
</sections>
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
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="StorefrontReorderAsGuestTest">
11+
<annotations>
12+
<stories value="Reorder"/>
13+
<title value="Make reorder as guest on Frontend"/>
14+
<description value="Make reorder as guest on Frontend"/>
15+
<severity value="CRITICAL"/>
16+
<testCaseId value="MC-34465"/>
17+
<group value="sales"/>
18+
</annotations>
19+
<before>
20+
<!--Create simple product.-->
21+
<createData entity="SimpleSubCategory" stepKey="createCategory"/>
22+
<createData entity="SimpleProduct" stepKey="createSimpleProduct">
23+
<requiredEntity createDataKey="createCategory"/>
24+
</createData>
25+
<!-- Create Customer Account -->
26+
<createData entity="Simple_US_Customer" stepKey="createCustomer"/>
27+
<!-- Reindex and flush cache -->
28+
<magentoCLI command="indexer:reindex" stepKey="reindex"/>
29+
<magentoCLI command="cache:flush" stepKey="flushCache"/>
30+
</before>
31+
<after>
32+
<deleteData createDataKey="createCustomer" stepKey="deleteCreateCustomer"/>
33+
<deleteData createDataKey="createSimpleProduct" stepKey="deleteSimpleProduct"/>
34+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
35+
36+
<!-- Reindex invalidated indices after product attribute has been created/deleted -->
37+
<magentoCron groups="index" stepKey="reindexInvalidatedIndices"/>
38+
</after>
39+
40+
<!-- Order a product -->
41+
<amOnPage url="{{StorefrontProductPage.url($$createSimpleProduct.custom_attributes[url_key]$$)}}" stepKey="navigateToPDP"/>
42+
<actionGroup ref="StorefrontAddProductToCartActionGroup" stepKey="cartAddSimpleProductToCart">
43+
<argument name="product" value="$$createSimpleProduct$$"/>
44+
<argument name="productCount" value="1"/>
45+
</actionGroup>
46+
<actionGroup ref="GoToCheckoutFromMinicartActionGroup" stepKey="navigateToCheckout"/>
47+
<waitForPageLoad stepKey="waitFroPaymentSelectionPageLoad"/>
48+
<actionGroup ref="GuestCheckoutFillingShippingSectionActionGroup" stepKey="fillAddress">
49+
<argument name="customerVar" value="$$createCustomer$$"/>
50+
<argument name="customerAddressVar" value="US_Address_TX"/>
51+
</actionGroup>
52+
<waitForElement selector="{{CheckoutPaymentSection.placeOrder}}" time="30"
53+
stepKey="waitForPlaceOrderButtonVisible"/>
54+
<click selector="{{CheckoutPaymentSection.placeOrder}}" stepKey="placeOrder"/>
55+
<waitForPageLoad stepKey="waitUntilOrderPlaced"/>
56+
<grabTextFrom selector="{{CheckoutSuccessMainSection.orderNumber}}" stepKey="getOrderId"/>
57+
<assertNotEmpty stepKey="assertOrderIdIsNotEmpty" after="getOrderId">
58+
<actualResult type="const">$getOrderId</actualResult>
59+
</assertNotEmpty>
60+
61+
<!-- Find the Order on frontend > Navigate to: Orders and Returns -->
62+
<amOnPage url="{{StorefrontGuestOrderSearchPage.url}}" stepKey="amOnOrdersAndReturns"/>
63+
<waitForPageLoad stepKey="waiForStorefrontPage"/>
64+
65+
<!-- Fill the form with correspondent Order data -->
66+
<actionGroup ref="StorefrontFillOrdersAndReturnsFormActionGroup" stepKey="fillOrder">
67+
<argument name="orderNumber" value="{$getOrderId}"/>
68+
<argument name="customer" value="$$createCustomer$$"/>
69+
</actionGroup>
70+
71+
<!-- Click on the "Continue" button -->
72+
<click selector="{{StorefrontGuestOrderSearchSection.continue}}" stepKey="clickContinue"/>
73+
<waitForPageLoad stepKey="waitForPageLoad"/>
74+
75+
<!-- Click 'Reorder' link -->
76+
<click selector="{{StorefrontGuestOrderViewSection.reorder}}" stepKey="clickReturnLink"/>
77+
<waitForPageLoad stepKey="waitForPageLoad2"/>
78+
79+
<!--Check that product from order is visible in cart after reorder -->
80+
<seeElement selector="{{CheckoutCartProductSection.ProductLinkByName($$createSimpleProduct.name$$)}}" stepKey="seeProductInCart"/>
81+
</test>
82+
</tests>

0 commit comments

Comments
 (0)