Skip to content

Commit 92fdebb

Browse files
committed
Merge remote-tracking branch 'origin/2.3.4-develop' into 2.3.4-develop-pr83
2 parents 0702ac0 + 18f12ee commit 92fdebb

File tree

437 files changed

+9297
-1421
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

437 files changed

+9297
-1421
lines changed
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
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+
9+
<actionGroups xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
10+
xsi:noNamespaceSchemaLocation="urn:magento:mftf:Test/etc/actionGroupSchema.xsd">
11+
<actionGroup name="AdminSystemMessagesWarningActionGroup">
12+
<annotations>
13+
<description>Check warning system message exists.</description>
14+
</annotations>
15+
<arguments>
16+
<argument name="message" type="string"/>
17+
</arguments>
18+
19+
<waitForElementVisible selector="{{AdminSystemMessagesSection.systemMessagesDropdown}}" stepKey="waitMessagesDropdownAppears"/>
20+
<conditionalClick selector="{{AdminSystemMessagesSection.systemMessagesDropdown}}" dependentSelector="{{AdminSystemMessagesSection.messagesBlock}}" visible="false" stepKey="openMessagesBlockIfCollapsed"/>
21+
<see userInput="{{message}}" selector="{{AdminSystemMessagesSection.warning}}" stepKey="seeWarningMessage"/>
22+
</actionGroup>
23+
</actionGroups>

app/code/Magento/AdminNotification/Test/Mftf/Section/AdminSystemMessagesSection.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,9 @@
1111
<section name="AdminSystemMessagesSection">
1212
<element name="systemMessagesDropdown" type="button" selector="#system_messages .message-system-action-dropdown"/>
1313
<element name="actionMessageLog" type="button" selector="//*[contains(@class, 'message-system-summary')]/a[contains(text(), '{{textMessage}}')]" parameterized="true"/>
14+
<element name="messagesBlock" type="block" selector="#system_messages div.message-system-collapsible"/>
15+
<element name="success" type="text" selector="#system_messages div.message-success"/>
16+
<element name="warning" type="text" selector="#system_messages div.message-warning"/>
17+
<element name="notice" type="text" selector="#system_messages div.message-notice"/>
1418
</section>
1519
</sections>

app/code/Magento/AdminNotification/view/adminhtml/templates/system/messages.phtml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,20 +26,20 @@
2626

2727
<?php if ($block->getCriticalCount()) : ?>
2828
<div class="message message-warning error">
29-
<a class="message-link" href="#" title="<?= $block->escapeHtml(__('Critical System Messages')) ?>">
29+
<a class="message-link" href="#" title="<?= $block->escapeHtmlAttr(__('Critical System Messages')) ?>">
3030
<?= (int) $block->getCriticalCount() ?>
3131
</a>
3232
</div>
3333
<?php endif; ?>
3434

3535
<?php if ($block->getMajorCount()) : ?>
3636
<div class="message message-warning warning">
37-
<a class="message-link" href="#" title="<?= $block->escapeHtml(__('Major System Messages')) ?>">
37+
<a class="message-link" href="#" title="<?= $block->escapeHtmlAttr(__('Major System Messages')) ?>">
3838
<?= (int) $block->getMajorCount() ?>
3939
</a>
4040
</div>
4141
<?php endif; ?>
4242
</div>
43-
<div id="message-system-all" title="<?= $block->escapeHtml(__('System messages')) ?>" data-mage-init='<?= $block->escapeHtml($block->getSystemMessageDialogJson()) ?>'></div>
43+
<div id="message-system-all" title="<?= $block->escapeHtmlAttr(__('System messages')) ?>" data-mage-init='<?= $block->escapeHtmlAttr($block->getSystemMessageDialogJson()) ?>'></div>
4444
</div>
4545
</div>
Lines changed: 189 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,189 @@
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\AdvancedSearch\Test\Unit\Model\Recommendations;
9+
10+
use Magento\AdvancedSearch\Model\Recommendations\DataProvider;
11+
use Magento\Framework\App\Config\ScopeConfigInterface;
12+
use Magento\Framework\TestFramework\Unit\Helper\ObjectManager as ObjectManagerHelper;
13+
use Magento\Catalog\Model\Layer\Resolver;
14+
use Magento\AdvancedSearch\Model\ResourceModel\Recommendations;
15+
use Magento\AdvancedSearch\Model\ResourceModel\RecommendationsFactory;
16+
use Magento\Search\Model\QueryResult;
17+
use Magento\Search\Model\QueryResultFactory;
18+
use Magento\Catalog\Model\ResourceModel\Product\Collection as ProductCollection;
19+
use Magento\Catalog\Model\Layer as SearchLayer;
20+
use Magento\Store\Model\ScopeInterface;
21+
use Magento\Search\Model\QueryInterface;
22+
23+
/**
24+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
25+
*
26+
* Class \Magento\AdvancedSearch\Test\Unit\Model\Recommendations\DataProviderTest
27+
*/
28+
class DataProviderTest extends \PHPUnit\Framework\TestCase
29+
{
30+
/**
31+
* @var DataProvider;
32+
*/
33+
private $model;
34+
35+
/**
36+
* @var ObjectManagerHelper
37+
*/
38+
private $objectManagerHelper;
39+
40+
/**
41+
* @var \PHPUnit_Framework_MockObject_MockObject|ScopeConfigInterface
42+
*/
43+
private $scopeConfigMock;
44+
45+
/**
46+
* @var \PHPUnit_Framework_MockObject_MockObject|Resolver
47+
*/
48+
private $layerResolverMock;
49+
50+
/**
51+
* @var \PHPUnit_Framework_MockObject_MockObject|SearchLayer
52+
*/
53+
private $searchLayerMock;
54+
55+
/**
56+
* @var \PHPUnit_Framework_MockObject_MockObject|RecommendationsFactory
57+
*/
58+
private $recommendationsFactoryMock;
59+
60+
/**
61+
* @var \PHPUnit_Framework_MockObject_MockObject|Recommendations
62+
*/
63+
private $recommendationsMock;
64+
65+
/**
66+
* @var \PHPUnit_Framework_MockObject_MockObject|Resolver
67+
*/
68+
private $queryResultFactory;
69+
70+
/**
71+
* Set up test environment.
72+
*
73+
* @return void
74+
*/
75+
protected function setUp()
76+
{
77+
$this->scopeConfigMock = $this->createMock(ScopeConfigInterface::class);
78+
$this->layerResolverMock = $this->getMockBuilder(Resolver::class)
79+
->disableOriginalConstructor()
80+
->setMethods(['get'])
81+
->getMock();
82+
83+
$this->searchLayerMock = $this->createMock(SearchLayer::class);
84+
85+
$this->layerResolverMock->expects($this->any())
86+
->method('get')
87+
->will($this->returnValue($this->searchLayerMock));
88+
89+
$this->recommendationsFactoryMock = $this->getMockBuilder(RecommendationsFactory::class)
90+
->disableOriginalConstructor()
91+
->setMethods(['create'])
92+
->getMock();
93+
94+
$this->recommendationsMock = $this->createMock(Recommendations::class);
95+
96+
$this->queryResultFactory = $this->getMockBuilder(QueryResultFactory::class)
97+
->disableOriginalConstructor()
98+
->setMethods(['create'])
99+
->getMock();
100+
101+
$this->objectManagerHelper = new ObjectManagerHelper($this);
102+
$this->model = $this->objectManagerHelper->getObject(
103+
DataProvider::class,
104+
[
105+
'scopeConfig' => $this->scopeConfigMock,
106+
'layerResolver' => $this->layerResolverMock,
107+
'recommendationsFactory' => $this->recommendationsFactoryMock,
108+
'queryResultFactory' => $this->queryResultFactory
109+
]
110+
);
111+
}
112+
113+
/**
114+
* Test testGetItems() when Search Recommendations disabled.
115+
*
116+
* @return void
117+
*/
118+
public function testGetItemsWhenDisabledSearchRecommendations()
119+
{
120+
$isEnabledSearchRecommendations = false;
121+
122+
/** @var $queryInterfaceMock QueryInterface */
123+
$queryInterfaceMock = $this->createMock(QueryInterface::class);
124+
125+
$this->scopeConfigMock->expects($this->any())
126+
->method('isSetFlag')
127+
->with('catalog/search/search_recommendations_enabled', ScopeInterface::SCOPE_STORE)
128+
->willReturn($isEnabledSearchRecommendations);
129+
130+
$result = $this->model->getItems($queryInterfaceMock);
131+
$this->assertEquals([], $result);
132+
}
133+
134+
/**
135+
* Test testGetItems() when Search Recommendations enabled.
136+
*
137+
* @return void
138+
*/
139+
public function testGetItemsWhenEnabledSearchRecommendations()
140+
{
141+
$storeId = 1;
142+
$searchRecommendationsCountConfig = 2;
143+
$isEnabledSearchRecommendations = true;
144+
$queryText = 'test';
145+
146+
/** @var $queryInterfaceMock QueryInterface */
147+
$queryInterfaceMock = $this->createMock(QueryInterface::class);
148+
$queryInterfaceMock->expects($this->any())->method('getQueryText')->willReturn($queryText);
149+
150+
$this->scopeConfigMock->expects($this->any())
151+
->method('isSetFlag')
152+
->with('catalog/search/search_recommendations_enabled', ScopeInterface::SCOPE_STORE)
153+
->willReturn($isEnabledSearchRecommendations);
154+
155+
$this->scopeConfigMock->expects($this->any())
156+
->method('getValue')
157+
->with('catalog/search/search_recommendations_count', ScopeInterface::SCOPE_STORE)
158+
->willReturn($searchRecommendationsCountConfig);
159+
160+
$productCollectionMock = $this->createMock(ProductCollection::class);
161+
$productCollectionMock->expects($this->any())->method('getStoreId')->willReturn($storeId);
162+
163+
$this->searchLayerMock->expects($this->any())->method('getProductCollection')
164+
->willReturn($productCollectionMock);
165+
166+
$this->recommendationsFactoryMock->expects($this->any())->method('create')
167+
->willReturn($this->recommendationsMock);
168+
169+
$this->recommendationsMock->expects($this->any())->method('getRecommendationsByQuery')
170+
->with($queryText, ['store_id' => $storeId], $searchRecommendationsCountConfig)
171+
->willReturn(
172+
[
173+
[
174+
'query_text' => 'a',
175+
'num_results' => 3
176+
],
177+
[
178+
'query_text' => 'b',
179+
'num_results' => 2
180+
]
181+
]
182+
);
183+
$queryResultMock = $this->createMock(QueryResult::class);
184+
$this->queryResultFactory->expects($this->any())->method('create')->willReturn($queryResultMock);
185+
186+
$result = $this->model->getItems($queryInterfaceMock);
187+
$this->assertEquals(2, count($result));
188+
}
189+
}

app/code/Magento/AdvancedSearch/view/adminhtml/templates/system/config/testconnection.phtml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
* See COPYING.txt for license details.
55
*/
66
?>
7-
<button class="scalable" type="button" id="<?= $block->getHtmlId() ?>" data-mage-init='{"testConnection":{
7+
<button class="scalable" type="button" id="<?= /* @noEscape */ $block->getHtmlId() ?>" data-mage-init='{"testConnection":{
88
"url": "<?= $block->escapeUrl($block->getAjaxUrl()) ?>",
9-
"elementId": "<?= $block->getHtmlId() ?>",
9+
"elementId": "<?= /* @noEscape */ $block->getHtmlId() ?>",
1010
"successText": "<?= $block->escapeHtmlAttr(__('Successful! Test again?')) ?>",
1111
"failedText": "<?= $block->escapeHtmlAttr(__('Connection failed! Test again?')) ?>",
1212
"fieldMapping": "<?= /* @noEscape */ $block->getFieldMapping() ?>"}, "validation": {}}'>
13-
<span id="<?= $block->getHtmlId() ?>_result"><?= $block->escapeHtml($block->getButtonLabel()) ?></span>
13+
<span id="<?= /* @noEscape */ $block->getHtmlId() ?>_result"><?= $block->escapeHtml($block->getButtonLabel()) ?></span>
1414
</button>

app/code/Magento/Authorizenet/view/adminhtml/templates/directpost/info.phtml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
4141
}">
4242
<option value=""><?= $block->escapeHtml(__('Please Select')) ?></option>
4343
<?php foreach ($block->getCcAvailableTypes() as $typeCode => $typeName) : ?>
44-
<option value="<?= $block->escapeHtml($typeCode) ?>"
44+
<option value="<?= $block->escapeHtmlAttr($typeCode) ?>"
4545
<?php if ($typeCode == $ccType) : ?>selected="selected"<?php endif; ?>>
4646
<?= $block->escapeHtml($typeName) ?>
4747
</option>
@@ -81,7 +81,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
8181
'validate-cc-exp':'#<?= /* @noEscape */ $code ?>_expiration_yr'
8282
}">
8383
<?php foreach ($block->getCcMonths() as $k => $v) : ?>
84-
<option value="<?= $block->escapeHtml($k) ?>"
84+
<option value="<?= $block->escapeHtmlAttr($k) ?>"
8585
<?php if ($k == $ccExpMonth) : ?>selected="selected"<?php endif; ?>>
8686
<?= $block->escapeHtml($v) ?>
8787
</option>
@@ -93,7 +93,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
9393
data-container="<?= /* @noEscape */ $code ?>-cc-year"
9494
data-validate="{required:true}">
9595
<?php foreach ($block->getCcYears() as $k => $v) : ?>
96-
<option value="<?= /* @noEscape */ $k ? $block->escapeHtml($k) : '' ?>"
96+
<option value="<?= /* @noEscape */ $k ? $block->escapeHtmlAttr($k) : '' ?>"
9797
<?php if ($k == $ccExpYear) : ?>selected="selected"<?php endif; ?>>
9898
<?= $block->escapeHtml($v) ?>
9999
</option>
@@ -113,7 +113,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
113113
<div class="admin__field-control">
114114
<input type="text"
115115
data-container="<?= /* @noEscape */ $code ?>-cc-cvv"
116-
title="<?= $block->escapeHtml(__('Card Verification Number')) ?>"
116+
title="<?= $block->escapeHtmlAttr(__('Card Verification Number')) ?>"
117117
class="admin__control-text cvv"
118118
id="<?= /* @noEscape */ $code ?>_cc_cid" name="payment[cc_cid]"
119119
value="<?= /* @noEscape */ $block->getInfoData('cc_cid') ?>"

app/code/Magento/AuthorizenetAcceptjs/view/adminhtml/templates/form/cc.phtml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
2323
class="required-entry validate-cc-type-select admin__control-select">
2424
<option value=""></option>
2525
<?php foreach ($block->getCcAvailableTypes() as $typeCode => $typeName) : ?>
26-
<option value="<?= $block->escapeHtml($typeCode) ?>" <?php if ($typeCode == $ccType) : ?>selected="selected"<?php endif ?>>
26+
<option value="<?= $block->escapeHtmlAttr($typeCode) ?>" <?php if ($typeCode == $ccType) : ?>selected="selected"<?php endif ?>>
2727
<?= $block->escapeHtml($typeName) ?>
2828
</option>
2929
<?php endforeach ?>
@@ -36,7 +36,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
3636
</label>
3737
<div class="admin__field-control">
3838
<input type="text" id="<?= /* @noEscape */ $code ?>_cc_number" name="payment[cc_number]"
39-
title="<?= $block->escapeHtml(__('Credit Card Number')) ?>" class="admin__control-text validate-cc-number"
39+
title="<?= $block->escapeHtmlAttr(__('Credit Card Number')) ?>" class="admin__control-text validate-cc-number"
4040
value="<?= /* @noEscape */ $block->getInfoData('cc_number') ?>"/>
4141
</div>
4242
</div>
@@ -48,7 +48,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
4848
<select id="<?= /* @noEscape */ $code ?>_cc_exp_month" name="payment[cc_exp_month]"
4949
class="admin__control-select admin__control-select-month validate-cc-exp required-entry">
5050
<?php foreach ($block->getCcMonths() as $k => $v) : ?>
51-
<option value="<?= $block->escapeHtml($k) ?>"
51+
<option value="<?= $block->escapeHtmlAttr($k) ?>"
5252
<?php if ($k == $ccExpMonth) : ?>selected="selected"<?php endif ?>>
5353
<?= $block->escapeHtml($v) ?>
5454
</option>
@@ -72,7 +72,7 @@ $ccExpYear = $block->getInfoData('cc_exp_year');
7272
<span><?= $block->escapeHtml(__('Card Verification Number')) ?></span>
7373
</label>
7474
<div class="admin__field-control">
75-
<input type="text" title="<?= $block->escapeHtml(__('Card Verification Number')) ?>"
75+
<input type="text" title="<?= $block->escapeHtmlAttr(__('Card Verification Number')) ?>"
7676
class="required-entry validate-cc-cvn admin__control-cvn admin__control-text"
7777
id="<?= /* @noEscape */ $code ?>_cc_cid"
7878
name="payment[cc_cid]" value="<?= /* @noEscape */ $block->getInfoData('cc_cid') ?>"/>

app/code/Magento/Backend/Block/Store/Switcher.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -592,7 +592,7 @@ public function getHintHtml()
592592
'What is this?'
593593
) . '"' . ' class="admin__field-tooltip-action action-help"><span>' . __(
594594
'What is this?'
595-
) . '</span></a></span>' . ' </div>';
595+
) . '</span></a>' . ' </div>';
596596
}
597597
return $html;
598598
}

app/code/Magento/Backend/Test/Mftf/Section/AdminMessagesSection.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,5 +14,13 @@
1414
<element name="error" type="text" selector="#messages div.message-error"/>
1515
<element name="notice" type="text" selector=".message.message-notice.notice"/>
1616
<element name="messageByType" type="text" selector="#messages div.message-{{messageType}}" parameterized="true" />
17+
<element name="warning" type="text" selector="#messages div.message-warning"/>
18+
<element name="accessDenied" type="text" selector=".access-denied-page"/>
19+
<!-- Deprecated elements, please do not use them. Use elements above-->
20+
<!-- Elements below are too common and catch non messages blocks. Ex: system messages blocks-->
21+
<element name="successMessage" type="text" selector=".message-success"/>
22+
<element name="errorMessage" type="text" selector=".message.message-error.error"/>
23+
<element name="warningMessage" type="text" selector=".message-warning"/>
24+
<element name="noticeMessage" type="text" selector=".message-notice"/>
1725
</section>
1826
</sections>

app/code/Magento/Backend/Test/Mftf/Test/AdminCheckLocaleAndDeveloperConfigInDeveloperModeTest.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
<test name="AdminCheckLocaleAndDeveloperConfigInDeveloperModeTest">
1212
<annotations>
1313
<features value="Backend"/>
14+
<stories value="Menu Navigation"/>
1415
<title value="Check locale dropdown and developer configuration page are available in developer mode"/>
1516
<description value="Check locale dropdown and developer configuration page are available in developer mode"/>
1617
<group value="backend"/>

0 commit comments

Comments
 (0)