Skip to content

Commit 8dbc880

Browse files
committed
Merge branch 'develop' of github.com:magento/magento2ce into pr-develop
2 parents cba3a76 + 492f0ca commit 8dbc880

File tree

123 files changed

+1760
-206
lines changed

Some content is hidden

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

123 files changed

+1760
-206
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/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/CatalogImportExport/Model/Export/Product.php

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -953,7 +953,7 @@ protected function collectRawData()
953953
if (is_scalar($attrValue)) {
954954
if (!in_array($fieldName, $this->_getExportMainAttrCodes())) {
955955
$additionalAttributes[$fieldName] = $fieldName .
956-
ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $attrValue;
956+
ImportProduct::PAIR_NAME_VALUE_SEPARATOR . $this->wrapValue($attrValue);
957957
}
958958
$data[$itemId][$storeId][$fieldName] = htmlspecialchars_decode($attrValue);
959959
}
@@ -963,7 +963,7 @@ protected function collectRawData()
963963
$additionalAttributes[$code] = $fieldName .
964964
ImportProduct::PAIR_NAME_VALUE_SEPARATOR . implode(
965965
ImportProduct::PSEUDO_MULTI_LINE_SEPARATOR,
966-
$this->collectedMultiselectsData[$storeId][$productLinkId][$code]
966+
$this->wrapValue($this->collectedMultiselectsData[$storeId][$productLinkId][$code])
967967
);
968968
}
969969
}
@@ -994,6 +994,25 @@ protected function collectRawData()
994994
return $data;
995995
}
996996

997+
/**
998+
* Wrap values with double quotes if "Fields Enclosure" option is enabled
999+
*
1000+
* @param string|array $value
1001+
* @return string|array
1002+
*/
1003+
private function wrapValue($value)
1004+
{
1005+
if (!empty($this->_parameters[\Magento\ImportExport\Model\Export::FIELDS_ENCLOSURE])) {
1006+
$wrap = function ($value) {
1007+
return sprintf('"%s"', str_replace('"', '""', $value));
1008+
};
1009+
1010+
$value = is_array($value) ? array_map($wrap, $value) : $wrap($value);
1011+
}
1012+
1013+
return $value;
1014+
}
1015+
9971016
/**
9981017
* @return array
9991018
*/

0 commit comments

Comments
 (0)