Skip to content

Commit 481238d

Browse files
committed
Merge remote-tracking branch 'magento-l3/ACP2E-23' into L3_PR_21-12-13
2 parents 01680af + 2e87843 commit 481238d

File tree

10 files changed

+238
-16
lines changed

10 files changed

+238
-16
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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\Catalog\Model\Theme\CustomerData;
9+
10+
use Magento\Catalog\Model\Product\ProductFrontendAction\Synchronizer;
11+
use Magento\Framework\App\Config;
12+
use Magento\Framework\App\RequestInterface;
13+
use Magento\Framework\Message\Collection;
14+
use Magento\Framework\Message\ManagerInterface as MessageManager;
15+
use Magento\Theme\CustomerData\MessagesProviderInterface;
16+
17+
class MessagesProvider implements MessagesProviderInterface
18+
{
19+
/**
20+
*
21+
* @var Config
22+
*/
23+
private $appConfig;
24+
25+
/**
26+
* @var RequestInterface
27+
*/
28+
private $request;
29+
30+
/**
31+
* Manager messages
32+
*
33+
* @var MessageManager
34+
*/
35+
private $messageManager;
36+
37+
/**
38+
* Constructor
39+
*
40+
* @param Config $appConfig
41+
* @param RequestInterface $request
42+
* @param MessageManager $messageManager
43+
*/
44+
public function __construct(
45+
Config $appConfig,
46+
RequestInterface $request,
47+
MessageManager $messageManager
48+
) {
49+
$this->appConfig = $appConfig;
50+
$this->request = $request;
51+
$this->messageManager = $messageManager;
52+
}
53+
54+
/**
55+
* Verify flag value for synchronize product actions with backend or not
56+
*
57+
* @return Collection
58+
*/
59+
public function getMessages(): Collection
60+
{
61+
$clearSessionMessages = true;
62+
63+
if ((bool) $this->appConfig->getValue(Synchronizer::ALLOW_SYNC_WITH_BACKEND_PATH)) {
64+
$clearSessionMessages = $this->request->getParam('force_new_section_timestamp') === 'true';
65+
}
66+
67+
return $this->messageManager->getMessages($clearSessionMessages);
68+
}
69+
}

app/code/Magento/Catalog/Test/Mftf/Data/CatalogConfigurationData.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,18 @@
2222
<data key="label">Website</data>
2323
<data key="value">1</data>
2424
</entity>
25+
<!-- Catalog > Recently Viewed/Compared Products > Synchronize Widget Products With Backend Storage -->
26+
<entity name="DisableSynchronizeWidgetProductsWithBackendStorage">
27+
<!-- Default configuration -->
28+
<data key="path">catalog/recently_products/synchronize_with_backend</data>
29+
<data key="scope_id">0</data>
30+
<data key="label">No</data>
31+
<data key="value">0</data>
32+
</entity>
33+
<entity name="EnableSynchronizeWidgetProductsWithBackendStorage">
34+
<data key="path">catalog/recently_products/synchronize_with_backend</data>
35+
<data key="scope_id">0</data>
36+
<data key="label">Yes</data>
37+
<data key="value">1</data>
38+
</entity>
2539
</entities>

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@
7676
<preference for="Magento\Catalog\Api\Data\MassActionInterface" type="Magento\Catalog\Model\MassAction" />
7777
<preference for="Magento\Catalog\Model\ProductLink\Data\ListCriteriaInterface" type="Magento\Catalog\Model\ProductLink\Data\ListCriteria" />
7878
<preference for="Magento\Catalog\Api\CategoryListDeleteBySkuInterface" type="Magento\Catalog\Model\CategoryLinkRepository"/>
79+
<preference for="Magento\Theme\CustomerData\MessagesProviderInterface" type="Magento\Catalog\Model\Theme\CustomerData\MessagesProvider"/>
7980
<type name="Magento\Customer\Model\ResourceModel\Visitor">
8081
<plugin name="catalogLog" type="Magento\Catalog\Model\Plugin\Log" />
8182
</type>

app/code/Magento/Catalog/view/frontend/web/js/storage-manager.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -233,6 +233,7 @@ define([
233233

234234
delete params.typeId;
235235
delete params.url;
236+
this.requestSent = 1;
236237

237238
return utils.ajaxSubmit({
238239
url: url,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
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" xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/testSchema.xsd">
9+
<test name="StorefrontAddProductToCartVerifyThatErrorMessageShouldNotDisappearTest">
10+
<annotations>
11+
<title value="Adding a product to cart from product detail page with higher quantity then available when synchronize widget products with backend storage enabled"/>
12+
<description value="Adding a product to cart from product detail page with higher quantity then available when synchronize widget products with backend storage enabled"/>
13+
<features value="Module/ Catalog"/>
14+
<severity value="AVERAGE"/>
15+
<testCaseId value="AC-1571"/>
16+
<useCaseId value="ACP2E-23"/>
17+
<stories value="[Magento Cloud] Error message in PDP disappearing quickly"/>
18+
<group value="customer"/>
19+
</annotations>
20+
21+
<before>
22+
<!-- Set in Stores > Configuration > Catalog > Catalog > Recently Viewed/Compared Products > Synchronize Widget Products With Backend Storage = "Yes" -->
23+
<magentoCLI command="config:set {{EnableSynchronizeWidgetProductsWithBackendStorage.path}} {{EnableSynchronizeWidgetProductsWithBackendStorage.value}}" stepKey="setEnableSynchronizeWidgetProductsWithBackendStorage"/>
24+
<createData entity="_defaultCategory" stepKey="createCategory"/>
25+
<createData entity="_defaultProduct" stepKey="createSimpleProduct">
26+
<requiredEntity createDataKey="createCategory"/>
27+
</createData>
28+
<!--Reindex and flush cache-->
29+
<magentoCLI command="cron:run --group=index" stepKey="runCronReindex"/>
30+
</before>
31+
<after>
32+
<deleteData createDataKey="createSimpleProduct" stepKey="deleteProduct"/>
33+
<deleteData createDataKey="createCategory" stepKey="deleteCategory"/>
34+
<magentoCLI command="config:set {{DisableSynchronizeWidgetProductsWithBackendStorage.path}} {{DisableSynchronizeWidgetProductsWithBackendStorage.value}}" stepKey="setDisableSynchronizeWidgetProductsWithBackendStorage"/>
35+
<!--Reindex and flush cache-->
36+
<magentoCLI command="cron:run --group=index" stepKey="runCronReindex"/>
37+
</after>
38+
39+
<waitForPageLoad time="60" stepKey="waitForPageLoad"/>
40+
<actionGroup ref="StorefrontOpenProductEntityPageActionGroup" stepKey="openProductPage">
41+
<argument name="product" value="$$createSimpleProduct$$"/>
42+
</actionGroup>
43+
44+
<fillField selector="{{StorefrontProductInfoMainSection.qty}}" userInput="1001" stepKey="fillQuantity"/>
45+
46+
<actionGroup ref="StorefrontProductPageAddSimpleProductToCartActionGroup" stepKey="addProductToCart"/>
47+
<!-- Check that error remains -->
48+
<actionGroup ref="StorefrontAssertProductAddToCartErrorMessageActionGroup" stepKey="assertFailure">
49+
<argument name="message" value="The requested qty is not available"/>
50+
</actionGroup>
51+
</test>
52+
</tests>

app/code/Magento/Theme/CustomerData/Messages.php

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
namespace Magento\Theme\CustomerData;
88

99
use Magento\Customer\CustomerData\SectionSourceInterface;
10+
use Magento\Framework\App\ObjectManager;
1011
use Magento\Framework\Message\ManagerInterface as MessageManager;
1112
use Magento\Framework\Message\MessageInterface;
1213
use Magento\Framework\View\Element\Message\InterpretationStrategyInterface;
@@ -28,38 +29,48 @@ class Messages implements SectionSourceInterface
2829
*/
2930
private $interpretationStrategy;
3031

32+
/**
33+
* @var MessagesProviderInterface
34+
*/
35+
private $messageProvider;
36+
3137
/**
3238
* Constructor
3339
*
3440
* @param MessageManager $messageManager
3541
* @param InterpretationStrategyInterface $interpretationStrategy
42+
* @param MessagesProviderInterface|null $messageProvider
3643
*/
3744
public function __construct(
3845
MessageManager $messageManager,
39-
InterpretationStrategyInterface $interpretationStrategy
46+
InterpretationStrategyInterface $interpretationStrategy,
47+
?MessagesProviderInterface $messageProvider = null
4048
) {
4149
$this->messageManager = $messageManager;
4250
$this->interpretationStrategy = $interpretationStrategy;
51+
$this->messageProvider = $messageProvider
52+
?? ObjectManager::getInstance()->get(MessagesProviderInterface::class);
4353
}
4454

4555
/**
4656
* @inheritdoc
4757
*/
4858
public function getSectionData()
4959
{
50-
$messages = $this->messageManager->getMessages(true);
60+
$messages = $this->messageProvider->getMessages();
61+
$messageResponse = array_reduce(
62+
$messages->getItems(),
63+
function (array $result, MessageInterface $message) {
64+
$result[] = [
65+
'type' => $message->getType(),
66+
'text' => $this->interpretationStrategy->interpret($message)
67+
];
68+
return $result;
69+
},
70+
[]
71+
);
5172
return [
52-
'messages' => array_reduce(
53-
$messages->getItems(),
54-
function (array $result, MessageInterface $message) {
55-
$result[] = [
56-
'type' => $message->getType(),
57-
'text' => $this->interpretationStrategy->interpret($message)
58-
];
59-
return $result;
60-
},
61-
[]
62-
),
73+
'messages' => $messageResponse
6374
];
6475
}
6576
}
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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\Theme\CustomerData;
9+
10+
use Magento\Framework\Message\Collection;
11+
use Magento\Framework\Message\ManagerInterface as MessageManager;
12+
13+
class MessagesProvider implements MessagesProviderInterface
14+
{
15+
/**
16+
* Manager messages
17+
*
18+
* @var MessageManager
19+
*/
20+
private $messageManager;
21+
22+
/**
23+
* Constructor
24+
*
25+
* @param MessageManager $messageManager
26+
*/
27+
public function __construct(
28+
MessageManager $messageManager
29+
) {
30+
$this->messageManager = $messageManager;
31+
}
32+
33+
/**
34+
* Return collection object of messages from session
35+
*
36+
* @return Collection
37+
*/
38+
public function getMessages() : Collection
39+
{
40+
return $this->messageManager->getMessages(true);
41+
}
42+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
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\Theme\CustomerData;
9+
10+
use Magento\Framework\Message\Collection;
11+
12+
interface MessagesProviderInterface
13+
{
14+
/**
15+
* Get the messages stored in session before session clear
16+
*
17+
* @return Collection
18+
*/
19+
public function getMessages(): Collection;
20+
}

app/code/Magento/Theme/Test/Unit/CustomerData/MessagesTest.php

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
use Magento\Framework\Message\MessageInterface;
1313
use Magento\Framework\View\Element\Message\InterpretationStrategyInterface;
1414
use Magento\Theme\CustomerData\Messages;
15+
use Magento\Theme\CustomerData\MessagesProviderInterface;
1516
use PHPUnit\Framework\MockObject\MockObject;
1617
use PHPUnit\Framework\TestCase;
1718

@@ -22,6 +23,11 @@ class MessagesTest extends TestCase
2223
*/
2324
protected $messageManager;
2425

26+
/**
27+
* @var MessagesProviderInterface|MockObject
28+
*/
29+
private $messageProvider;
30+
2531
/**
2632
* @var InterpretationStrategyInterface|MockObject
2733
*/
@@ -36,10 +42,16 @@ protected function setUp(): void
3642
{
3743
$this->messageManager = $this->getMockBuilder(ManagerInterface::class)
3844
->getMock();
45+
$this->messageProvider = $this->getMockBuilder(MessagesProviderInterface::class)
46+
->getMock();
3947
$this->messageInterpretationStrategy = $this->createMock(
4048
InterpretationStrategyInterface::class
4149
);
42-
$this->object = new Messages($this->messageManager, $this->messageInterpretationStrategy);
50+
$this->object = new Messages(
51+
$this->messageManager,
52+
$this->messageInterpretationStrategy,
53+
$this->messageProvider
54+
);
4355
}
4456

4557
public function testGetSectionData()
@@ -59,9 +71,8 @@ public function testGetSectionData()
5971
->method('interpret')
6072
->with($msg)
6173
->willReturn($msgText);
62-
$this->messageManager->expects($this->once())
74+
$this->messageProvider->expects($this->once())
6375
->method('getMessages')
64-
->with(true, null)
6576
->willReturn($msgCollection);
6677
$msgCollection->expects($this->once())
6778
->method('getItems')

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
<preference for="Magento\Framework\View\Model\PageLayout\Config\BuilderInterface" type="Magento\Theme\Model\PageLayout\Config\Builder"/>
2020
<preference for="Magento\Theme\Model\Design\Config\MetadataProviderInterface" type="Magento\Theme\Model\Design\Config\MetadataProvider"/>
2121
<preference for="Magento\Theme\Model\Theme\StoreThemesResolverInterface" type="Magento\Theme\Model\Theme\StoreThemesResolver"/>
22+
<preference for="Magento\Theme\CustomerData\MessagesProviderInterface" type="Magento\Theme\CustomerData\MessagesProvider"/>
2223
<type name="Magento\Theme\Model\Config">
2324
<arguments>
2425
<argument name="configCache" xsi:type="object">Magento\Framework\App\Cache\Type\Config</argument>

0 commit comments

Comments
 (0)