Skip to content

Commit cbc86b9

Browse files
committed
Merge remote-tracking branch 'perf/develop' into MAGETWO-56986
2 parents 3798bc9 + dbbf925 commit cbc86b9

File tree

125 files changed

+1687
-229
lines changed

Some content is hidden

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

125 files changed

+1687
-229
lines changed

app/code/Magento/Backend/etc/config.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111
<template>
1212
<minify_html>0</minify_html>
1313
</template>
14+
<static>
15+
<sign>1</sign>
16+
</static>
1417
</dev>
1518
<system>
1619
<media_storage_configuration>

app/code/Magento/Catalog/Controller/Adminhtml/Product/MassStatus.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,11 @@ public function execute()
8484
$productIds = $collection->getAllIds();
8585
$storeId = (int) $this->getRequest()->getParam('store', 0);
8686
$status = (int) $this->getRequest()->getParam('status');
87+
$filters = (array)$this->getRequest()->getParam('filters', []);
88+
89+
if (isset($filters['store_id'])) {
90+
$storeId = (int)$filters['store_id'];
91+
}
8792

8893
try {
8994
$this->_validateMassStatus($productIds, $status);

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/Initialization/HelperTest.php

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -278,15 +278,19 @@ public function testInitialize()
278278
->method('getOptionsReadOnly')
279279
->willReturn(false);
280280

281+
$firstExpectedCustomOption = clone $this->customOptionMock;
282+
$firstExpectedCustomOption->setData($optionsData['option2']);
283+
$secondExpectedCustomOption = clone $this->customOptionMock;
284+
$secondExpectedCustomOption->setData($optionsData['option3']);
281285
$this->customOptionFactoryMock->expects($this->any())
282286
->method('create')
283287
->willReturnMap([
284288
[
285289
['data' => $optionsData['option2']],
286-
(clone $this->customOptionMock)->setData($optionsData['option2'])
290+
$firstExpectedCustomOption
287291
], [
288292
['data' => $optionsData['option3']],
289-
(clone $this->customOptionMock)->setData($optionsData['option3'])
293+
$secondExpectedCustomOption
290294
]
291295
]);
292296

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/Product/MassStatusTest.php

Lines changed: 102 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,32 +6,74 @@
66
*/
77
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml\Product;
88

9+
use Magento\Ui\Component\MassAction\Filter;
10+
use Magento\Backend\Model\View\Result\Redirect;
11+
use Magento\Catalog\Model\Indexer\Product\Price\Processor;
12+
use Magento\Catalog\Controller\Adminhtml\Product\Builder;
13+
use Magento\Framework\Data\Collection\AbstractDb;
14+
use Magento\Catalog\Model\Product\Action;
15+
16+
/**
17+
* Class MassStatusTest
18+
*
19+
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
20+
*/
921
class MassStatusTest extends \Magento\Catalog\Test\Unit\Controller\Adminhtml\ProductTest
1022
{
1123
/**
12-
* @var \PHPUnit_Framework_MockObject_MockObject
24+
* @var Processor|\PHPUnit_Framework_MockObject_MockObject
1325
*/
14-
protected $priceProcessor;
26+
private $priceProcessorMock;
1527

16-
/** @var \PHPUnit_Framework_MockObject_MockObject|\Magento\Backend\Model\View\Result\Redirect */
17-
protected $resultRedirect;
28+
/**
29+
* @var Redirect|\PHPUnit_Framework_MockObject_MockObject
30+
*/
31+
private $resultRedirectMock;
32+
33+
/**
34+
* @var Filter|\PHPUnit_Framework_MockObject_MockObject
35+
*/
36+
private $filterMock;
37+
38+
/**
39+
* @var Builder|\PHPUnit_Framework_MockObject_MockObject
40+
*/
41+
private $productBuilderMock;
42+
43+
/**
44+
* @var AbstractDb|\PHPUnit_Framework_MockObject_MockObject
45+
*/
46+
private $abstractDbMock;
47+
48+
/**
49+
* @var Action|\PHPUnit_Framework_MockObject_MockObject
50+
*/
51+
private $actionMock;
1852

1953
protected function setUp()
2054
{
21-
$this->priceProcessor = $this->getMockBuilder(\Magento\Catalog\Model\Indexer\Product\Price\Processor::class)
55+
$this->priceProcessorMock = $this->getMockBuilder(Processor::class)
2256
->disableOriginalConstructor()->getMock();
57+
$this->productBuilderMock = $this->getMockBuilder(Builder::class)
58+
->setMethods(['build'])
59+
->disableOriginalConstructor()
60+
->getMock();
2361

24-
$productBuilder = $this->getMockBuilder(
25-
\Magento\Catalog\Controller\Adminhtml\Product\Builder::class
26-
)->setMethods(['build'])->disableOriginalConstructor()->getMock();
27-
28-
$product = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)->disableOriginalConstructor()
29-
->setMethods(['getTypeId', 'getStoreId', '__sleep', '__wakeup'])->getMock();
30-
$product->expects($this->any())->method('getTypeId')->will($this->returnValue('simple'));
31-
$product->expects($this->any())->method('getStoreId')->will($this->returnValue('1'));
32-
$productBuilder->expects($this->any())->method('build')->will($this->returnValue($product));
62+
$productMock = $this->getMockBuilder(\Magento\Catalog\Model\Product::class)
63+
->disableOriginalConstructor()
64+
->setMethods(['getTypeId', 'getStoreId', '__sleep', '__wakeup'])
65+
->getMock();
66+
$productMock->expects($this->any())
67+
->method('getTypeId')
68+
->willReturn('simple');
69+
$productMock->expects($this->any())
70+
->method('getStoreId')
71+
->willReturn('1');
72+
$this->productBuilderMock->expects($this->any())
73+
->method('build')
74+
->willReturn($productMock);
3375

34-
$this->resultRedirect = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Redirect::class)
76+
$this->resultRedirectMock = $this->getMockBuilder(\Magento\Backend\Model\View\Result\Redirect::class)
3577
->disableOriginalConstructor()
3678
->getMock();
3779
$resultFactory = $this->getMockBuilder(\Magento\Framework\Controller\ResultFactory::class)
@@ -41,47 +83,71 @@ protected function setUp()
4183
$resultFactory->expects($this->atLeastOnce())
4284
->method('create')
4385
->with(\Magento\Framework\Controller\ResultFactory::TYPE_REDIRECT)
44-
->willReturn($this->resultRedirect);
86+
->willReturn($this->resultRedirectMock);
4587

46-
$abstractDbMock = $this->getMockBuilder(\Magento\Framework\Data\Collection\AbstractDb::class)
88+
$this->abstractDbMock = $this->getMockBuilder(AbstractDb::class)
4789
->disableOriginalConstructor()
4890
->setMethods(['getAllIds', 'getResource'])
4991
->getMock();
50-
$abstractDbMock->expects($this->any())
51-
->method('getAllIds')
52-
->willReturn([]);
53-
54-
$filterMock = $this->getMockBuilder(\Magento\Ui\Component\MassAction\Filter::class)
92+
$this->filterMock = $this->getMockBuilder(\Magento\Ui\Component\MassAction\Filter::class)
5593
->disableOriginalConstructor()
5694
->setMethods(['getCollection'])
5795
->getMock();
58-
$filterMock->expects($this->any())
59-
->method('getCollection')
60-
->willReturn($abstractDbMock);
61-
62-
$collectionFactoryMock = $this->getMockBuilder(
63-
\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory::class
64-
)
96+
$this->actionMock = $this->getMockBuilder(Action::class)
97+
->disableOriginalConstructor()
98+
->getMock();
99+
100+
$collectionFactoryMock =
101+
$this->getMockBuilder(\Magento\Catalog\Model\ResourceModel\Product\CollectionFactory::class)
65102
->disableOriginalConstructor()
66103
->setMethods(['create'])
67104
->getMock();
68105
$collectionFactoryMock->expects($this->any())
69106
->method('create')
70-
->willReturn($abstractDbMock);
107+
->willReturn($this->abstractDbMock);
108+
109+
$additionalParams = [
110+
'resultFactory' => $resultFactory
111+
];
112+
/** @var \Magento\Backend\App\Action\Context $context */
113+
$context = $this->initContext($additionalParams, [[Action::class, $this->actionMock]]);
71114

72-
$additionalParams = ['resultFactory' => $resultFactory];
73115
$this->action = new \Magento\Catalog\Controller\Adminhtml\Product\MassStatus(
74-
$this->initContext($additionalParams),
75-
$productBuilder,
76-
$this->priceProcessor,
77-
$filterMock,
116+
$context,
117+
$this->productBuilderMock,
118+
$this->priceProcessorMock,
119+
$this->filterMock,
78120
$collectionFactoryMock
79121
);
80122
}
81123

82124
public function testMassStatusAction()
83125
{
84-
$this->priceProcessor->expects($this->once())->method('reindexList');
126+
$storeId = 1;
127+
$status = \Magento\Catalog\Model\Product\Attribute\Source\Status::STATUS_DISABLED;
128+
$filters = [
129+
'store_id' => 2,
130+
];
131+
132+
$this->filterMock->expects($this->once())
133+
->method('getCollection')
134+
->willReturn($this->abstractDbMock);
135+
$this->abstractDbMock->expects($this->once())
136+
->method('getAllIds')
137+
->willReturn([3]);
138+
$this->request->expects($this->exactly(3))
139+
->method('getParam')
140+
->willReturnMap([
141+
['store', 0, $storeId],
142+
['status', null, $status],
143+
['filters', [], $filters]
144+
]);
145+
$this->actionMock->expects($this->once())
146+
->method('updateAttributes')
147+
->with([3], ['status' => $status], 2);
148+
$this->priceProcessorMock->expects($this->once())
149+
->method('reindexList');
150+
85151
$this->action->execute();
86152
}
87153
}

app/code/Magento/Catalog/Test/Unit/Controller/Adminhtml/ProductTest.php

Lines changed: 22 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
*/
66
namespace Magento\Catalog\Test\Unit\Controller\Adminhtml;
77

8+
use Magento\Catalog\Api\Data\ProductInterface;
9+
810
/**
911
* @SuppressWarnings(PHPMD.CouplingBetweenObjects)
1012
*/
@@ -25,17 +27,33 @@ abstract class ProductTest extends \PHPUnit_Framework_TestCase
2527
/** @var \Magento\Framework\App\Request\Http|\PHPUnit_Framework_MockObject_MockObject */
2628
protected $request;
2729

30+
/**
31+
* @var \Magento\Framework\ObjectManagerInterface|\PHPUnit_Framework_MockObject_MockObject
32+
*/
33+
private $objectManagerMock;
34+
2835
/**
2936
* Init context object
3037
*
3138
* @param array $additionalParams
39+
* @param array $objectManagerMap Object Manager mappings
3240
* @return \PHPUnit_Framework_MockObject_MockObject
3341
*/
34-
protected function initContext(array $additionalParams = [])
42+
protected function initContext(array $additionalParams = [], array $objectManagerMap = [])
3543
{
3644
$productActionMock = $this->getMock(\Magento\Catalog\Model\Product\Action::class, [], [], '', false);
37-
$objectManagerMock = $this->getMockForAbstractClass(\Magento\Framework\ObjectManagerInterface::class);
38-
$objectManagerMock->expects($this->any())->method('get')->will($this->returnValue($productActionMock));
45+
46+
$this->objectManagerMock = $this->getMockForAbstractClass(\Magento\Framework\ObjectManagerInterface::class);
47+
48+
if ($objectManagerMap) {
49+
$this->objectManagerMock->expects($this->any())
50+
->method('get')
51+
->willReturnMap($objectManagerMap);
52+
}
53+
54+
$this->objectManagerMock->expects($this->any())
55+
->method('get')
56+
->willReturn($productActionMock);
3957

4058
$block = $this->getMockBuilder(\Magento\Framework\View\Element\AbstractBlock::class)
4159
->disableOriginalConstructor()->getMockForAbstractClass();
@@ -93,7 +111,7 @@ protected function initContext(array $additionalParams = [])
93111
$this->context->expects($this->any())->method('getEventManager')->will($this->returnValue($eventManager));
94112
$this->context->expects($this->any())->method('getRequest')->will($this->returnValue($requestInterfaceMock));
95113
$this->context->expects($this->any())->method('getResponse')->will($this->returnValue($responseInterfaceMock));
96-
$this->context->expects($this->any())->method('getObjectManager')->will($this->returnValue($objectManagerMock));
114+
$this->context->expects($this->any())->method('getObjectManager')->willReturn($this->objectManagerMock);
97115

98116
$this->context->expects($this->any())->method('getMessageManager')
99117
->will($this->returnValue($managerInterfaceMock));

app/code/Magento/Catalog/Test/Unit/Model/Indexer/Product/Flat/FlatTableBuilderTest.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ public function testBuild()
141141
[$tableName],
142142
['catalog_product_website']
143143
)
144-
->willReturn(
144+
->willReturnOnConsecutiveCalls(
145145
$tableName,
146146
'catalog_product_website'
147147
);
@@ -184,12 +184,12 @@ public function testBuild()
184184
],
185185
[
186186
$temporaryTableName,
187-
"e.{$linkField} = ${temporaryTableName}.{$linkField}",
187+
"e.{$linkField} = {$temporaryTableName}.{$linkField}",
188188
[$linkField]
189189
],
190190
[
191191
$temporaryValueTableName,
192-
"e.${linkField} = " . $temporaryValueTableName . ".${linkField}",
192+
"e.{$linkField} = " . $temporaryValueTableName . ".{$linkField}",
193193
[$linkField]
194194
]
195195
)->willReturnSelf();

app/code/Magento/CatalogInventory/Helper/Stock.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,10 @@ public function addIsInStockFilterToCollection($collection)
154154
\Magento\Store\Model\ScopeInterface::SCOPE_STORE
155155
);
156156
$resource = $this->getStockStatusResource();
157-
$resource->addStockDataToCollection($collection, !$isShowOutOfStock);
157+
$resource->addStockDataToCollection(
158+
$collection,
159+
!$isShowOutOfStock && $collection->getFlag('require_stock_items')
160+
);
158161
$collection->setFlag($stockFlag, true);
159162
}
160163
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
/**
3+
* Copyright © 2016 Magento. All rights reserved.
4+
* See COPYING.txt for license details.
5+
*/
6+
7+
namespace Magento\Indexer\Setup;
8+
9+
use Magento\Framework\Setup\InstallDataInterface;
10+
use Magento\Framework\Setup\ModuleContextInterface;
11+
use Magento\Framework\Setup\ModuleDataSetupInterface;
12+
use Magento\Indexer\Model\IndexerFactory;
13+
use Magento\Framework\Indexer\ConfigInterface;
14+
15+
/**
16+
* Recurring data upgrade for indexer module
17+
*/
18+
class RecurringData implements InstallDataInterface
19+
{
20+
/**
21+
* @var IndexerFactory
22+
*/
23+
private $indexerFactory;
24+
25+
/**
26+
* @var ConfigInterface
27+
*/
28+
private $configInterface;
29+
30+
/**
31+
* RecurringData constructor.
32+
*
33+
* @param IndexerFactory $indexerFactory
34+
* @param ConfigInterface $configInterface
35+
*/
36+
public function __construct(
37+
IndexerFactory $indexerFactory,
38+
ConfigInterface $configInterface
39+
) {
40+
$this->indexerFactory = $indexerFactory;
41+
$this->configInterface = $configInterface;
42+
}
43+
44+
/**
45+
* {@inheritdoc}
46+
*/
47+
public function install(ModuleDataSetupInterface $setup, ModuleContextInterface $context)
48+
{
49+
foreach (array_keys($this->configInterface->getIndexers()) as $indexerId) {
50+
$indexer = $this->indexerFactory->create()->load($indexerId);
51+
if ($indexer->isScheduled()) {
52+
$indexer->getView()->unsubscribe()->subscribe();
53+
}
54+
}
55+
}
56+
}

app/code/Magento/Rule/Model/Condition/Product/AbstractProduct.php

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -602,7 +602,9 @@ public function getBindArgumentValue()
602602
*/
603603
public function getMappedSqlField()
604604
{
605-
if (!$this->isAttributeSetOrCategory()) {
605+
if ($this->getAttribute() == 'sku') {
606+
$mappedSqlField = 'e.sku';
607+
} elseif (!$this->isAttributeSetOrCategory()) {
606608
$mappedSqlField = $this->getEavAttributeTableAlias() . '.value';
607609
} elseif ($this->getAttribute() == 'category_ids') {
608610
$mappedSqlField = 'e.entity_id';

app/code/Magento/Ui/view/base/web/js/grid/data-storage.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ define([
7979
getData: function (params, options) {
8080
var cachedRequest = this.getRequest(params);
8181

82+
if (params && params.filters && params.filters['store_id']) {
83+
cachedRequest = false;
84+
}
85+
8286
options = options || {};
8387

8488
return !options.refresh && cachedRequest ?

0 commit comments

Comments
 (0)