Skip to content

Commit 4711dad

Browse files
MAGETWO-93286: [2.3] Gift Message lost at Checkout when logging in
1 parent d5ad9dd commit 4711dad

File tree

3 files changed

+133
-43
lines changed

3 files changed

+133
-43
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
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\GiftMessage\Observer;
9+
10+
use Magento\Framework\Event\ObserverInterface;
11+
use Magento\Quote\Model\Quote;
12+
13+
/**
14+
* Gift Message Observer Model
15+
*/
16+
class SalesEventQuoteMerge implements ObserverInterface
17+
{
18+
/**
19+
* Sets gift message to customer quote from guest quote.
20+
*
21+
* @param \Magento\Framework\Event\Observer $observer
22+
* @return $this
23+
*/
24+
public function execute(\Magento\Framework\Event\Observer $observer)
25+
{
26+
/** @var Quote $targetQuote */
27+
$targetQuote = $observer->getData('quote');
28+
/** @var Quote $sourceQuote */
29+
$sourceQuote = $observer->getData('source');
30+
31+
$targetQuote->setGiftMessageId($sourceQuote->getGiftMessageId());
32+
33+
return $this;
34+
}
35+
}

app/code/Magento/GiftMessage/etc/frontend/events.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
<event name="sales_convert_order_to_quote">
1313
<observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventOrderToQuoteObserver" shared="false" />
1414
</event>
15+
<event name="sales_quote_merge_after">
16+
<observer name="giftmessage" instance="Magento\GiftMessage\Observer\SalesEventQuoteMerge" shared="false" />
17+
</event>
1518
<event name="checkout_type_multishipping_create_orders_single">
1619
<observer name="giftmessage" instance="Magento\GiftMessage\Observer\MultishippingEventCreateOrdersObserver" shared="false" />
1720
</event>

dev/tests/integration/testsuite/Magento/Quote/Model/QuoteTest.php

Lines changed: 95 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,33 @@
88
use Magento\Catalog\Model\ProductRepository;
99
use Magento\Customer\Api\Data\CustomerInterfaceFactory;
1010
use Magento\Framework\Exception\LocalizedException;
11+
use Magento\Quote\Api\Data\CartInterface;
1112
use Magento\TestFramework\Helper\Bootstrap;
13+
use Magento\TestFramework\ObjectManager;
14+
use Magento\Framework\Api\SearchCriteriaBuilder;
15+
use Magento\Quote\Api\CartRepositoryInterface;
1216

1317
/**
1418
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1519
*/
1620
class QuoteTest extends \PHPUnit\Framework\TestCase
1721
{
22+
/**
23+
* @var ObjectManager
24+
*/
25+
private $objectManager;
26+
27+
/**
28+
* @inheritdoc
29+
*/
30+
protected function setUp()
31+
{
32+
$this->objectManager = Bootstrap::getObjectManager();
33+
}
34+
1835
private function convertToArray($entity)
1936
{
20-
return Bootstrap::getObjectManager()
37+
return $this->objectManager
2138
->create(\Magento\Framework\Api\ExtensibleDataObjectConverter::class)
2239
->toFlatArray($entity);
2340
}
@@ -28,10 +45,10 @@ private function convertToArray($entity)
2845
*/
2946
public function testCollectTotalsWithVirtual()
3047
{
31-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
48+
$quote = $this->objectManager->create(Quote::class);
3249
$quote->load('test01', 'reserved_order_id');
3350

34-
$productRepository = Bootstrap::getObjectManager()->create(
51+
$productRepository = $this->objectManager->create(
3552
\Magento\Catalog\Api\ProductRepositoryInterface::class
3653
);
3754
$product = $productRepository->get('virtual-product', false, null, true);
@@ -46,14 +63,14 @@ public function testCollectTotalsWithVirtual()
4663

4764
public function testSetCustomerData()
4865
{
49-
/** @var \Magento\Quote\Model\Quote $quote */
50-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
66+
/** @var Quote $quote */
67+
$quote = $this->objectManager->create(Quote::class);
5168
/** @var CustomerInterfaceFactory $customerFactory */
52-
$customerFactory = Bootstrap::getObjectManager()->create(
69+
$customerFactory = $this->objectManager->create(
5370
CustomerInterfaceFactory::class
5471
);
5572
/** @var \Magento\Framework\Api\DataObjectHelper $dataObjectHelper */
56-
$dataObjectHelper = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\DataObjectHelper::class);
73+
$dataObjectHelper = $this->objectManager->create(\Magento\Framework\Api\DataObjectHelper::class);
5774
$expected = $this->_getCustomerDataArray();
5875
$customer = $customerFactory->create();
5976
$dataObjectHelper->populateWithArray(
@@ -72,13 +89,13 @@ public function testSetCustomerData()
7289

7390
public function testUpdateCustomerData()
7491
{
75-
/** @var \Magento\Quote\Model\Quote $quote */
76-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
77-
$customerFactory = Bootstrap::getObjectManager()->create(
92+
/** @var Quote $quote */
93+
$quote = $this->objectManager->create(Quote::class);
94+
$customerFactory = $this->objectManager->create(
7895
CustomerInterfaceFactory::class
7996
);
8097
/** @var \Magento\Framework\Api\DataObjectHelper $dataObjectHelper */
81-
$dataObjectHelper = Bootstrap::getObjectManager()->create(\Magento\Framework\Api\DataObjectHelper::class);
98+
$dataObjectHelper = $this->objectManager->create(\Magento\Framework\Api\DataObjectHelper::class);
8299
$expected = $this->_getCustomerDataArray();
83100
//For save in repository
84101
$expected = $this->removeIdFromCustomerData($expected);
@@ -92,7 +109,7 @@ public function testUpdateCustomerData()
92109
/**
93110
* @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository
94111
*/
95-
$customerRepository = Bootstrap::getObjectManager()
112+
$customerRepository = $this->objectManager
96113
->create(\Magento\Customer\Api\CustomerRepositoryInterface::class);
97114
$customerRepository->save($customerDataSet);
98115
$quote->setCustomer($customerDataSet);
@@ -121,13 +138,13 @@ public function testGetCustomerGroupFromCustomer()
121138
{
122139
/** Preconditions */
123140
/** @var CustomerInterfaceFactory $customerFactory */
124-
$customerFactory = Bootstrap::getObjectManager()->create(
141+
$customerFactory = $this->objectManager->create(
125142
CustomerInterfaceFactory::class
126143
);
127144
$customerGroupId = 3;
128145
$customerData = $customerFactory->create()->setId(1)->setGroupId($customerGroupId);
129-
/** @var \Magento\Quote\Model\Quote $quote */
130-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
146+
/** @var Quote $quote */
147+
$quote = $this->objectManager->create(Quote::class);
131148
$quote->setCustomer($customerData);
132149
$quote->unsetData('customer_group_id');
133150

@@ -146,10 +163,10 @@ public function testGetCustomerTaxClassId()
146163
$fixtureGroupCode = 'custom_group';
147164
$fixtureTaxClassId = 3;
148165
/** @var \Magento\Customer\Model\Group $group */
149-
$group = Bootstrap::getObjectManager()->create(\Magento\Customer\Model\Group::class);
166+
$group = $this->objectManager->create(\Magento\Customer\Model\Group::class);
150167
$fixtureGroupId = $group->load($fixtureGroupCode, 'customer_group_code')->getId();
151-
/** @var \Magento\Quote\Model\Quote $quote */
152-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
168+
/** @var Quote $quote */
169+
$quote = $this->objectManager->create(Quote::class);
153170
$quote->setCustomerGroupId($fixtureGroupId);
154171

155172
/** Execute SUT */
@@ -169,8 +186,8 @@ public function testAssignCustomerWithAddressChangeAddressesNotSpecified()
169186
* Customer with two addresses created
170187
* First address is default billing, second is default shipping.
171188
*/
172-
/** @var \Magento\Quote\Model\Quote $quote */
173-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
189+
/** @var Quote $quote */
190+
$quote = $this->objectManager->create(Quote::class);
174191
$customerData = $this->_prepareQuoteForTestAssignCustomerWithAddressChange($quote);
175192

176193
/** Execute SUT */
@@ -234,9 +251,8 @@ public function testAssignCustomerWithAddressChange()
234251
* Customer with two addresses created
235252
* First address is default billing, second is default shipping.
236253
*/
237-
/** @var \Magento\Quote\Model\Quote $quote */
238-
$objectManager = Bootstrap::getObjectManager();
239-
$quote = $objectManager->create(\Magento\Quote\Model\Quote::class);
254+
/** @var Quote $quote */
255+
$quote = $this->objectManager->create(Quote::class);
240256
$customerData = $this->_prepareQuoteForTestAssignCustomerWithAddressChange($quote);
241257
/** @var \Magento\Quote\Model\Quote\Address $quoteBillingAddress */
242258
$expectedBillingAddressData = [
@@ -249,7 +265,7 @@ public function testAssignCustomerWithAddressChange()
249265
'firstname' => 'FirstBilling',
250266
'region_id' => 1
251267
];
252-
$quoteBillingAddress = $objectManager->create(\Magento\Quote\Model\Quote\Address::class);
268+
$quoteBillingAddress = $this->objectManager->create(\Magento\Quote\Model\Quote\Address::class);
253269
$quoteBillingAddress->setData($expectedBillingAddressData);
254270

255271
$expectedShippingAddressData = [
@@ -262,7 +278,7 @@ public function testAssignCustomerWithAddressChange()
262278
'firstname' => 'FirstShipping',
263279
'region_id' => 1
264280
];
265-
$quoteShippingAddress = $objectManager->create(\Magento\Quote\Model\Quote\Address::class);
281+
$quoteShippingAddress = $this->objectManager->create(\Magento\Quote\Model\Quote\Address::class);
266282
$quoteShippingAddress->setData($expectedShippingAddressData);
267283

268284
/** Execute SUT */
@@ -295,13 +311,13 @@ public function testAssignCustomerWithAddressChange()
295311
*/
296312
public function testAddProductUpdateItem()
297313
{
298-
/** @var \Magento\Quote\Model\Quote $quote */
299-
$quote = Bootstrap::getObjectManager()->create(\Magento\Quote\Model\Quote::class);
314+
/** @var Quote $quote */
315+
$quote = $this->objectManager->create(Quote::class);
300316
$quote->load('test01', 'reserved_order_id');
301317

302318
$productStockQty = 100;
303319

304-
$productRepository = Bootstrap::getObjectManager()->create(
320+
$productRepository = $this->objectManager->create(
305321
\Magento\Catalog\Api\ProductRepositoryInterface::class
306322
);
307323
$product = $productRepository->get('simple-1', false, null, true);
@@ -334,17 +350,16 @@ public function testAddProductUpdateItem()
334350
*
335351
* Customer with two addresses created. First address is default billing, second is default shipping.
336352
*
337-
* @param \Magento\Quote\Model\Quote $quote
353+
* @param Quote $quote
338354
* @return \Magento\Customer\Api\Data\CustomerInterface
339355
*/
340356
protected function _prepareQuoteForTestAssignCustomerWithAddressChange($quote)
341357
{
342-
$objectManager = Bootstrap::getObjectManager();
343358
/** @var \Magento\Customer\Api\CustomerRepositoryInterface $customerRepository */
344-
$customerRepository = $objectManager->create(\Magento\Customer\Api\CustomerRepositoryInterface::class);
359+
$customerRepository = $this->objectManager->create(\Magento\Customer\Api\CustomerRepositoryInterface::class);
345360
$fixtureCustomerId = 1;
346361
/** @var \Magento\Customer\Model\Customer $customer */
347-
$customer = $objectManager->create(\Magento\Customer\Model\Customer::class);
362+
$customer = $this->objectManager->create(\Magento\Customer\Model\Customer::class);
348363
$fixtureSecondAddressId = 2;
349364
$customer->load($fixtureCustomerId)->setDefaultShipping($fixtureSecondAddressId)->save();
350365
$customerData = $customerRepository->getById($fixtureCustomerId);
@@ -413,9 +428,8 @@ protected function _getCustomerDataArray()
413428
*/
414429
public function testReserveOrderId()
415430
{
416-
$objectManager = Bootstrap::getObjectManager();
417-
/** @var \Magento\Quote\Model\Quote $quote */
418-
$quote = $objectManager->create(\Magento\Quote\Model\Quote::class);
431+
/** @var Quote $quote */
432+
$quote = $this->objectManager->create(Quote::class);
419433
$quote->load('reserved_order_id', 'reserved_order_id');
420434
$quote->reserveOrderId();
421435
$this->assertEquals('reserved_order_id', $quote->getReservedOrderId());
@@ -431,18 +445,17 @@ public function testReserveOrderId()
431445
public function testAddedProductToQuoteIsSalable()
432446
{
433447
$productId = 99;
434-
$objectManager = Bootstrap::getObjectManager();
435448

436449
/** @var ProductRepository $productRepository */
437-
$productRepository = $objectManager->get(ProductRepository::class);
450+
$productRepository = $this->objectManager->get(ProductRepository::class);
438451

439-
/** @var \Magento\Quote\Model\Quote $quote */
452+
/** @var Quote $quote */
440453
$product = $productRepository->getById($productId, false, null, true);
441454

442455
$this->expectException(LocalizedException::class);
443456
$this->expectExceptionMessage('Product that you are trying to add is not available.');
444457

445-
$quote = $objectManager->create(\Magento\Quote\Model\Quote::class);
458+
$quote = $this->objectManager->create(Quote::class);
446459
$quote->addProduct($product);
447460
}
448461

@@ -452,13 +465,12 @@ public function testAddedProductToQuoteIsSalable()
452465
*/
453466
public function testGetItemById()
454467
{
455-
$objectManager = Bootstrap::getObjectManager();
456-
$quote = $objectManager->create(\Magento\Quote\Model\Quote::class);
468+
$quote = $this->objectManager->create(Quote::class);
457469
$quote->load('test01', 'reserved_order_id');
458470

459-
$quoteItem = $objectManager->create(\Magento\Quote\Model\Quote\Item::class);
471+
$quoteItem = $this->objectManager->create(\Magento\Quote\Model\Quote\Item::class);
460472

461-
$productRepository = $objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
473+
$productRepository = $this->objectManager->create(\Magento\Catalog\Api\ProductRepositoryInterface::class);
462474
$product = $productRepository->get('simple');
463475

464476
$quoteItem->setProduct($product);
@@ -468,4 +480,44 @@ public function testGetItemById()
468480
$this->assertInstanceOf(\Magento\Quote\Model\Quote\Item::class, $quote->getItemById($quoteItem->getId()));
469481
$this->assertEquals($quoteItem->getId(), $quote->getItemById($quoteItem->getId())->getId());
470482
}
483+
484+
/**
485+
* Tests of quotes merging.
486+
*
487+
* @magentoDataFixture Magento/Sales/_files/quote.php
488+
*/
489+
public function testMerge()
490+
{
491+
$giftMessageId = 1;
492+
493+
/** @var Quote $quote */
494+
$guestQuote = $this->getQuote('test01');
495+
$guestQuote->setGiftMessageId($giftMessageId);
496+
497+
/** @var Quote $customerQuote */
498+
$customerQuote = $this->objectManager->create(Quote::class);
499+
$customerQuote->merge($guestQuote);
500+
501+
self::assertEquals($giftMessageId, $customerQuote->getGiftMessageId());
502+
}
503+
504+
/**
505+
* Gets quote by reserved order id.
506+
*
507+
* @param string $reservedOrderId
508+
* @return Quote
509+
*/
510+
private function getQuote($reservedOrderId)
511+
{
512+
/** @var SearchCriteriaBuilder $searchCriteriaBuilder */
513+
$searchCriteriaBuilder = $this->objectManager->get(SearchCriteriaBuilder::class);
514+
$searchCriteria = $searchCriteriaBuilder->addFilter('reserved_order_id', $reservedOrderId)
515+
->create();
516+
517+
/** @var CartRepositoryInterface $quoteRepository */
518+
$quoteRepository = $this->objectManager->get(CartRepositoryInterface::class);
519+
$items = $quoteRepository->getList($searchCriteria)->getItems();
520+
521+
return array_pop($items);
522+
}
471523
}

0 commit comments

Comments
 (0)